{"version":3,"sources":["application/shared/PlenumDataSupply.ts","components/api-authorization/ApiAuthorizationConstants.js","components/api-authorization/AuthorizeService.js","components/api-authorization/LoginMenu.js","image/burgerhout.png","components/NavMenu.js","application/project/api/Connection.ts","components/api-authorization/bearerToken.ts","application/project/api/InstallationPlan.ts","application/project/redux/adapters/valveConnectionAdapter.ts","application/project/redux/adapters/eppDataAdapter.ts","application/project/redux/adapters/eppDataComponentAdapter.ts","application/project/redux/adapters/plenumConnectionAdapter.ts","application/project/redux/adapters/plenumDataAdapter.ts","application/project/redux/adapters/projectArticleAdapter.ts","application/project/redux/adapters/projectExtraComponentAdapter.ts","application/project/redux/adapters/sectionAdapter.ts","application/project/redux/adapters/sectionBendAdapter.ts","redux/shared.ts","application/project/redux/projectState.ts","application/project/redux/thunks/AsyncConnection.ts","application/components/redux/adapters/bendAdapter.ts","application/project/redux/thunks/helper/GetApiConnection.ts","application/components/redux/adapters/valveConnectorGridAdapter.ts","application/components/redux/adapters/ductAdapter.ts","application/project/validate/bordersDebiet.ts","application/components/redux/adapters/plenumAdapter.ts","application/project/validate/getApiSectionError.ts","application/project/validate/getApiPlenumConnectionError.ts","application/project/validate/getApiValveConnectionError.ts","application/project/redux/thunks/AsyncConnectionUpdate.ts","application/project/api/EppData.ts","application/project/redux/selectors/eppdataComponentSelectors.tsx","application/project/redux/selectors/eppdataSelectors.tsx","application/project/redux/thunks/AsyncEppData.ts","application/project/api/EppDataComponent.ts","application/project/redux/thunks/AsyncEppDataComponent.ts","application/project/api/PlenumData.ts","application/project/redux/thunks/AsyncPlenumData.ts","application/project/api/ProjectArticle.ts","application/project/redux/thunks/AsyncProjectArticle.ts","application/common/redux/commonState.ts","application/project/api/ProjectExtraComponent.ts","application/project/redux/thunks/AsyncProjectExtraComponent.ts","application/project/redux/projectSlice.ts","application/components/redux/adapters/ductAdapterAdapter.ts","application/components/redux/adapters/eppColorAdapter.ts","application/components/redux/adapters/eppTerminalTypeAdapter.ts","application/components/redux/adapters/eppDiameterAdapter.ts","application/components/redux/adapters/eppMaterialAdapter.ts","application/components/redux/adapters/eppTerminalAdapter.ts","application/components/redux/adapters/eppComponentAdapter.ts","application/components/redux/adapters/eppTypeAdapter.ts","application/components/redux/adapters/extraComponentAdapter.ts","application/components/redux/adapters/eppDamperAdapter.ts","application/components/redux/adapters/eppDamperTypeAdapter.ts","application/components/redux/componentState.ts","application/components/api/Bend.ts","application/components/redux/thunks/fetchAsyncBends.ts","application/components/api/DuctAdapter.ts","application/components/redux/thunks/fetchAsyncDuctAdapters.ts","application/components/api/Duct.ts","application/components/redux/thunks/fetchAsyncDucts.ts","application/components/api/EppColor.ts","application/components/redux/thunks/fetchAsyncEppColors.ts","application/components/api/EppComponent.ts","application/components/redux/thunks/fetchAsyncEppComponents.ts","application/components/api/EppDiameter.ts","application/components/redux/thunks/fetchAsyncEppDiameters.ts","application/components/api/EppMaterial.ts","application/components/redux/thunks/fetchAsyncEppMaterials.ts","application/components/api/EppTerminal.ts","application/components/redux/thunks/fetchAsyncEppTerminals.ts","application/components/api/EppTerminalType.ts","application/components/redux/thunks/fetchAsyncEppTerminalTypes.ts","application/components/api/EppType.ts","application/components/redux/thunks/fetchAsyncEppTypes.ts","application/components/api/ExtraComponent.ts","application/components/redux/thunks/fetchAsyncExtraComponents.ts","application/components/api/Plenum.ts","application/components/redux/thunks/fetchAsyncPlenums.ts","application/components/api/ValveConnectorGrid.ts","application/components/redux/thunks/fetchAsyncValveConnectorGrids.ts","application/components/api/EppDamper.ts","application/components/redux/thunks/fetchAsyncEppDamper.ts","application/components/api/EppDamperTerminal.ts","application/components/redux/thunks/fetchAsyncEppDamperTypes.ts","application/components/redux/componentSlice.ts","application/project/api/Project.ts","application/common/redux/commonSlice.ts","application/editcomp/redux/adapters/valveConnectorEditAdapter.ts","application/editcomp/redux/adapters/valveConnectorGridEditAdapter.ts","application/editcomp/redux/adapters/valveGridEditAdapter.ts","application/editcomp/redux/editcompState.ts","application/editcomp/api/ValveConnectorGrid/ValveConnectorGridEdit.ts","application/editcomp/redux/thunks/fetchAsyncValveConnectorGridsEdit.ts","application/editcomp/redux/thunks/fetchAsyncValveConnectorsEdit.ts","application/editcomp/api/ValveConnectorGrid/ValveGridEdit.ts","application/editcomp/redux/thunks/fetchAsyncValveGridsEdit.ts","application/editcomp/redux/editcompSlice.ts","redux/store.ts","application/project/redux/selectors/projectArticleSelectors.tsx","application/project/redux/selectors/projectSelector.tsx","application/shared/styles.ts","components/controls/ActionButton.tsx","components/controls/PageTitle.tsx","components/controls/EditorPage.tsx","application/shared/format.ts","components/controls/TextInputField.tsx","application/project/view/Edit/ComponentList/ComponentList.tsx","components/controls/RadioSelector.tsx","application/components/redux/selectors/eppTypeSelector.tsx","components/controls/NumberInputField.tsx","components/controls/AmountInputField.tsx","application/project/view/Edit/EppDataEdit/EppComponent.tsx","application/components/api/Image.ts","application/components/redux/selectors/eppColorSelector.tsx","application/components/redux/selectors/eppComponentSelector.tsx","application/components/redux/selectors/eppDiameterSelector.tsx","application/components/redux/selectors/eppMaterialSelector.tsx","application/components/redux/selectors/eppTerminalSelector.tsx","application/components/redux/selectors/eppTerminalTypeSelector.tsx","application/components/redux/selectors/eppDamperTypeSelector.tsx","application/components/redux/selectors/eppDamperSelector.tsx","application/project/view/Edit/EppDataEdit/useEppData.ts","application/project/view/Edit/EppDataEdit/ExtraResistant.tsx","application/project/view/Edit/EppDataEdit/EppDataEdit.tsx","components/dialog/BaseDialog.tsx","application/project/view/Edit/ExtraComponents/ProjectExtraComponent.tsx","application/components/redux/selectors/extraComponentSelector.tsx","application/project/redux/selectors/projectExtraComponentSelectors.tsx","application/project/view/Edit/ExtraComponents/ExtraComponents.tsx","application/project/view/Edit/ExtraComponents/useExtraComponents.ts","application/project/view/Edit/InstallationPlan/InstallationPlan.tsx","application/components/redux/selectors/plenumSelector.tsx","application/project/redux/selectors/plenumdataSelectors.tsx","components/dialog/InfoDialog.tsx","application/components/redux/selectors/ductSelector.tsx","components/dialog/useInfoDialog.ts","components/controls/useFlowRate.tsx","application/project/view/Edit/PlenumSelector/PlenumItem.tsx","application/project/view/Edit/PlenumSelector/PlenumSelector.tsx","application/project/view/Edit/ProjectSettings/DuctTypeSelector.tsx","application/project/view/Edit/ProjectSettings/VentilationSystemSelector.tsx","image/settings/rond.png","image/settings/ovaal.png","image/settings/balans.png","image/settings/extract.png","application/project/view/Edit/editorStyles.ts","components/controls/DateInputField.tsx","application/project/view/Edit/ProjectSettings/ValveDiameterSelector.tsx","application/components/redux/selectors/bendSelector.tsx","application/project/view/Edit/ProjectSettings/FlowUnitSelector.tsx","components/controls/CheckBoxer.tsx","application/project/view/Edit/ProjectSettings/ProjectSettings.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/controls/connectionStyles.ts","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/PartDescription.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/controls/DebietInputField.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/PartDebiet.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/controls/LengthInputField.tsx","application/components/redux/selectors/ductAdapterSelector.tsx","application/project/redux/selectors/sectionSelectors.tsx","components/controls/Selector.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/controls/DuctSelect.tsx","application/project/redux/thunks/SetSectionValue.ts","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/PartDuctAndLength.tsx","application/project/redux/selectors/sectionBendSelectors.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/PartDuctElbow.tsx","application/project/redux/thunks/SetBendBendValue.ts","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/PartDuctElbows.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/PartAdapter.tsx","application/components/redux/selectors/valveConnectorGridSelector.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/controls/CheckBoxSelect.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/PartValve.tsx","application/shared/useWindowSize.ts","application/project/view/Edit/RoomEditor/ConnectionEditor/RenderParts.tsx","application/project/redux/selectors/plenumConnectionSelectors.tsx","application/project/redux/selectors/connectionSelectors.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/controls/NumberSelectRestrictor.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/PartPlenumConnection.tsx","application/project/redux/thunks/SetPlenumConnectionValue.ts","application/project/view/Edit/RoomEditor/ConnectionEditor/parts/PartPlenumConnections.tsx","application/project/view/Edit/RoomEditor/ConnectionEditor/useConnectionFlowLimits.ts","application/project/view/Edit/RoomEditor/ConnectionEditor/ConnectionEdit.tsx","application/project/redux/thunks/ValveConnectionSetValue.ts","application/project/redux/thunks/ValveConnectionDelete.ts","application/project/validate/getValveConnectionError.ts","application/project/view/Edit/RoomEditor/ConnectionEditor/useConnectionValid.ts","application/project/view/Edit/RoomEditor/RoomEditor.tsx","application/project/redux/thunks/ValveConnectionAdd.ts","image/menu/Icon-Additional components.svg","image/menu/Icon-Air extraction.svg","image/menu/Icon-Air supply.svg","image/menu/Icon-Component list.svg","image/menu/Icon-Installation list.svg","image/menu/Icon-Project settings.svg","image/menu/Icon-Start project.svg","image/overview/A1.png","image/overview/A2.png","image/overview/A3.png","image/overview/A4.png","image/overview/A5.png","image/overview/A6.png","image/overview/A7.png","image/overview/A9.png","image/overview/B1.png","image/overview/B2.png","image/overview/B3.png","image/overview/B5.png","application/project/view/Edit/EditorGrid/useRoutes.tsx","components/Layout.tsx","components/api-authorization/AuthorizeRoute.js","components/api-authorization/Login.js","components/api-authorization/Logout.js","components/api-authorization/ApiAuthorizationRoutes.js","application/project/redux/thunks/AsyncProject.ts","application/project/view/setters/SetActiveProject.tsx","application/project/view/Edit/EditorGrid/styles.ts","application/project/view/Edit/EditorGrid/ApplicationBar.tsx","application/project/view/Edit/EditorGrid/EditorSwitch.tsx","application/project/view/Edit/Editor.tsx","application/project/redux/thunks/AsyncInitEditor.ts","image/packshot.jpg","image/headervision.jpg","components/controls/HomeUL.tsx","i18next/i18n.js","components/Home.tsx","application/HomeWrapper.js","i18next/languages.ts","application/editcomp/views/controls/input/GridInput.tsx","application/common/redux/thunks/setLanguage.ts","components/controls/RegularPage.tsx","application/editcomp/views/controls/hooks/useGridStateData.ts","application/project/view/List/useEditProject.ts","application/editcomp/views/controls/hooks/useKeyboardNavigation.ts","application/editcomp/views/controls/table/tableStyles.tsx","application/editcomp/views/controls/table/Td.tsx","application/editcomp/views/controls/table/GridInputTd.tsx","application/editcomp/views/controls/table/properties/RowProp.ts","application/editcomp/views/controls/table/properties/ColumnProp.ts","application/editcomp/views/controls/table/properties/TableProp.ts","application/editcomp/views/controls/table/properties/useTableProps.ts","application/editcomp/views/controls/table/Table.tsx","application/editcomp/views/controls/hooks/useObserver.ts","application/editcomp/views/controls/table/Th.tsx","application/editcomp/views/Settings/table/RenderRow.ts","application/editcomp/views/Settings/table/SettingsGridTable.tsx","application/editcomp/api/Settings.ts","application/editcomp/views/Settings/useSettingsGridData.ts","application/editcomp/views/Settings/Settings.tsx","application/editcomp/views/ValveConnectorGrid/table/RenderRow.ts","application/editcomp/views/ValveConnectorGrid/table/ConnectorGridImage.tsx","application/editcomp/views/ValveConnectorGrid/table/ValveGridCell.tsx","application/editcomp/views/ValveConnectorGrid/table/ValveConnectorGridTable.tsx","application/editcomp/api/ValveConnectorGrid/ValveConnectorEdit.ts","application/editcomp/views/ValveConnectorGrid/useValveConnectorGridData.ts","application/editcomp/views/SelectEditComponent/MenuKeuzes.tsx","application/editcomp/views/ValveConnectorGrid/ValveConnectorGrid.tsx","application/editcomp/views/SelectEditComponent/SelectEditComponent.tsx","application/editcomp/views/EditComponentRoutes.tsx","application/project/view/List/EditProject.tsx","application/project/view/List/ProjectItem.tsx","components/dialog/useEditDialog.ts","components/dialog/EditDialog.tsx","components/dialog/useConfirmDialog.ts","components/dialog/ConfirmDialog.tsx","application/project/view/List/ProjectList.tsx","App.tsx","index.js"],"names":["PlenumDataSupply","PlenumDataInside","enValveConnectorConnection","ApplicationName","QueryParameterNames","LogoutActions","LoginActions","prefix","ApplicationPaths","DefaultLoginRedirectPath","ApiAuthorizationClientConfigurationUrl","ApiAuthorizationPrefix","Login","LoginFailed","LoginCallback","Register","Profile","LogOut","LoggedOut","LogOutCallback","IdentityRegisterPath","IdentityManagePath","AuthorizeService","_callbacks","_nextSubscriptionId","_user","_isAuthenticated","_popUpDisabled","a","this","getUser","user","profile","ensureUserManagerInitialized","userManager","role","access_token","state","signinSilent","createArguments","silentUser","updateState","success","console","log","Error","signinPopup","popUpUser","message","error","signinRedirect","redirect","url","signinCallback","signoutPopup","undefined","signoutRedirect","signoutCallback","response","data","notifySubscribers","callback","push","subscription","subscriptionId","subscriptionIndex","map","element","index","found","filter","length","splice","i","useReplaceToNavigate","status","AuthenticationResultStatus","Fail","Success","Redirect","fetch","ok","json","settings","automaticSilentRenew","includeIdTokenInSilentRenew","userStore","WebStorageStateStore","UserManager","events","addUserSignedOut","removeUser","authService","LanguageSelectNavItem","props","React","useState","currentLanguage","language","setLanguage","useEffect","NavItem","className","onChange","e","lang","currentTarget","value","onChangeLanguage","languages","toUpperCase","LoginMenuTranslated","isAuthenticated","userName","contactName","newsLetter","roles","_subscription","subscribe","populateState","unsubscribe","Promise","all","setState","name","profilePath","logoutPath","pathname","local","authenticatedView","registerPath","loginPath","anonymousView","t","NavLink","tag","Link","to","includes","Component","LoginMenu","withTranslation","NavMenu","toggleNavbar","bind","collapsed","clsx","homePage","Container","href","src","mainLogo","alt","Navbar","light","NavbarToggler","onClick","displayName","ConnectionDirty","bearerTokenHeader","getAccessToken","token","axios","defaults","headers","common","Authorization","params","lng","i18n","TestenAuthService","getRawUser","getInstallationPlanHtml","guid","config","get","getInstallationCalcultionHtml","getInstallationPlanPdf","responseType","content","download","getInstallationPlanXlsx","getConnections","updateConnection","connection","post","valveConnectionAdapter","createEntityAdapter","selectId","valveConnectionKey","GetEppDataID","supply","inside","eppDataAdapter","project","eppDataComponentAdapter","eppDataComponentID","plenumConnectionKeyIntern","indexNumber","join","plenumConnectionKey","plenumConnectionAdapter","sortComparer","b","res","localeCompare","plenumDataAdapter","projectArticleAdapter","projectArticleID","projectExtraComponentAdapter","projectExtraComponentID","sectionKeyIntern","plenumConnectionIndex","sectionKey","section","sectionAdapter","sectionBendKeyIntern","bendID","sectionBendAdapter","sectionIndex","initialLoadingEntityState","loading","saving","initialComponentEntityState","initialState","projects","activeProject","connectionKeyCounter","plenumdatas","getInitialState","valveConnections","plenumConnections","sections","sectionbends","eppdatas","eppdatacomponents","projectArticles","valid","projectExtraComponents","fetchAsyncConnections","createAsyncThunk","thunkAPI","bendAdapter","GetApiConnection","valveConnection","projectState","componentState","getSelectors","selectAll","plenumConnection","bends","amount","bend","selectById","ductID","valveConnectorGridAdapter","valveConnectorGridID","ductAdapter","maxFlowValue","CovertValue","getDebietBorders","dual","ducts","valveConnectorGrid","ductMax","reduce","val","duct","Math","min","flowSupplyMax","flowExtractionMax","ductWarn","flowSupplyWarn","flowExtractionWarn","ductMin","max","flowSupplyMin","flowExtractionMin","valveMax","supplyFlowMax","extractionFlowMax","valveMaxDuplex","supplyFlowMaxDuplex","extractionFlowMaxDuplex","valveWarn","supplyFlowWarn","extractionFlowWarn","valveWarnDuplex","supplyFlowWarnDuplex","extractionFlowWarnDuplex","plenumAdapter","plenumID","getApiSectionError","ductLenght","prev","sectionbend","getApiPlenumConnectionError","plenumData","numberConnections","plenums","connectionIndex","getApiValveConnectionError","experimental","description","airflowRate","sumAirflowRate","debiet","con","plenum","maxFlowRate","ductIDs","Set","valveConnectorGrids","lenghtValid","lenght","forEach","has","updateAsyncConnection","apiConnection","connections","updateConnectionThunk","dispatch","getState","selectProjectState","selectComponentState","getEppDatas","updateEppData","eppdata","put","selectAllEppDataComponents","makeSelectEppDataComponentsByDirection","selectEntities","createSelector","eppdatacomponent","selectAllEppDatas","selectEppDataBySupplyInside","fetchAsyncEppDatas","updateAsyncEppDatas","getEppDataComponents","getEppDataComponent","EppDataComponentID","updateEppDataComponent","fetchAsyncEppDataComponents","updateAsyncEppDataComponent","EppDataComponent","getPlenumDatas","updatePlenumData","plenumdata","fetchAsyncPlenumDatas","updateAsyncPlenumDatas","getProjectArticles","timeout","ms","resolve","setTimeout","RoleName","fetchAsyncProjectArticles","delay","getProjectExtraComponents","getProjectExtraComponent","updateProjectExtraComponent","projectExtraComponent","fetchAsyncProjectExtraComponents","updateAsyncProjectExtraComponent","apiSection2redux","apiSection","upsertOne","apiSectionBend","sectionBend","apiSectionBend2redux","apiValveConnection2redux","currentItem","find","valveConnectionID","dirty","saved","updateOne","id","changes","toString","addOne","apiPlenumConnection","apiPlenumConnection2redux","projectSlice","createSlice","reducers","activeProjectChanged","action","payload","removeAll","setActiveConnection","activeConnectionKey","LanguageChanged","updateSectionBend","updateSection","item","ductAdapterID","indexOf","removeMany","updatePlenumConnection","addValveConnection","customValveResistance","remove","hasFilter","finalAirflowRate","connectorRightAngled","restriction","deleteValveConnection","removeOne","updateValveConnection","extraReducers","builder","addCase","pending","fulfilled","setAll","meta","arg","changedItem","remoteEppDataComponents","eppDataComponents","eppDataComponentIDs","addMany","ductAdapterAdapter","eppColorAdapter","eppColorID","eppTerminalTypeAdapter","eppTerminalTypeID","eppDiameterAdapter","eppDiameterID","eppMaterialAdapter","eppMaterialID","eppTerminalAdapter","eppTerminalID","eppComponentAdapter","eppComponentID","eppTypeAdapter","eppTypeID","extraComponentAdapter","extraComponentID","eppDamperAdapter","eppDamperID","eppDamperTypeID","eppDamperTypeAdapter","ductadapters","eppColors","eppComponents","eppDiameters","eppMaterials","eppTerminalTypes","eppTerminals","eppDamperTypes","eppDampers","eppTypes","extraComponents","getBends","fetchAsyncBends","condition","getDuctAdapters","fetchAsyncDuctAdapters","getDucts","fetchAsyncDucts","getEppColors","fetchAsyncEppColors","getEppComponents","fetchAsyncEppComponents","getEppDiameters","fetchAsyncEppDiameters","getEppMaterials","fetchAsyncEppMaterials","getEppTerminals","fetchAsyncEppTerminals","getEppTerminalTypes","fetchAsyncEppTerminalTypes","getEppTypes","fetchAsyncEppTypes","getExtraComponents","fetchAsyncExtraComponents","getPlenums","fetchAsyncPlenums","getValveConnectorGrids","uploadValveConnectorGridImage","file","formData","FormData","append","then","getValveConnectorGridImage","imageID","fetchAsyncValveConnectorGrids","getEppDampers","fetchAsyncEppDampers","getEppDamperTypes","fetchAsyncEppDamperTypes","componentSlice","enFlowUnit","pageTitle","pageSubTitle","commonSlice","userChanged","userEmail","userID","expires_at","expires_in","pageTitleChanged","valveConnectorEditAdapter","valveConnectorID","valveConnectorGridEditAdapter","valveGridEditAdapter","valveGridID","valveConnectors","valveGrids","getValveConnectorGridsEdit","updateValveConnectorGridsEdit","grid","fetchAsyncValveConnectorGridsEdit","selectCompEditState","fetchAsyncValveConnectorsEdit","getValveGridsEdit","fetchAsyncValveGridsEdit","editcompSlice","Refresh","store","configureStore","reducer","projectReducer","component","componentReducer","commonReducer","editcomp","editcompReducer","devTools","process","selectCommonState","selectAllProjectArticles","projectArticlesLoading","articles","getProjectObject","title","address","advizer","date","Date","toISOString","ductTypeID","ductType","ventilationTypeID","ventilationType","valveDiameterID","valveDiameter","flowUnitID","dm3_s","attributes","mapProject","getProjects","getProject","createProject","copyProject","addRemoveAttribute","newAttributes","updateProject","deleteProject","delete","selectActiveProject","selectFlowUnitID","m3_h","useGlobalStyles","makeStyles","theme","createStyles","root","paper","padding","spacing","width","marginTop","regularContentWidth","maxWidth","regularContent","roomContent","globalTheme","createTheme","palette","primary","main","secondary","text","divider","typography","fontSize","fontFamily","h6","fontWeight","useActionButtonStyles","display","marginBottom","link","color","paddingLeft","paddingRight","paddingTop","paddingBottom","backgroundColor","borderWidth","borderStyle","borderColor","textTransform","textDecoration","position","helperlink","arrow","height","lineHeight","right","textAlign","ActionButton","classes","style","preventDefault","linkClassName","caption","icon","faAngleRight","useStyles","flexContainer","flexWrap","alignItems","flexGrowHor","flexGrow","extraPadding","PageTitle","useDispatch","useSelector","globalclasses","useTranslation","useTheme","document","actions","extrapadding","Typography","variant","onNext","zIndex","EditorPage","Paper","children","DecimalSeparator","toLocaleString","substring","FormatDecimal","decimals","power","isNaN","round","toFixed","replace","ParseDecimal","parseFloat","deleted","inputLabelProps","overflowY","textOverflow","whiteSpace","lastUpdate","LastDebouce","TextInputField","onBlur","validate","valueRef","current","TextValue","setTextValue","warn","setError","empty","setEmpty","onChangeCallBack","searchAPIDebounced","useConstant","AwesomeDebouncePromise","handleTextChange","type","debounce","helperTextRef","helperText","TextField","fullWidth","label","disabled","required","multiline","onFocus","event","target","select","rows","InputProps","readOnly","input","inputClassName","InputLabelProps","ComponentList","downLoading","setDownLoading","difference","getTime","articlesLoading","Button","result","projectArticle","quantityPerItem","quantity","articleNumber","RadioSelector","handleChange","parseInt","FormControl","FormLabel","marginRight","RadioGroup","options","FormControlLabel","valueFieldName","control","Radio","displayFieldName","selectEppTypeById","NumberInputField","propsValue","zeroAsEmpty","myValidate","onMyBlur","onLocalChange","trim","AmountInputField","maxAmount","ImageType","EppComponent","EppType","useCallback","eppData","eppComponent","newValue","eppDataComponent","updateEppDataComponentThunk","selectAllEppColors","selectAllEppComponents","selectAllEppDiameters","selectAllEppMaterials","selectAllEppTerminals","selectAllEppTerminalTypes","selectAllEppDamperTypes","selectAllEppDampers","useEppData","diameters","selectEppDataComponentsByDirection","editEppData","setEditEppData","screenMaterial","c","screenDiameter","screenTerminalTypes","retval","screenDamperTypes","screenColors","screenComponents","field","prevValue","outside","eppDatas","otherEppData","componentsCount","sum","newData","updateAsyncEppData","ExtraResistant","useMemo","otherResistance","EppDataEdit","screenComponent","verticalAlign","marginLeft","BaseButtonType","getImage","imageType","useProjectExtraComponentStyles","image","imageContainer","top","bottom","left","centered","preImageContainer","minHeight","editor","group","ComponentContainer","ProjectExtraComponent","extraComponent","selectAllExtraComponents","selectAllProjectExtraComponents","ExtraComponents","items","Array","componentItem","extraComponentGroupID","sort","extraComponentOrder","key","extraComponentGroupOrder","useExtraComponents","extraComponentsGroups","extraComponentsGroup","extracomponent","InstallationPlan","htmlString","setHtmlString","calculation","dangerouslySetInnerHTML","__html","selectAllPlenums","selectPlenumById","makeSelectPlenums","canSupply","extraction","canExtraction","selectPlenumdataByPlenumDataSupply","dialogTitle","BaseDialogTitle","withStyles","margin","closeButton","grey","onClose","other","myclses","DialogTitle","disableTypography","IconButton","BaseDialog","handleClose","IsOpen","handleApply","onApply","getButtonProperties","but","close","OnClick","submit","Dialog","disableScrollLock","fullScreen","open","onSubmit","DialogContent","dividers","DialogActions","buttons","butProp","nextProps","prevState","enDuctType","InfoDialogEx","isOpen","useInfoDialog","setData","newstate","useFlowRate","FormatAirFlowRate","airFlowRateUnit","FormatAirFlowRateUnit","button","float","plenumImage","maxHeight","plenumImageHost","PlenumItem","plenumSelect","flowrate","PlenumSelector","projectConnections","projectPlenumConnections","selectPlenums","infoDialog","setInfoDialogOpen","isValid","entities","updateAsyncPlenumData","selectAllDucts","DuctTypeSelector","round92","oval","VentilationSystemSelector","editorStyles","objectFit","TextBlockHost","DateInputField","date2string","substr","valuestring","shrink","enBendType","ValveDiameterSelector","FlowUnitSelector","checkbox","CheckBoxer","InputLabel","Checkbox","checked","FormHelperText","ProjectSettings","projectRef","changeField","connectors","supplyConnections","supplyeppdata","newProject","Grid","container","sm","xs","afbeelding_round","afbeelding_oval","afbeelding_balans","afbeelding_extract","Experimental","connectionStyles","part","floatRight","halfLeft","halfRight","partBlock","overflow","partComplexBlock","valveImage","connectionRoot","Color","deleteButton","deleteIcon","elbow","minWidth","tableStyle","tableLayout","tableCell3","tableCell2","PartDescription","normalizeAirFlowRate","convertM3H","DebietInputField","minAirflowRate","maxAirflowRate","helperWarnText","warnAirflowRate","plenumAirflowRate","plenumMaxAirflowRate","currentAirflowRate","PartDebiet","onMyChange","flowunit","LengthInputField","maxLength","DUCT_WARN_LENGTH","selectAllDuctAdapters","selectDuctAdapterEntities","selectAllSections","selectSectionByKey","makeSelectSectionsByConnection","Selector","Select","displayEmpty","DuctSelect","plenumDuctID","allDucts","ductAdapterEntities","selectSectionsByConnection","prevAdapterDuctID","prevSection","adapter","ductID1","ductID2","round75","MenuItem","SetSectionValue","PartDuctAndLength","totalLengte","sec","selectAllBends","makeSelectBends","selectSectionBendByKey","PartDuctElbow","SetSectionBendValue","PartDuctElbows","selectBends","PartAdapter","allAdapters","adapters","selectAllValveConnectorGrids","selectValveConnectorGridById","CheckBoxSelect","valveConnectorIDToRightAngled","rightAngled","rightAngledToValveConnectorID","straight","PartValve","allValveConnectorGrids","setRightAngled","setValveGridID","plenumConnector","valCompResult","isCustom","canDuplex","findRelevantValveConnectorGrid","rightAngledChanged","rightAngledValue","newValveConnectorGrid","valveConnectorGridChanged","selectorItems","valve","ductIDref","useRef","onlyWall","width2text","RenderParts","windowSize","isSSR","window","innerWidth","setWindowSize","windowSizeRef","changeWindowSize","newVal","addEventListener","removeEventListener","useWindowSize","partPlenumConnections","partDescription","partDebiet","partSections","partValve","row","cell","rowSpan","index2","selectAllPlenumConnections","makeSelectPlenumConnectionsByConnection","makeSelectPlenumConnectionsByDirection","selectAllValveConnections","selectValveConnectionByKey","selectValveConnectionEntities","selectIds","makeSelectConnectionsByDirection","NumberSelectRestrictor","reduxDucts","firstSection","selectPlenumConnectionsByDirection","valveConnectionEntities","canRightAngled","onThisChanged","optionsResult","used","option","PartPlenumConnection","SetPlenumConnectionValue","PartPlenumConnections","selectPlenumConnectionsByConnection","useConnectionFlowLimits","ConnectionEdit","globalClasses","setActive","getConnectionError","onValveConnectionChange","ValveConnectionSetValue","onDelete","ValveConnectionDelete","isActive","getValveConnectionError","useIsConnectionValid","useRoomEditStyles","buttonGrid","RoomEditor","selectConnectionsByDirection","connectionValid","setConnectionValid","editstyle","activeValid","canAddNew","hasError","canSetActiveNone","activeConnection","active","setValid","clearActiveConnection","connectionAdded","lastConnection","lastValveConnectorGrid","workPresure","airFlowRate","maxFlowrate","location","pages_project_supplyplenum","pages_project_extractionplenum","pages_project_list","pages_project_edit","pages_project_supplyroom","pages_project_supplymvhrplenum","pages_project_supplyoutmvhr","pages_project_extractionroom","pages_project_extractionplenummvhr","pages_project_extractionmvhrout","pages_project_extracomponents","pages_project_componentlist","pages_project_installationplan","pages_project_calculation","Layout","useLocation","toLowerCase","startsWith","AuthorizeRoute","ready","authenticated","authenticationChanged","populateAuthenticationState","createElement","path","returnUrl","protocol","host","search","hash","redirectUrl","encodeURIComponent","rest","render","login","getReturnUrl","processLoginCallback","URLSearchParams","redirectToProfile","redirectToRegister","signIn","navigateToReturnUrl","completeSignIn","fromQuery","origin","redirectToApiAuthorizationPath","encodeURI","apiAuthorizationPath","Logout","isReady","history","logout","processLogoutCallback","signOut","completeSignOut","ApiAuthorizationRoutes","loginAction","logoutAction","asyncSetActiveProject","localStorage","activeProjectGuid","queryString","require","SetActiveProject","urlParameter","useParams","useHistory","parsed","parse","catch","drawerWidth","drawer","breakpoints","up","flexShrink","appBar","menuButton","menuToolbar","borderBottomColor","borderBottomStyle","borderBottomWidth","List","toolbar","mixins","drawerPaper","down","menu","logo","logoHost","menuIcon","contrastText","menuItem","menuText","ApplicationBar","commonState","AppBar","Toolbar","edge","handleDrawerToggle","noWrap","canPrev","onPrev","canNext","EditorSwitch","theEditorTabs","tab","exact","Editor","mobileOpen","setMobileOpen","setRoles","getRoles","resRoles","componentIsMounted","baseEditorTabs","projectSettings","airSupply","balansimage","a2png","urlGroup","a3png","a4png","a9png","airExtraction","a6png","extractimage","b2png","a5png","b1png","a7png","b3png","a1png","b5png","additionalComponents","componentList","installationList","listEditorTabs","startProject","editorTabs","currentIndex","findIndex","populatedEditorTabs","useRoutes","tabGroup","Divider","visible","mainItem","ListItem","ListItemIcon","ListItemText","body","CssBaseline","Hidden","smUp","implementation","Drawer","anchor","direction","ModalProps","keepMounted","xsDown","useULStyles","root_ul","listStyle","background","root_li","HomeUL","locales","nl","de","fr","it","use","ChainedBackend","LanguageDetector","initReactI18next","init","ns","fallbackLng","debug","saveMissing","interpolation","escapeValue","format","isDate","locale","formatDate","react","wait","useSuspense","backend","backends","LocalStorageBackend","LocizeBackend","backendOptions","expirationTime","projectId","apiKey","referenceLng","private","allowedAddOrUpdateHosts","on","loadNamespaces","publishStyle","fontStyle","pubishDate","Home","parts","setParts","split","newParts","parent","borderTopColor","borderTopWidth","borderTopStyle","headervision","subpart","packshot","HomeWrapper","preFlightIsAuthenticated","getItem","preFlightIsAuthenticatedValid","setItem","preFlight","supportedLanguages","datatype","getLanguage","cname","ca","decodeURIComponent","cookie","charAt","getCookie","navigator","setBackendLanguage","RegularPage","useGridStateData","defaultValue","gridStateData","setGridStateData","changeGridStateData","retVal","gridInputStyles","cellright","cellleft","gridtd","editmode","inputcell","border","inputTdChild","saveStatusType","GridInput","textInput","setValue","orgRef","formatValue","integer","decimal1","decimal2","decimal3","decimal4","szVal","FormatInteger","unit","minInHourMin","hours","floor","szMin","FormatMin2HourMin","valueToValue","initStateValue","getClassName","string","acceptChanges","onCommit","editvalue","getStep","step","tabIndex","evt","onKeyDown","onKeyboardNavigation","ref","node","refCallBack","useKeyboardNavigation","refsNodeRefs","refData","rowdatas","getFieldID","nextFieldID","getNextFieldID","fieldID","rowIndex","focus","tableStyles","table","body1","thead","tr","cellPadding","cellIconPadding","editCellPadding","tableBorder","borderCollapse","textFilterCell","BorderLeft","borderLeftWidth","BorderRight","borderRightWidth","BorderBottom","BorderTop","BorderLeftBold","BorderRightBold","BorderBottomBold","BorderTopBold","fit","splittHeadRow21","splittHeadRow22","stickyTable","numberWidth","totalCell","fullWith","clickable","cursor","stickyThead","stickyRowColor","stickyTester","divTable","divTableRow","divTableHead","divTableCell","divTableHeading","divTableFoot","divTableBody","Td","tableClasses","borderLeft","borderRight","borderBottom","borderTop","firstCell","stickyRowTop","stickyColumnLeft","newProps","firstRow","GridInputTd","newClassName","tdClassName","keyboardNavigation","onKeyboardNavigationMemo","myRefCallBack","gridClassName","RowProp","_table","_index","_stickyHeight","ColumnProp","_stickWidth","columns","TableProp","rowCount","topOffset","columnCount","leftOffset","_topOffset","_leftOffset","_rowCount","_columnCount","_rows","_columns","offset","values","stickyHeight","stickyWidth","useTableProps","tableProps","StickyRowHeight","StickyRowTop","setStickyRowHeight","StickyColumnWidth","setStickyColumnWidth","Table","useObserver","observer","myCallBack","entries","borderBox","borderBoxSize","inlineSize","blockSize","contentBox","contentBoxSize","observedElement","obs","unobserve","ResizeObserver","observe","Th","cellWidth","cellHeight","sortingFields","dataField","OnWidthChanged","OnHeightChanged","onCllickRef","someCallback","entry","currentOrderBy","orderBy","clickCallback","RenderRow","callBacks","setting","encrypted","styles","SettingsGridTable","settingID","headerRow","dataRow","saveSetting","filteredRows","getSettingsEdit","updateSettingsEdit","newSetting","useSettingsGridData","setSettings","setSetting","savingRef","concat","Settings","infoDialogState","openInfoDialog","gridStatePlaceHolder","initExpandedData","canAdd","toLocaleLowerCase","valveConnector","valveConnectorName","article","duplex","valveGrid","valveConnectorGridConnector","ConnectorGridImage","inputRef","temp","click","files","valveConnectorGridUpdated","gridImageID","ValveGridCell","supplyZeta","supplyZetaDuplex","extractionZeta","extractionZetaDuplex","ValveConnectorGridTable","setCanDuplex","setValveConnectionID","setDuctID","setValveDiameterID","valveDiameters","stickyColumnWidth","setColumnWidth","indeterminate","placeholder","getValveConnectorsEdit","useValveConnectorGridData","setValveConnectors","setValveConnectorGrids","setValveGrids","ValveConnectorGridEdit","EditComponentItems","MapItems","endsWith","SelectEditComponent","Fragment","MapRoute","EditComponentRoutes","EditProject","ProjectItem","editProject","stopPropagation","useEditProject","saveCallback","deleteCallback","saveStatus","setSaveStatusIntern","setProject","saveStatusRef","setSaveStatus","handleSubmitEdit","handleSubmitCopy","handleSubmitDelete","canSubmit","cancelEdit","setExternProject","useEditDialog","canApply","EditDialog","applyDisabled","useConfirmDialog","question","onConfirm","ConfirmDialog","addButton","ProjectList","editDialogState","showEditDialog","findProject","setFindProject","setProjects","conformDialog","setConfirm","editproject","prevProjects","pre","editProjectState","filteredProjects","interceptors","reject","AppWithStoreAndTheme","changeLanguage","setServer","documentElement","email","sub","App","baseUrl","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","basename"],"mappings":"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","file":"static/js/main.8578d7c7.chunk.js","sourcesContent":["export enum PlenumDataSupply {\r\n supply = 1,\r\n extraction = 0,\r\n}\r\n\r\nexport enum PlenumDataInside {\r\n inside = 1,\r\n outside = 0,\r\n}\r\n\r\nexport enum enValveConnectorConnection {\r\n straight = 4,\r\n rightAngled = 5,\r\n}\r\n","export const ApplicationName = 'HyBalansPlus';\r\n\r\nexport const QueryParameterNames = {\r\n ReturnUrl: 'returnUrl',\r\n Message: 'message',\r\n};\r\n\r\nexport const LogoutActions = {\r\n LogoutCallback: 'logout-callback',\r\n Logout: 'logout',\r\n LoggedOut: 'logged-out',\r\n};\r\n\r\nexport const LoginActions = {\r\n Login: 'login',\r\n LoginCallback: 'login-callback',\r\n LoginFailed: 'login-failed',\r\n Profile: 'profile',\r\n Register: 'register',\r\n};\r\n\r\nconst prefix = '/authentication';\r\n\r\nexport const ApplicationPaths = {\r\n DefaultLoginRedirectPath: '/',\r\n ApiAuthorizationClientConfigurationUrl: `_configuration/${ApplicationName}`,\r\n ApiAuthorizationPrefix: prefix,\r\n Login: `${prefix}/${LoginActions.Login}`,\r\n LoginFailed: `${prefix}/${LoginActions.LoginFailed}`,\r\n LoginCallback: `${prefix}/${LoginActions.LoginCallback}`,\r\n Register: `${prefix}/${LoginActions.Register}`,\r\n Profile: `${prefix}/${LoginActions.Profile}`,\r\n LogOut: `${prefix}/${LogoutActions.Logout}`,\r\n LoggedOut: `/`, //`${prefix}/${LogoutActions.LoggedOut}`,\r\n LogOutCallback: `${prefix}/${LogoutActions.LogoutCallback}`,\r\n IdentityRegisterPath: 'Identity/Account/Register',\r\n IdentityManagePath: 'Identity/Account/Manage',\r\n};\r\n","import { UserManager, WebStorageStateStore } from 'oidc-client';\r\nimport { ApplicationPaths, ApplicationName } from './ApiAuthorizationConstants';\r\n\r\nexport class AuthorizeService {\r\n _callbacks = [];\r\n _nextSubscriptionId = 0;\r\n _user = null;\r\n _isAuthenticated = false;\r\n\r\n // By default pop ups are disabled because they don't work properly on Edge.\r\n // If you want to enable pop up authentication simply set this flag to false.\r\n _popUpDisabled = true;\r\n\r\n async isAuthenticated() {\r\n const user = await this.getUser();\r\n return !!user;\r\n }\r\n\r\n async getUser() {\r\n if (this._user && this._user.profile) {\r\n return this._user.profile;\r\n }\r\n\r\n await this.ensureUserManagerInitialized();\r\n const user = await this.userManager.getUser();\r\n return user && user.profile;\r\n }\r\n\r\n async getRoles() {\r\n const user = await this.getUser();\r\n return (user && user.role) || [];\r\n }\r\n\r\n async getRawUser() {\r\n await this.ensureUserManagerInitialized();\r\n return await this.userManager.getUser();\r\n }\r\n\r\n async getAccessToken() {\r\n await this.ensureUserManagerInitialized();\r\n const user = await this.userManager.getUser();\r\n return user && user.access_token;\r\n }\r\n\r\n // We try to authenticate the user in three different ways:\r\n // 1) We try to see if we can authenticate the user silently. This happens\r\n // when the user is already logged in on the IdP and is done using a hidden iframe\r\n // on the client.\r\n // 2) We try to authenticate the user using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 3) If the two methods above fail, we redirect the browser to the IdP to perform a traditional\r\n // redirect flow.\r\n async signIn(state) {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n const silentUser = await this.userManager.signinSilent(this.createArguments());\r\n this.updateState(silentUser);\r\n return this.success(state);\r\n } catch (silentError) {\r\n // User might not be authenticated, fallback to popup authentication\r\n console.log('Silent authentication error: ', silentError);\r\n\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error(\r\n \"Popup disabled. Change 'AuthorizeService.js:AuthorizeService._popupDisabled' to false to enable it.\"\r\n );\r\n }\r\n\r\n const popUpUser = await this.userManager.signinPopup(this.createArguments());\r\n this.updateState(popUpUser);\r\n return this.success(state);\r\n } catch (popUpError) {\r\n if (popUpError.message === 'Popup window closed') {\r\n // The user explicitly cancelled the login action by closing an opened popup.\r\n return this.error('The user closed the window.');\r\n } else if (!this._popUpDisabled) {\r\n console.log('Popup authentication error: ', popUpError);\r\n }\r\n\r\n // PopUps might be blocked by the user, fallback to redirect\r\n try {\r\n await this.userManager.signinRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectError) {\r\n console.log('Redirect authentication error: ', redirectError);\r\n return this.error(redirectError);\r\n }\r\n }\r\n }\r\n }\r\n\r\n async completeSignIn(url) {\r\n try {\r\n await this.ensureUserManagerInitialized();\r\n const user = await this.userManager.signinCallback(url);\r\n this.updateState(user);\r\n return this.success(user && user.state);\r\n } catch (error) {\r\n console.log('There was an error signing in: ', error);\r\n return this.error('There was an error signing in.');\r\n }\r\n }\r\n\r\n // We try to sign out the user in two different ways:\r\n // 1) We try to do a sign-out using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 2) If the method above fails, we redirect the browser to the IdP to perform a traditional\r\n // post logout redirect flow.\r\n async signOut(state) {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error(\r\n \"Popup disabled. Change 'AuthorizeService.js:AuthorizeService._popupDisabled' to false to enable it.\"\r\n );\r\n }\r\n\r\n await this.userManager.signoutPopup(this.createArguments());\r\n this.updateState(undefined);\r\n return this.success(state);\r\n } catch (popupSignOutError) {\r\n console.log('Popup signout error: ', popupSignOutError);\r\n try {\r\n await this.userManager.signoutRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectSignOutError) {\r\n console.log('Redirect signout error: ', redirectSignOutError);\r\n return this.error(redirectSignOutError);\r\n }\r\n }\r\n }\r\n\r\n async completeSignOut(url) {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n const response = await this.userManager.signoutCallback(url);\r\n this.updateState(null);\r\n return this.success(response && response.data);\r\n } catch (error) {\r\n console.log(`There was an error trying to log out '${error}'.`);\r\n return this.error(error);\r\n }\r\n }\r\n\r\n updateState(user) {\r\n this._user = user;\r\n this._isAuthenticated = !!this._user;\r\n this.notifySubscribers();\r\n }\r\n\r\n subscribe(callback) {\r\n this._callbacks.push({ callback, subscription: this._nextSubscriptionId++ });\r\n return this._nextSubscriptionId - 1;\r\n }\r\n\r\n unsubscribe(subscriptionId) {\r\n const subscriptionIndex = this._callbacks\r\n .map((element, index) => (element.subscription === subscriptionId ? { found: true, index } : { found: false }))\r\n .filter((element) => element.found === true);\r\n if (subscriptionIndex.length !== 1) {\r\n throw new Error(`Found an invalid number of subscriptions ${subscriptionIndex.length}`);\r\n }\r\n\r\n this._callbacks.splice(subscriptionIndex[0].index, 1);\r\n }\r\n\r\n notifySubscribers() {\r\n for (let i = 0; i < this._callbacks.length; i++) {\r\n const callback = this._callbacks[i].callback;\r\n callback();\r\n }\r\n }\r\n\r\n createArguments(state) {\r\n return { useReplaceToNavigate: true, data: state };\r\n }\r\n\r\n error(message) {\r\n return { status: AuthenticationResultStatus.Fail, message };\r\n }\r\n\r\n success(state) {\r\n return { status: AuthenticationResultStatus.Success, state };\r\n }\r\n\r\n redirect() {\r\n return { status: AuthenticationResultStatus.Redirect };\r\n }\r\n\r\n async ensureUserManagerInitialized() {\r\n if (this.userManager !== undefined) {\r\n return;\r\n }\r\n\r\n let response = await fetch(ApplicationPaths.ApiAuthorizationClientConfigurationUrl);\r\n if (!response.ok) {\r\n throw new Error(`Could not load settings for '${ApplicationName}'`);\r\n }\r\n\r\n let settings = await response.json();\r\n settings.automaticSilentRenew = true;\r\n settings.includeIdTokenInSilentRenew = true;\r\n settings.userStore = new WebStorageStateStore({\r\n prefix: ApplicationName,\r\n });\r\n\r\n this.userManager = new UserManager(settings);\r\n\r\n this.userManager.events.addUserSignedOut(async () => {\r\n await this.userManager.removeUser();\r\n this.updateState(undefined);\r\n });\r\n }\r\n\r\n static get instance() {\r\n return authService;\r\n }\r\n}\r\n\r\nconst authService = new AuthorizeService();\r\n\r\nexport default authService;\r\n\r\nexport const AuthenticationResultStatus = {\r\n Redirect: 'redirect',\r\n Success: 'success',\r\n Fail: 'fail',\r\n};\r\n","import React, { Component, Fragment } from 'react';\r\nimport { NavItem, NavLink } from 'reactstrap';\r\nimport { Link } from 'react-router-dom';\r\nimport authService from './AuthorizeService';\r\nimport { ApplicationPaths } from './ApiAuthorizationConstants';\r\nimport { withTranslation } from 'react-i18next';\r\n\r\nconst LanguageSelectNavItem = (props) => {\r\n const [language, setLanguage] = React.useState(props.currentLanguage);\r\n React.useEffect(() => setLanguage(props.currentLanguage), [props.currentLanguage]);\r\n\r\n const changeLanguage = (lang) => {\r\n setLanguage(lang);\r\n props.onChangeLanguage(lang);\r\n };\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nclass LoginMenuTranslated extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n isAuthenticated: false,\r\n userName: null,\r\n contactName: null,\r\n newsLetter: null,\r\n roles: [],\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this._subscription = authService.subscribe(() => this.populateState());\r\n this.populateState();\r\n }\r\n\r\n componentWillUnmount() {\r\n authService.unsubscribe(this._subscription);\r\n }\r\n\r\n async populateState() {\r\n const [isAuthenticated, user] = await Promise.all([authService.isAuthenticated(), authService.getUser()]);\r\n this.setState({\r\n isAuthenticated,\r\n userName: user && user.name,\r\n contactName: user && user.contactName,\r\n roles: user && user.role ? user.role : [],\r\n });\r\n }\r\n\r\n render() {\r\n const { isAuthenticated, contactName } = this.state;\r\n if (!isAuthenticated) {\r\n const registerPath = `${ApplicationPaths.Register}`;\r\n const loginPath = `${ApplicationPaths.Login}`;\r\n return this.anonymousView(registerPath, loginPath);\r\n } else {\r\n const profilePath = `${ApplicationPaths.Profile}`;\r\n const logoutPath = { pathname: `${ApplicationPaths.LogOut}`, state: { local: true } };\r\n return this.authenticatedView(contactName, profilePath, logoutPath);\r\n }\r\n }\r\n\r\n authenticatedView(userName, profilePath, logoutPath) {\r\n const { t } = this.props;\r\n return (\r\n \r\n \r\n \r\n {t('menuhello', 'hello')} {userName}\r\n \r\n \r\n \r\n \r\n {t('menulogout', 'Logout')}\r\n \r\n \r\n {this.state.roles && this.state.roles.includes('EditComponent') ? (\r\n \r\n \r\n {t('menumaintenance ', 'Maintenance')}\r\n \r\n \r\n ) : null}\r\n \r\n \r\n );\r\n }\r\n\r\n anonymousView(registerPath, loginPath) {\r\n const { t } = this.props;\r\n return (\r\n \r\n \r\n \r\n {t('menuRegister', 'Register')}\r\n \r\n \r\n \r\n \r\n {t('menuLogin', 'Login')}\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport const LoginMenu = withTranslation('IdentitySystem')(LoginMenuTranslated);\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJQAAABSCAYAAACyjf19AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAABe4SURBVHhe7Z0HeBTV+sbf9EIqIUASSkBAFLj0XgVERAQR0EtRioIIigrSRAQFC/2KV5B7pYvKVRGkWQClCQQIIChFQgshBdJ7/3/vmdmUTTFN/rC7P555sjNnZnbOOe/5ypmZxSpbgAULFYS1/teChQrBIigLFYpFUBYqFEsMlYd9v4dg26lg7L0SiezMLFhZW6O5rzueaFYDj7f01/eyUBwWQQkf7TqDiV8HAknpgL2tbJEmycgCsuQvFxEXHG3xZv+mmDu4lXaQhUIxa0Flp2fAd/pmhIXGAy72mogSUlGvnjcGNPGDm4sDMjIyEXA1ErvEciE2Fa5+bghbMBDOlRz1s1jIi9kKKjM1HbbjPpMWkDDSzkbEkoyeLWpi64RuRYplzd5zGL3iAGBrhdTVI2DvJCK0kA+zFZT9CxuQniFVtxVBiZg2vNgFw7ver5cWj8fLXyA2KQ3Zq0boWywYMMss74XVB5HOeImWKT4VH45oV2IxkZiPhgDpWZjzzQl9iwUDZmehMtIyYDd8NeDprILtul6VEDR/oF5acoIj4lBrzAZkb52gb7FAzM5Czdl6SjI2OxlKViqrWzW8rV5SOmpWdUOnNv74LvCavsUCMTtBrTt6RZsaoGGW2ndrUkMvKT2LBrfE58ctgsqLmQkqGzciE6XWYp0ys+Hr465vLxttG1RHVLScz0IOZiWo27EpQGqGuDtt3YbCKicNqlTSP1kgZiWoBE5cimVSiJhCIhO0z+XAr1r5rJypYVaC8nOWYNzeRlsRQWUlpOFaeKy2XkbaVHPVP1kgZiUoO85sM8MzzJTI+kufB2ify8CtmEQ09PfW1ywQMwvKJau7r4p2z46Itdp++AoCLoRp66XEztYGft4WC5UXsxPU5J4NgeR0zUpxLsrDGW3nbMOJoAh9j8IJuBiGLUcv62saHi6WG8TGmOW9PPuxG5DOWtvo44mPqMQmYXC3Blg5tC083Z207UJKShre+CoQS7f9ptbDVw5FVU8X9dlCQcxSUHtOB6PnvF1AZWfNShE2Q1qGsl5u3i5wtLdFekYmoiMkE+REqKMskiHaye5p/31GO8ZCAczO5ZEeTWtiaPcG6tmnnACdwnKQgF2sU1xKBiLiUhDNG8hu4tac9Fs1ttYisiw0fONb7RgLBTBLQZGNL3ZD1werqacNckRFKBy6QsNisGAGJJC/cD0ag5ft1jdYyIvZCor8MrMvXur9AMQUAemZ+YVVFNxF9vv65A1kpIkFs5APs33ALi9/XL+NJz/ZjwtBt7V5KlsbGWpimQzWKYsz7LLwto2DDeYPaI6p/ZppZRbyYfKC+vXcTXx2/BoCL9/GxchEVJHg2r+qK3o+4IPxXevDxSU3o7sREYsV+/7Et2dvIiQiTmJ0bb6qmqczOtf1xtOta6Ov0dsvm49cxqaTwQgKjcE5Of/9sm+Naq548h81MLIUD+2ZCiYrqP8dDsLTnx7U32QRi8NacnqAImGV1edMdGpTG3tf6wk7x9I9Hz5ncyDe5psytGJ88tPwdgwXfuYijH2sMVaO6qg+mwMmKagO83bg8JmbWobGDk5JR/MGVdFPsrvmNdyRKen/oWtR2HzyOq5evCWtAGx9ozf6leDdu/iEZFSdshkpDOadRYRybqq1d7Oa6NPYF/6VnRGfnIY9QZHYKNYrNSwe8HTE7aVPw8vDWTuJCWNygvKbtAk3b0uQzVRfOr1LEx9sHd8NHu6Fd2ZweCx6LN2DP0/fwOZ3+mJA67p6SUESE1LgMm6jNr3ADDA2GZP6NcHiYe30PQqy+3QwHv5wLxCTjJi1I+DulutiTRGTElTn93fi4LlwTUxxyXh7YDO8Nai1Xlo8E9b+iuWbjiPmf2Ph7lr4LRXrMeuRzbCKb8rEJCFgbj+0blBdK/wLfKd8jdDIBGSvHqlvMU1MZtpg67ErOHgyRBNTcjrG9GhYYjGRj0d2QL8+jdBo9nf6lvw8u3IfslMzdTEl4ydxkSUVE7m5cBCsJXuc/mXZn264FzAZQQ369BDgLpZFDK6VvTX+83xnvaTkbH25B0JuxuBiSLS+RSNeXN2Gny9qYk3PxMOtaqJn01p6acmJXjwI8zeZ9qtXJiGoYxdCkRGXos0dpWRgwYDmeknp2TC+K+bsOKOvacz//qx2P49IEL64jL9v4ObqhB4d65r0mzImIahVh69IoCwdzhQ+LRPD29bRS0rP8C73I/B8qL6mseGYCMAw9eBkjyb+VbSCMjCvf1PskgTAVDEJQR3hs0zMuphfyJ/qVcr30JtT5fyPp1y/HqWdPysbDcv5UkK7+tXx+63yP8t+t2ISgjobmaS5O8KOLyftfXNfPEhLTVePrWi3YbJhZ6N/Tzmo7eqgfzI9TEJQOTd1dZcXG5+srZeRf3gbWSHDPT1ra5y5Vf738HrVqax/Mj1MQlAe6sUDfUVinW+OX9VXyoa3V67LtOckJm8OU7TUVWIqQm7Ha4VlxMnDdJ/4NAlBdarjpd1iISKuMV+WPTXnPG/Tmp76moYbX5XivTlaKhHYq+V4U+ZKaDT6NC376+93OyYhqH7NamrPMxGJobKS0jDt86PaeilJSctAvZoi0Dz0vL96vjdlvv71Mvafu6mtlxIfCfidTfiHykxCUKO7NFBPDuTEUs72WLDtDOZvO62tFwFfQBi/5qC+puFEF2fEtEceBESkmtsTK+XmhK7v7ETAhfzTC8Yc/CMEn+27oK9pOBZyflPCNIJyYRRfj1J3/gXV6Y6Y/uVxNJ75LU4FhWvb87Bk5xk4vbARK7b/jk93/65vLZw2DarDx9ct160yo3R1RNvZOzDk458RbhRTJSWlYMLaQ+g8ZweeWb6v3G8n30uY1M1hq2GrgEriTiQbU7BqdFV8Dy8zE7VreCAyIRUJUZIF8jaK+p0o2S8yEUffe0KEU007rhDOB0figcnfaD9UZsj6eH7JKpEs1svWGnV83HCFb8mkZGjn52QrYy8pz/5stBygH2fCmJSgTl4KR4sZW7VON8xLGWA1DYG1cRmzOBFdwsphqORc9BzR218fx5yvTmrnN6a480tcVs3dEWFLn9Y3mC4m4/JI83rVsHFSD4C/2WRwTwbY0Zz0NO5sQotmb4vKr/5PhGF0XB5mD2qF5x+VeIq/MWU8Dos7v5w7PDIJPT7YpW8wXUxKUGRo+/twfvFAgDPcieKKaDWKM8Is05/qTJd9L0cUP8f035Ed8Z9xnTTRMmYr7tyE5UwYZN/whBTNGpowJvfEZl4mfxGAJd9LwM0pBT4tQAtiiH9y3mTJhJ24o0UDmmJi7yZaWQngK1SDV+zDlqNXNavE58pp6dT5pUkpZMZv4u6q+rrjq9Ed0aWxn3awCWPSgjKw57dgfBEYjHPBUTgXkyyhsRVaVq2ExrW9MKRlbbSuX3Qw/pdIsL/h1yB8/0coTl2PRpgE5A6iq1aSFbYRF/xsW3/Uqmo+P0pmFoKycOcwuRjKwv8vFkFZqFAsgrJQoVgEZaFCsQjKQoViEZSFCsUybVDBnDh+ApcvX4G1tQ1sbKzxxID+eol5UKygdu7YBQeH/DdLubu9vT08K3vC3782XF0tP6ucl3Vr1+OXn/fDzs4ODvZ2+Gj5Mr3EPChWUEOeGgY3dzd9LRcekZWVJUsmqlWrhpdfmQBfX1+91Lz5fOMXOLD/kBKUvb0tFi1ZqJfc3QQFXUZ8XDx8/XxQtWpVfWt+suXfhfMX4eHujuo+hb+GX2wM5eTsBCcnJzg7O8PW1lZZJy7W1layzQlubm5ISEjAlEnTEBdrPg+RmSKzZs7GwgWLcPRI4c/LHzp4CO/OfR+xMbE4fPgI3p49Vy/JT4mC8rS0NDRv0Qzjxr+A58c+h/5PPA4XVxf1P4ZTaLRiW7Zs0/e2oKENvnuBY8ePo1IlZ7i6uMrfgi+yRkZGIjDwFHr07K7CINZrwsvjsfzjFfoeuRTr8kaPfF5ZoZSUFAwc9CQe7tVTL9F4afxECTxtkMmnIWvXwpRpr+slwOpVa9Xf9PR0dOzUAY0bN1LrBr78YhMSE5OU66xfvx66PdRVLwE2bfpKLF4cXFxcMGSo9lDaDz/8iEMHDknlojB1+hT1fQZ2bNuJc+fOISwsXLkaXz9fFdsZqsYB0aZdazRvlvu7mBkZGdj23XZcvPgnQm+GSj1dUVtiwh49e6jY0Jg1q9eqAVSrVg080vsRte3rrzbjZOBJxMTEYNHSBXBydMpxeba2NsotzHxzBnb/uBtHZOTfunUL3t7eaNzkQQnWn1DnKAxe247tO3HxwkVVJycnR9SoUQPdundDw4YFf2bx9OnfcOTwUVV31vm550fpJRo3pX5bt3wHR0dHJCclYeToEcrrkMTERMyb+x4SExLVsX7Sdr5+fuoasqRfaUA2f7MFD3Xvir17fkZycjJ++WU/Pl21EgvmL8LUPH1O9F+A+GsoGmNopZJEFLwQXmxeAgICRK1WSBYx1qtXt4CgTgWeRnRMtLpwa2vrfII6feo0bt+6jZTkFCWoWW/ORmhIqHLBbAB7CXYJO/L1ydNgbWWlhJ2amqqeJKBZNjxtm5WZhejoaFSt5p0jqN/P/i7mfYkkHPbqOIqax96+HYn9vxxA954PYcTIZ9W+Bo4FHJNrzcIfZ/9Qgpr40qtqoDFpiYuLg5NDwR8S8/T0xIdLl0mHn1Gi4HeFi0CuXbuOn/fuw4cfLdX3zOU3EcfiRf+S9nRQArGSuqWlpiEq6owSZaPGD2DK1PydyAFxRNwQ+4B1MRZUXHwcDh86rPorVgbqsGeGqu10Y5+s+A88PDyUpyEhITfV9bFP2TcUFLPVTDkv96FL7NHjIbWvYcDmpcTzUGyMvOwTlUZKB1AM7GRagLwwE7SXDjN0mjF2Igp2BhdDZQzY2fE4B3h4emDeO+8pcXE9VRqWIqNpJu+/Ox+O+jm8qlTBW3NmYfKUSXDQO4Pn9fH1wWuTX0WvXg+rY6KiojD/g4VwFzdta2unYsSOnToqq8QGZPb6895fJFPbp/Y3wPqww7KtsvHOnLnI1N09RcXzGARsgGXn/jgnlvO8XIutXJOjEq21dI6LSyVVjw0bNup7a4SHR2DxwqXSwe7qu7g/246DmZ3H7X9evIQP//WRfoQG91Htrbe5MewjrS/YVvZKpOTq1euq/izn+bmwjNfOcxr6ha5u3Zr1at9xL45VdTp+7Di8pc2NKZGFYuV27tyFH77/UX0pA3H+pb9lpVu3aYW2bcv2n0EXBysaHh6uOrpN2zZi5R5EmrhQjjR2ZGhoKLy8vJR7fPe9uTkZ6TMjhuOT5Sv1TklBu/a510bXpdxhVrYS1XsfzNNLgO3bdqiFbn7rt1vzWU1ieHYuIuIW0jPS0a1bV9QV61uY9TbALPiNWdPhYO+AaBHzmxL8sqMo+jNiuZDnf/lYvWqNqhtJS0/DrLdmopbu2tesXoeAowHKVdHN3gi+gRo1y/fC6LDhQ9RiCF3Yl08OHIBej2iDzwBDj4ce6oYff/xJDdSGDRvioIQfr056Rd8jlxJZKKqWI5KdyC+l0lkxNiTjnzFjx+h7VjzJMpInv/6afMdzaN+hPbp27aK2x4hbU5ZBoDnOO73hVcVLmX4KMlgaPi8c4exQ1uOpfw7Wt2r0ffwxNVB4XLS4U7qywmBcOH/h+xgqndGuXVt07NhBL8mF52G88dLE8UpMxLNyZXQSa8jj2aYZ6RlqO2G8EnQpSHUYr61Pn0dzxERGSdzDY3heWop9+/brJeWH59Q+FO7GSIuWzTF9xlQVZz722KOFiomUSFDsHJpTjlxXCV5tpMFppdjwV65cxagRo5V5r2homRo0qIeGDzTUt+TC+IQdwwagj4+OjtFLxK3prphlHF0GGL8wHmHH0AX89MNPyn38a8kytSz/9ydqsBAbG1vlHo1hgN+lSxf1/cXB73YWC84gPC9+NfxyLZoyeRphYonZzkpoUm/jmJPUratZQw6IoEv5/6u1O0XdunXgLq63KEokKI6Yx/r2Ue7h/Q/exdJlS7Bw0XwKWnUc3c5KCe5KA4Pnv4IN7CfZTWEwFrjvvrpybWnKWi5euERNzp2VgHvd2g1qFNNCtGqd+2tz6dJRVtbyzdJp7JRLYhHods6eOauWwBOBSjApKaly3hTJiAr+iguvyavKX/96Cge6vcROxvC7VcMZkSBZFtuSGA8EA+4ebqqMZGYV7WaNsbYqcahcbkr8TXR3eWHw2ufRR5TY2BCJko4myVIYqhGNyMjMNfdFwcZj+l0Us2bPlBjFW52fmdy7kv4uWbRUXRNnfatXr14g4zF0JvdhjPR4/754TFydYWEG90jvXuL++qKKuM7CoKgqGmaBBrEQWl9jUpLYB389EI1JFG9SWB/8HZRYUIVdUKqMZsN2WhzeijFgaBqKLTq64Cx6xK1bOSOyOPI2sjEMJGuIC2HjM9CmO2Gg2qjRgxj/8ot4Z94cfU8NT0mP+YYKz8ljaL36P9EPA57sX2D555Cn4F3ELYi/A1p5CpXXxnoF3wjWS3IJDglR7l1ZSYnHDBgEzr5grGvM9evB6pxFkqeJyyu8EguKwWJegq8FY9euH1RspTpdrsNFT+cJ4yxupmsJPJH/53V2bt8l5TblvvjP1m9UczO0Nh8seA9z572Nd+bOkUB4Alq1aqnvlUslSde9xLKyA5gBrluzQS8pSGHx098J3TYtKmMkxnHbtu7QSzQuXvgT0ZFRahCyvs0lSDbg7V0lR1Tpaen47bf8Pzr704+7c2LDwsjSBy3DgaISkZJSomkDXsyuXd9jz569SjyxMXFSqRTl51lBBuidu+T/GefatWvj0p+XlBA5Ycj7QI2bNMJVCeLPSLzCDi0v7HSen8sb099Evfr3qetj+3Ake1fxRvuO7dToN/DU04Px0bLlElR7yPGRmDljFnr1fljcWxU133X9+nWVEnfp2llSam0C8E4xcPCT+Peyj9VEI134tCkz0LZdG5VwHD1yVA0ITtSy7Tp37qQfBfjX8ReLq4UQ3GfFx5+o6+dgZl1ojTnwi4IxISeD2c97du9VsSe/I/DEScx4Y1qhDwgURYksFEVD5SfEJ6gpek7UUUw0rzFSWX9/fzw7Yri+t8ZTTw9SaufIYWXCwsLwvVi08+e1n7ehuAqLE0rD2HFj1FwYLR1FfeJYIE4cD1TB9bGA49i2bTtemzhZjVADdHPdu3cTMUUrN8Br/PyzLyTL+1DdNjn86xGVzhtb5DsBrWrXbl2UmHht7FheO+tDC5YmfRAXH686OS+Vxf0xK+QEM6EwDuw/qG6VMK6tI4JjHxismDGciomX8xIeyzbgsRxc1sW5ykIoVlDR0uhcaAl4myM2NlYt7Izs7CzUua8OXpk0ETNnzdCPyMXPzw/Tpk9RleAI4y0aVo63TWbMnI4RI0cgNDRMndvQEAbi4mJzvruoQJ9s+XarnD9TZWbMkpKSk1QnMIFg6s1Mr7JXZaxft16tGxgx6lm8NvkVFXexPhQ2R74aNHKe2v610KJlC31vDQ4c1psLv6MoWBdOYEZHa21mDK8tSspY79hCykeNHokXJ4xTguZcG6c5+H1R4u7q1a+LZf9eqmJFY16fOgnNWzRX3oCDhN/DQdayZUt175N3AiIiItT1G0/E8h4tExTe+eCxqZLl8j4rp4lKO7DuyBObzDJiJevirQOOtIqAGd3VK9fUrQyaf2ZrvL1Bf0fzf+H8eaxds16ZfTbsqyL8xo0b60fnhwkCJxYpQHf3u+ctX87G0w2zU+mSSwrvLtBqF/VcU3FQdBQcZ/hLkjQZU/ojykAlcY++vj4VJiaOWD5mSwGwoYc/O0wJgff16PtdXV2Ua+NMMxuHY8bOtugYoqq3twqI7yYxETtbO/j4+JRKTIRiKIuYCI/jd5ZFTOSOCKqioRtlgsisJJbuUWIOYw4cOIjLQZdVwzDWu79hA73Ewt/JPfuSwvSpM9SjGAw2abFoAT08PSVxiMfNm2EqLuIjIIzDOCfVoUN7/UgLfyf3rKAIn5O6ERySM5vOJwgME8lZ8pkz3bypXL9BfW2jhb+de1pQhAHoFYmnmDFytp7PWfFJSabKTKct3FnueUFZuLu4J4NyC3crwP8Br/MoineYnYEAAAAASUVORK5CYII=\"","import React, { Component } from 'react';\r\nimport { Container, Navbar, NavbarToggler, NavItem, NavLink } from 'reactstrap';\r\nimport { Link } from 'react-router-dom';\r\nimport { LoginMenu } from './api-authorization/LoginMenu';\r\n//import './NavMenu.css';\r\nimport mainLogo from 'image/burgerhout.png';\r\nimport i18n from 'i18next';\r\n\r\nimport authService from './api-authorization/AuthorizeService';\r\nimport clsx from 'clsx';\r\n\r\n//https:codewithmukesh.com/blog/identityserver4-in-aspnet-core/\r\n//https://docs.identityserver.io/en/latest/intro/big_picture.html\r\n//https://docs.identityserver.io/en/latest/quickstarts/4_javascript_client.html\r\n//https://github.com/iammukeshm/GettingStartedWithIdentityServer4.ASPNETCore\r\n//https://medium.com/@piotrkarpaa/using-spa-react-angular-ui-with-identity-server-4-dc1f57e90b2c\r\n\r\n//https://clintmcmahon.com/there-was-an-error-running-the-selected-code-generator-in-net-core-5/\r\n//dotnet aspnet-codegenerator identity -dc HyBalansPlus.Data.HyBalansPlusContext\r\n\r\n//https://www.scottbrady91.com/OpenID-Connect/Silent-Refresh-Refreshing-Access-Tokens-when-using-the-Implicit-Flow\r\n//https://stackoverflow.com/questions/50363450/identityserver4-access-token-lifetime\r\n\r\nexport class NavMenu extends Component {\r\n static displayName = NavMenu.name;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.toggleNavbar = this.toggleNavbar.bind(this);\r\n this.state = {\r\n collapsed: true,\r\n isAuthenticated: false,\r\n userName: null,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this._subscription = authService.subscribe(() => this.populateState());\r\n this.populateState();\r\n }\r\n\r\n componentWillUnmount() {\r\n authService.unsubscribe(this._subscription);\r\n }\r\n\r\n async populateState() {\r\n const [isAuthenticated, user] = await Promise.all([authService.isAuthenticated(), authService.getUser()]);\r\n this.setState({\r\n isAuthenticated,\r\n userName: user && user.name,\r\n });\r\n }\r\n\r\n toggleNavbar() {\r\n this.setState({\r\n collapsed: !this.state.collapsed,\r\n });\r\n }\r\n\r\n /*\r\n \r\n \r\n */\r\n\r\n render() {\r\n console.log('NavMenu', { props: this.props, state: this.state });\r\n const { isAuthenticated } = this.state;\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n {'logo'}\r\n \r\n \r\n \r\n
\r\n
    \r\n {/* \r\n \r\n {isAuthenticated ? i18n.t('home:projectLink', 'Projects') : i18n.t('home:homeLink', 'Home')}\r\n \r\n */}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n/*\r\n \r\n*/\r\n","import { PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport const DUCT_WARN_LENGTH = 20;\r\nexport const DUCT_MAX_LENGTH = 25;\r\nexport const SECTIONS_AS_PLENUMCONNECTION_0 = 0;\r\nexport enum ConnectionDirty {\r\n dirty,\r\n saving,\r\n saved,\r\n}\r\nexport interface IPlenumConnection {\r\n valveConnectionKey: string;\r\n supply: PlenumDataSupply;\r\n finalAirflowRate: number | undefined;\r\n connectionIndex: number | undefined;\r\n connectorRightAngled: boolean;\r\n restriction: string;\r\n indexNumber: number;\r\n}\r\n\r\nexport interface ISection {\r\n valveConnectionKey: string;\r\n plenumConnectionIndex: number;\r\n ductID: number | undefined;\r\n ductLenght: number | undefined;\r\n indexNumber: number;\r\n ductAdapterID: number | undefined;\r\n}\r\n\r\nexport interface ISectionBend {\r\n valveConnectionKey: string;\r\n plenumConnectionIndex: number;\r\n sectionIndex: number;\r\n bendID: number;\r\n amount: number;\r\n}\r\n\r\nexport interface IValveConnection {\r\n valveConnectionKey: string;\r\n valveConnectionID: number | undefined;\r\n supply: PlenumDataSupply;\r\n airflowRate: number | undefined;\r\n description: string;\r\n dual: boolean;\r\n hasFilter: boolean;\r\n customValveResistance: number | undefined;\r\n valveConnectorGridID: number | undefined;\r\n remove: boolean | undefined;\r\n dirty: ConnectionDirty;\r\n}\r\n\r\nexport interface IApiSectionBend extends ISectionBend {}\r\n\r\nexport interface IApiSection extends ISection {\r\n bends: IApiSectionBend[];\r\n}\r\nexport interface IApiPlenumConnection extends IPlenumConnection {\r\n sections: IApiSection[];\r\n}\r\n\r\nexport interface IApiValveConnection extends IValveConnection {\r\n plenumConnections: IApiPlenumConnection[];\r\n}\r\n\r\nexport const newValveConnection = (\r\n valveConnectionKey: string,\r\n supply: PlenumDataSupply,\r\n ductID1: number,\r\n valveConnectorGridID: number | undefined\r\n): IValveConnection => {\r\n return {\r\n valveConnectionID: undefined,\r\n valveConnectionKey: valveConnectionKey,\r\n supply: supply,\r\n airflowRate: undefined,\r\n description: '',\r\n dual: false,\r\n hasFilter: false,\r\n customValveResistance: undefined,\r\n valveConnectorGridID: valveConnectorGridID,\r\n remove: false,\r\n dirty: ConnectionDirty.dirty,\r\n };\r\n};\r\n\r\nexport const getConnections = async (guid: string) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/v2/connection/' + guid, config);\r\n return response.data;\r\n};\r\n\r\nexport const getConnection = async (guid: string, connectionID: number) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/v2/connection/' + guid + '/' + connectionID, config);\r\n return response.data;\r\n};\r\n\r\nexport const updateConnection = async (guid: string, connection: IValveConnection) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.post('api/v2/connection/' + guid, connection, config);\r\n return response.data;\r\n};\r\n","import axios from 'axios';\r\nimport authService from './AuthorizeService';\r\nimport i18n from 'i18next';\r\n\r\n//https://medium.com/@franciscopa91/how-to-implement-oidc-authentication-with-react-context-api-and-react-router-205e13f2d49\r\n//https://medium.com/@danny.garcia_19872/creating-your-own-global-identity-provider-part-i-4688bd28e1b3\r\n\r\n//https://developer.okta.com/blog/2017/07/25/oidc-primer-part-1\r\n\r\n//claims uitgelegd\r\n//https://korzh.com/blog/aspnet-identity-store-user-data-in-claims\r\n\r\nconst bearerTokenHeader = async () => {\r\n const token = await authService.getAccessToken();\r\n if (!token) {\r\n throw new Error('token is null');\r\n }\r\n\r\n axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;\r\n return {\r\n headers: { Authorization: `Bearer ${token}` },\r\n params: { lng: i18n.language },\r\n };\r\n};\r\n\r\nexport const TestenAuthService = async () => {\r\n //const token = await authService.getAccessToken();\r\n const user = await authService.getRawUser();\r\n\r\n if (user) {\r\n //const hours = Math.floor(user.expires_in / 3600);\r\n //const min = Math.floor((user.expires_in - hours * 3600) / 60);\r\n //const sec = Math.floor(user.expires_in - hours * 3600 - min * 60);\r\n /*console.log('TestenAuthService', {\r\n token: token,\r\n user: user,\r\n expires_at: user ? new Date(user.expires_at * 1000) : null,\r\n expires_in: user?.expires_in,\r\n expires_in2:\r\n hours + ':' + ('0' + min).substr(('0' + min).length - 2) + ':' + ('0' + sec).substr(('0' + sec).length - 2),\r\n profile: user.profile,\r\n });*/\r\n }\r\n /*\r\n */\r\n};\r\n\r\nexport default bearerTokenHeader;\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\nimport download from 'downloadjs';\r\n\r\nexport const getInstallationPlanUrl = (guid: string | undefined) => {\r\n return guid ? 'api/InstallationPlan/' + guid + '/0' : '';\r\n};\r\n\r\nexport const getInstallationPlanHtml = async (guid: string) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/InstallationPlan/' + guid + '/html', config);\r\n return response.data;\r\n};\r\n\r\nexport const getInstallationCalcultionHtml = async (guid: string) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/InstallationPlan/' + guid + '/calculation', config);\r\n return response.data;\r\n};\r\n\r\nexport const getInstallationPlanPdf = async (guid: string) => {\r\n const config = await bearerTokenHeader();\r\n (config as any).responseType = 'blob';\r\n const response = await axios.get('api/InstallationPlan/' + guid + '/pdf', config);\r\n const content = response.headers['content-type'];\r\n download(response.data, 'InstallationPlan.pdf', content);\r\n //return response.data;\r\n};\r\n\r\nexport const getInstallationPlanXlsx = async (guid: string) => {\r\n const config = await bearerTokenHeader();\r\n (config as any).responseType = 'blob';\r\n const response = await axios.get('api/CompListExcel/' + guid, config);\r\n const content = response.headers['content-type'];\r\n download(response.data, 'InstallationPlan.xlsx', content);\r\n //return response.data;\r\n};\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IValveConnection } from 'application/project/api/Connection';\r\n\r\nexport const valveConnectionAdapter = createEntityAdapter({\r\n selectId: (connection) => connection.valveConnectionKey,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IEppData } from 'application/project/api/EppData';\r\nimport { PlenumDataInside, PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\n\r\nexport const GetEppDataID = (supply: PlenumDataSupply, inside: PlenumDataInside) => supply + '|' + inside;\r\nexport const eppDataAdapter = createEntityAdapter({\r\n selectId: (project) => GetEppDataID(project.supply, project.inside),\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IEppDataComponent } from 'application/project/api/EppDataComponent';\r\n\r\nexport const eppDataComponentAdapter = createEntityAdapter({\r\n selectId: (project) => project.eppDataComponentID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IPlenumConnection } from 'application/project/api/Connection';\r\n\r\nexport const plenumConnectionKeyIntern = (valveConnectionKey: string, indexNumber: number) =>\r\n [valveConnectionKey, indexNumber].join('_');\r\n\r\nexport const plenumConnectionKey = (connection: IPlenumConnection) =>\r\n plenumConnectionKeyIntern(connection.valveConnectionKey, connection.indexNumber);\r\n\r\nexport const plenumConnectionAdapter = createEntityAdapter({\r\n selectId: (connection) => plenumConnectionKey(connection),\r\n sortComparer: (a, b) => {\r\n let res = a.valveConnectionKey.localeCompare(b.valveConnectionKey);\r\n if (res === 0) res = a.indexNumber - b.indexNumber;\r\n return res;\r\n },\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\n\r\nexport const plenumDataAdapter = createEntityAdapter({\r\n selectId: (project) => project.supply,\r\n});\r\n","import { createEntityAdapter, EntityState } from '@reduxjs/toolkit';\r\nimport { IProjectArticle } from 'application/project/api/ProjectArticle';\r\nimport { LoadingState } from 'redux/shared';\r\n\r\ninterface initialProjectArticleEntityStateType {\r\n loading: LoadingState;\r\n valid: boolean;\r\n}\r\nexport const initialProjectArticleEntityState: initialProjectArticleEntityStateType = {\r\n loading: 'idle',\r\n valid: false,\r\n};\r\nexport declare interface ArticleLoadingEntityState extends EntityState {\r\n loading: LoadingState;\r\n valid: boolean;\r\n}\r\n\r\nexport const projectArticleAdapter = createEntityAdapter({\r\n selectId: (project) => project.projectArticleID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IProjectExtraComponent } from 'application/project/api/ProjectExtraComponent';\r\n\r\nexport const projectExtraComponentAdapter = createEntityAdapter({\r\n selectId: (project) => project.projectExtraComponentID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { ISection } from 'application/project/api/Connection';\r\n\r\nexport const sectionKeyIntern = (valveConnectionKey: string, plenumConnectionIndex: number, indexNumber: number) =>\r\n [valveConnectionKey, plenumConnectionIndex, indexNumber].join('_');\r\n\r\nexport const sectionKey = (section: ISection) =>\r\n sectionKeyIntern(section.valveConnectionKey, section.plenumConnectionIndex, section.indexNumber);\r\n\r\nexport const sectionAdapter = createEntityAdapter({\r\n selectId: (section) => sectionKey(section),\r\n sortComparer: (a, b) => {\r\n let res = a.valveConnectionKey.localeCompare(b.valveConnectionKey);\r\n if (res === 0) res = a.plenumConnectionIndex - b.plenumConnectionIndex;\r\n if (res === 0) res = a.indexNumber - b.indexNumber;\r\n return res;\r\n },\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { ISectionBend } from 'application/project/api/Connection';\r\n\r\nexport const sectionBendKeyIntern = (\r\n valveConnectionKey: string,\r\n plenumConnectionIndex: number,\r\n indexNumber: number,\r\n bendID: number\r\n) => [valveConnectionKey, plenumConnectionIndex, indexNumber, bendID].join('_');\r\n\r\nexport const sectionBendKey = (sectionBend: ISectionBend) =>\r\n sectionBendKeyIntern(\r\n sectionBend.valveConnectionKey,\r\n sectionBend.plenumConnectionIndex,\r\n sectionBend.sectionIndex,\r\n sectionBend.bendID\r\n );\r\n\r\nexport const sectionBendAdapter = createEntityAdapter({\r\n selectId: (section) =>\r\n [section.valveConnectionKey, section.plenumConnectionIndex, section.sectionIndex, section.bendID].join('_'),\r\n});\r\n","import { EntityState } from '@reduxjs/toolkit';\r\n\r\nexport type LoadingState = 'init' | 'idle' | 'loading';\r\n\r\nexport const checkLoading = (state: LoadingState) => {\r\n return state !== 'idle';\r\n};\r\n\r\nexport interface initialLoadingEntityStateType {\r\n loading: LoadingState;\r\n saving: LoadingState;\r\n}\r\nexport const initialLoadingEntityState: initialLoadingEntityStateType = {\r\n loading: 'idle',\r\n saving: 'idle',\r\n};\r\nexport declare interface LoadingEntityState extends EntityState {\r\n loading: LoadingState;\r\n saving: LoadingState;\r\n}\r\n\r\nexport interface initialComponentEntityStateType {\r\n loading: LoadingState;\r\n}\r\nexport const initialComponentEntityState: initialComponentEntityStateType = {\r\n loading: 'init',\r\n};\r\nexport declare interface ComponentEntityState extends EntityState {\r\n loading: LoadingState;\r\n}\r\n","import { initialLoadingEntityState, LoadingEntityState, LoadingState } from 'redux/shared';\r\nimport { IPlenumConnection, ISection, ISectionBend, IValveConnection } from '../api/Connection';\r\nimport { IEppData } from '../api/EppData';\r\nimport { IEppDataComponent } from '../api/EppDataComponent';\r\nimport { IPlenumData } from '../api/PlenumData';\r\nimport { IProject } from '../api/Project';\r\nimport { IProjectArticle } from '../api/ProjectArticle';\r\nimport { IProjectExtraComponent } from '../api/ProjectExtraComponent';\r\nimport { valveConnectionAdapter } from './adapters/valveConnectionAdapter';\r\nimport { eppDataAdapter } from './adapters/eppDataAdapter';\r\nimport { eppDataComponentAdapter } from './adapters/eppDataComponentAdapter';\r\nimport { plenumConnectionAdapter } from './adapters/plenumConnectionAdapter';\r\nimport { plenumDataAdapter } from './adapters/plenumDataAdapter';\r\nimport {\r\n ArticleLoadingEntityState,\r\n initialProjectArticleEntityState,\r\n projectArticleAdapter,\r\n} from './adapters/projectArticleAdapter';\r\nimport { projectExtraComponentAdapter } from './adapters/projectExtraComponentAdapter';\r\nimport { sectionAdapter } from './adapters/sectionAdapter';\r\nimport { sectionBendAdapter } from './adapters/sectionBendAdapter';\r\n\r\nexport interface projectState {\r\n loading: {\r\n projects: LoadingState;\r\n };\r\n activeProject?: IProject;\r\n connectionKeyCounter: number;\r\n plenumdatas: LoadingEntityState;\r\n valveConnections: LoadingEntityState;\r\n plenumConnections: LoadingEntityState;\r\n sections: LoadingEntityState;\r\n sectionbends: LoadingEntityState;\r\n eppdatas: LoadingEntityState;\r\n eppdatacomponents: LoadingEntityState;\r\n projectArticles: ArticleLoadingEntityState;\r\n projectExtraComponents: LoadingEntityState;\r\n}\r\n\r\nexport const initialState: projectState = {\r\n loading: {\r\n projects: 'idle',\r\n },\r\n activeProject: undefined,\r\n connectionKeyCounter: 0,\r\n plenumdatas: plenumDataAdapter.getInitialState(initialLoadingEntityState),\r\n valveConnections: valveConnectionAdapter.getInitialState(initialLoadingEntityState),\r\n plenumConnections: plenumConnectionAdapter.getInitialState(initialLoadingEntityState),\r\n sections: sectionAdapter.getInitialState(initialLoadingEntityState),\r\n sectionbends: sectionBendAdapter.getInitialState(initialLoadingEntityState),\r\n eppdatas: eppDataAdapter.getInitialState(initialLoadingEntityState),\r\n eppdatacomponents: eppDataComponentAdapter.getInitialState(initialLoadingEntityState),\r\n projectArticles: projectArticleAdapter.getInitialState(initialProjectArticleEntityState),\r\n projectExtraComponents: projectExtraComponentAdapter.getInitialState(initialLoadingEntityState),\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getConnections } from 'application/project/api/Connection';\r\n\r\nexport const fetchAsyncConnections = createAsyncThunk(\r\n 'project/connection/fetchAsyncConnections',\r\n async (data: { guid: string }, thunkAPI) => {\r\n const response = await getConnections(data.guid);\r\n return response;\r\n }\r\n);\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IBend } from 'application/components/api/Bend';\r\n\r\nexport const bendAdapter = createEntityAdapter({\r\n selectId: (project) => project.bendID,\r\n});\r\n","import {\r\n IApiValveConnection,\r\n IValveConnection,\r\n SECTIONS_AS_PLENUMCONNECTION_0,\r\n} from 'application/project/api/Connection';\r\nimport { componentState } from 'application/components/redux/componentState';\r\nimport { projectState } from '../../projectState';\r\nimport { plenumConnectionAdapter } from '../../adapters/plenumConnectionAdapter';\r\nimport { sectionAdapter } from '../../adapters/sectionAdapter';\r\nimport { sectionBendAdapter } from '../../adapters/sectionBendAdapter';\r\nimport { bendAdapter } from 'application/components/redux/adapters/bendAdapter';\r\n\r\nconst GetApiConnection = (\r\n valveConnection: IValveConnection,\r\n projectState: projectState,\r\n componentState: componentState\r\n): IApiValveConnection => ({\r\n ...valveConnection,\r\n plenumConnections: plenumConnectionAdapter\r\n .getSelectors()\r\n .selectAll(projectState.plenumConnections)\r\n .filter((a) => a.valveConnectionKey === valveConnection.valveConnectionKey)\r\n .map((plenumConnection) => ({\r\n ...plenumConnection,\r\n sections: sectionAdapter\r\n .getSelectors()\r\n .selectAll(projectState.sections)\r\n .filter((a) => a.valveConnectionKey === valveConnection.valveConnectionKey)\r\n .filter(\r\n (a) =>\r\n a.valveConnectionKey === plenumConnection.valveConnectionKey &&\r\n a.plenumConnectionIndex ===\r\n SECTIONS_AS_PLENUMCONNECTION_0 /* secties altijd op plenumConnection=0 plenumConnection.indexNumber*/\r\n )\r\n .map((section) => ({\r\n ...section,\r\n bends: sectionBendAdapter\r\n .getSelectors()\r\n .selectAll(projectState.sectionbends)\r\n .filter((a) => a.valveConnectionKey === plenumConnection.valveConnectionKey && a.amount > 0)\r\n .filter((a) => {\r\n const bend = bendAdapter.getSelectors().selectById(componentState.bends, a.bendID);\r\n return (\r\n a.valveConnectionKey === section.valveConnectionKey &&\r\n a.plenumConnectionIndex === section.plenumConnectionIndex &&\r\n a.sectionIndex === section.indexNumber &&\r\n bend?.ductID === section.ductID //komt ductID nog wel overeen\r\n );\r\n }),\r\n })),\r\n })),\r\n});\r\n\r\nexport default GetApiConnection;\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IValveConnectorGrid } from 'application/components/api/ValveConnectorGrid';\r\n\r\nexport const valveConnectorGridAdapter = createEntityAdapter({\r\n selectId: (project) => project.valveConnectorGridID,\r\n sortComparer: (a, b) => a.name.localeCompare(b.name),\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IDuct } from 'application/components/api/Duct';\r\n\r\nexport const ductAdapter = createEntityAdapter({\r\n selectId: (project) => project.ductID,\r\n sortComparer: (a, b) => a.name.localeCompare(b.name),\r\n});\r\n","import { IDuct } from 'application/components/api/Duct';\r\nimport { IValveConnectorGrid } from 'application/components/api/ValveConnectorGrid';\r\nimport { PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\n\r\nconst maxFlowValue = 9999;\r\nconst CovertValue = (value: number) => (value === maxFlowValue ? 0 : value);\r\n\r\nconst getDebietBorders = (\r\n dual: boolean,\r\n supply: PlenumDataSupply,\r\n ducts: IDuct[],\r\n valveConnectorGrid: IValveConnectorGrid | undefined\r\n) => {\r\n let ductMax = CovertValue(\r\n ducts.reduce((val, duct) => Math.min(val, supply ? duct?.flowSupplyMax : duct.flowExtractionMax), maxFlowValue)\r\n );\r\n\r\n let ductWarn = CovertValue(\r\n ducts.reduce((val, duct) => Math.min(val, supply ? duct?.flowSupplyWarn : duct.flowExtractionWarn), maxFlowValue)\r\n );\r\n let ductMin = ducts.reduce((val, duct) => Math.max(val, supply ? duct?.flowSupplyMin : duct.flowExtractionMin), 0);\r\n const valveMax = supply ? valveConnectorGrid?.supplyFlowMax : valveConnectorGrid?.extractionFlowMax;\r\n const valveMaxDuplex = supply ? valveConnectorGrid?.supplyFlowMaxDuplex : valveConnectorGrid?.extractionFlowMaxDuplex;\r\n const valveWarn = supply ? valveConnectorGrid?.supplyFlowWarn : valveConnectorGrid?.extractionFlowWarn;\r\n const valveWarnDuplex = supply\r\n ? valveConnectorGrid?.supplyFlowWarnDuplex\r\n : valveConnectorGrid?.extractionFlowWarnDuplex;\r\n\r\n if (dual) ductMax *= 2;\r\n if (dual) ductWarn *= 2;\r\n\r\n if (valveConnectorGrid && valveMax && ductMax > valveMax) ductMax = valveMax;\r\n if (valveConnectorGrid && valveMaxDuplex && dual && ductMax > valveMaxDuplex) ductMax = valveMaxDuplex;\r\n if (valveConnectorGrid && valveWarn && ductMax > valveWarn) ductWarn = valveWarn;\r\n if (valveConnectorGrid && valveWarnDuplex && dual && ductWarn > valveWarnDuplex) ductWarn = valveWarnDuplex;\r\n\r\n ductWarn = ductWarn || ductMax - 0.001;\r\n\r\n return { ductMin, ductWarn, ductMax };\r\n};\r\n\r\nexport default getDebietBorders;\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IPlenum } from 'application/components/api/Plenum';\r\n\r\nexport const plenumAdapter = createEntityAdapter({\r\n selectId: (project) => project.plenumID,\r\n sortComparer: (a, b) => a.name.localeCompare(b.name),\r\n});\r\n","import { IApiSection, IApiSectionBend } from 'application/project/api/Connection';\r\n\r\nconst getSectionBendError = (sectionbend: IApiSectionBend): string => {\r\n if (!sectionbend.amount || sectionbend.amount <= 0) {\r\n return 'sectionbend.amount';\r\n }\r\n if (!sectionbend.bendID) {\r\n return 'bendID';\r\n }\r\n\r\n return '';\r\n};\r\n\r\nconst getApiSectionError = (section: IApiSection): string => {\r\n if (!section.ductLenght || section.ductLenght <= 0) {\r\n return 'ductLenght';\r\n }\r\n if (!section.ductID) {\r\n return 'ductID';\r\n }\r\n return section.bends.reduce((prev: string, bend: IApiSectionBend) => prev || getSectionBendError(bend), '');\r\n};\r\n\r\nexport default getApiSectionError;\r\n","import { IApiPlenumConnection, IApiSection } from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport { componentState } from 'application/components/redux/componentState';\r\nimport { plenumAdapter } from 'application/components/redux/adapters/plenumAdapter';\r\nimport getApiSectionError from './getApiSectionError';\r\n\r\nconst getApiPlenumConnectionError = (\r\n plenumConnection: IApiPlenumConnection,\r\n plenumData: IPlenumData,\r\n componentState: componentState\r\n): string => {\r\n const numberConnections =\r\n plenumAdapter.getSelectors().selectById(componentState.plenums, plenumData?.plenumID || 0)?.numberConnections || 0;\r\n\r\n if (\r\n !plenumConnection.connectionIndex ||\r\n plenumConnection.connectionIndex <= 0 ||\r\n plenumConnection.connectionIndex > numberConnections\r\n ) {\r\n return '';\r\n }\r\n //todo: controle min/max flowrate\r\n //todo: controle max duct lengte\r\n\r\n return plenumConnection.sections.reduce(\r\n (prev: string, section: IApiSection) => prev || getApiSectionError(section),\r\n ''\r\n );\r\n};\r\n\r\nexport default getApiPlenumConnectionError;\r\n","import { DUCT_MAX_LENGTH, IApiPlenumConnection, IApiValveConnection } from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport { componentState } from 'application/components/redux/componentState';\r\nimport { projectState } from 'application/project/redux/projectState';\r\nimport { valveConnectorGridAdapter } from 'application/components/redux/adapters/valveConnectorGridAdapter';\r\nimport { ductAdapter } from 'application/components/redux/adapters/ductAdapter';\r\nimport getDebietBorders from 'application/project/validate/bordersDebiet';\r\nimport getApiPlenumConnectionError from './getApiPlenumConnectionError';\r\nimport { valveConnectionAdapter } from '../redux/adapters/valveConnectionAdapter';\r\nimport { plenumAdapter } from 'application/components/redux/adapters/plenumAdapter';\r\n\r\nconst getApiValveConnectionError = (\r\n valveConnection: IApiValveConnection,\r\n plenumData: IPlenumData,\r\n experimental: boolean,\r\n projectState: projectState,\r\n componentState: componentState\r\n): string => {\r\n if (!valveConnection.description) {\r\n return 'description';\r\n }\r\n if (!valveConnection.valveConnectorGridID) {\r\n return 'airflowRate';\r\n }\r\n if (!valveConnection.airflowRate || valveConnection.airflowRate <= 0) {\r\n return 'valveConnectorGridID';\r\n }\r\n\r\n const sumAirflowRate = valveConnectionAdapter\r\n .getSelectors()\r\n .selectAll(projectState.valveConnections)\r\n .filter((a) => a.valveConnectionKey === valveConnection.valveConnectionKey && a.supply === valveConnection.supply)\r\n .reduce((debiet, con) => debiet + (con.airflowRate || 0), 0);\r\n\r\n const plenum = plenumAdapter.getSelectors().selectById(componentState.plenums, plenumData?.plenumID || 0);\r\n if (!plenum) return 'plenum';\r\n if (!experimental && sumAirflowRate > plenum.maxFlowRate) return 'sumAirflowRate';\r\n\r\n const ductIDs = new Set(...valveConnection.plenumConnections.map((a) => a.sections.map((b) => b.ductID || 0)));\r\n const valveConnectorGrid = valveConnectorGridAdapter\r\n .getSelectors()\r\n .selectById(componentState.valveConnectorGrids, valveConnection.valveConnectorGridID);\r\n\r\n const ducts = ductAdapter.getSelectors().selectAll(componentState.ducts);\r\n\r\n let lenghtValid = true;\r\n for (let i = 0; i < valveConnection.plenumConnections.length; i++) {\r\n //alle lengte gevuld\r\n if (\r\n !valveConnection.plenumConnections[i].sections.reduce((valid, section) => {\r\n return valid === false || !section.ductLenght ? false : true;\r\n }, true)\r\n ) {\r\n return 'lenght not filled';\r\n }\r\n //totale lengte niet te lang?\r\n if (\r\n valveConnection.plenumConnections[i].sections.reduce((lenght, section) => lenght + (section.ductLenght || 0), 0) >\r\n DUCT_MAX_LENGTH\r\n ) {\r\n lenghtValid = false;\r\n }\r\n }\r\n valveConnection.plenumConnections.forEach((a) => {});\r\n if (!experimental && lenghtValid === false) return 'lenghtValid';\r\n\r\n const { ductMin, ductMax } = getDebietBorders(\r\n valveConnection.dual,\r\n valveConnection.supply,\r\n ducts.filter((a) => ductIDs.has(a.ductID)),\r\n valveConnectorGrid\r\n );\r\n\r\n if (!experimental && (valveConnection.airflowRate < ductMin - 0.1 || valveConnection.airflowRate > ductMax + 0.1))\r\n return 'max airflowRate ' + ductMin + ' < ' + valveConnection.airflowRate + ' < ' + ductMax;\r\n\r\n return valveConnection.plenumConnections.reduce(\r\n (prev: string, plenumConnection: IApiPlenumConnection) =>\r\n prev || getApiPlenumConnectionError(plenumConnection, plenumData, componentState),\r\n ''\r\n );\r\n};\r\n\r\nexport default getApiValveConnectionError;\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { IApiValveConnection, IValveConnection, updateConnection } from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport { selectComponentState, selectProjectState } from 'redux/store';\r\nimport { valveConnectionAdapter } from '../adapters/valveConnectionAdapter';\r\nimport { plenumDataAdapter } from '../adapters/plenumDataAdapter';\r\nimport GetApiConnection from './helper/GetApiConnection';\r\nimport getApiValveConnectionError from 'application/project/validate/getApiValveConnectionError';\r\n\r\nexport const updateAsyncConnection = createAsyncThunk(\r\n 'project/connection/updateAsyncConnection',\r\n async (data: { guid: string; apiConnection: IApiValveConnection }, thunkAPI) => {\r\n const response = await updateConnection(data.guid, data.apiConnection);\r\n return {\r\n plenumData: response.plenumData as IPlenumData,\r\n connections: response.connections as IApiValveConnection[],\r\n };\r\n }\r\n);\r\n\r\nexport const updateConnectionThunk = (valveConnectionKey: string) => {\r\n return async (dispatch: any, getState: any) => {\r\n const projectState = selectProjectState(getState());\r\n const componentState = selectComponentState(getState());\r\n if (!projectState.activeProject) return;\r\n const experimental = projectState.activeProject.experimental;\r\n const valveConnection = valveConnectionAdapter\r\n .getSelectors()\r\n .selectById(projectState.valveConnections, valveConnectionKey);\r\n if (!valveConnection) return;\r\n const plenumData = plenumDataAdapter.getSelectors().selectById(projectState.plenumdatas, valveConnection.supply);\r\n if (!plenumData) return;\r\n\r\n const apiConnection: IApiValveConnection = GetApiConnection(valveConnection, projectState, componentState);\r\n\r\n const valid = getApiValveConnectionError(apiConnection, plenumData, experimental, projectState, componentState);\r\n if (!valid) {\r\n await dispatch(\r\n updateAsyncConnection({\r\n guid: projectState.activeProject?.guid,\r\n apiConnection: apiConnection,\r\n })\r\n );\r\n } else {\r\n console.log(valid);\r\n }\r\n };\r\n};\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\nimport { PlenumDataInside, PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\n\r\nexport interface IEppData {\r\n supply: PlenumDataSupply;\r\n inside: PlenumDataInside;\r\n eppMaterialID?: number;\r\n eppDiameterID?: number;\r\n eppColorID?: number;\r\n eppTerminalTypeID?: number;\r\n eppTerminalID?: number;\r\n eppDamperTypeID?: number;\r\n eppDamperID?: number;\r\n otherResistance: number;\r\n}\r\n\r\nexport const getEppDatas = async (guid: string) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/eppdata/' + guid, config);\r\n return response.data;\r\n};\r\n\r\nexport const getEppData = async (guid: string, supply: PlenumDataSupply, inside: PlenumDataInside) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/eppdata/' + guid + '/' + supply + '/' + inside, config);\r\n return response.data;\r\n};\r\n\r\nexport const updateEppData = async (\r\n guid: string,\r\n supply: PlenumDataSupply,\r\n inside: PlenumDataInside,\r\n eppdata: IEppData\r\n) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.put('api/eppdata/' + guid + '/' + supply + '/' + inside, eppdata, config);\r\n return response.data;\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { PlenumDataInside, PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { selectProjectState } from 'redux/store';\r\nimport { eppDataComponentAdapter } from '../adapters/eppDataComponentAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllEppDataComponents,\r\n selectById: selectEppDataComponentById,\r\n selectEntities: selectEppDataComponentEntities,\r\n} = eppDataComponentAdapter.getSelectors((state) => selectProjectState(state).eppdatacomponents);\r\n\r\nexport const makeSelectEppDataComponentsByDirection = () => {\r\n return createSelector(\r\n (state: any, supply: PlenumDataSupply, inside: PlenumDataInside) => supply,\r\n (state: any, supply: PlenumDataSupply, inside: PlenumDataInside) => inside,\r\n // First, pass one or more \"input selector\" functions:\r\n selectAllEppDataComponents,\r\n // Then, an \"output selector\" that receives all the input results as arguments\r\n // and returns a final result value\r\n (supply, inside, eppdatacomponents) =>\r\n eppdatacomponents.filter(\r\n (eppdatacomponent) => eppdatacomponent.supply === supply && eppdatacomponent.inside === inside\r\n )\r\n );\r\n};\r\n","import { selectProjectState } from 'redux/store';\r\nimport { eppDataAdapter } from '../adapters/eppDataAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllEppDatas,\r\n selectById: selectEppDataBySupplyInside,\r\n selectEntities: selectEppDataEntities,\r\n} = eppDataAdapter.getSelectors((state) => selectProjectState(state).eppdatas);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getEppDatas, IEppData, updateEppData } from 'application/project/api/EppData';\r\nimport { selectProjectState } from 'redux/store';\r\nimport { selectAllEppDataComponents } from '../selectors/eppdataComponentSelectors';\r\nimport { selectAllEppDatas } from '../selectors/eppdataSelectors';\r\n\r\nexport const fetchAsyncEppDatas = createAsyncThunk(\r\n 'project/eppdata/fetchAsyncEppDatas',\r\n async (data: { guid: string }, thunkAPI) => {\r\n const response = await getEppDatas(data.guid);\r\n return response;\r\n }\r\n);\r\n\r\nexport const updateAsyncEppDatas = createAsyncThunk(\r\n 'project/eppdata/updateAsyncEppDatas',\r\n async (data: { guid: string; eppdata: IEppData }, thunkAPI) => {\r\n const response = await updateEppData(data.guid, data.eppdata.supply, data.eppdata.inside, data.eppdata);\r\n return response;\r\n }\r\n);\r\n\r\nexport const updateAsyncEppData = (eppdata: IEppData) => {\r\n return async (dispatch: any, getState: any) => {\r\n const projectState = selectProjectState(getState());\r\n if (projectState.activeProject) {\r\n const eppDatas = selectAllEppDatas(getState());\r\n const eppDataComponents = selectAllEppDataComponents(getState());\r\n dispatch(\r\n updateAsyncEppDatas({\r\n guid: projectState.activeProject?.guid,\r\n eppdata: eppdata,\r\n })\r\n );\r\n\r\n //we gaan alle andere eppdata's gelijk maken, maar alleen als er nog geen eppComponent of doorvoer is geselecteerd\r\n eppDatas.forEach((otherEppData) => {\r\n const componentsCount = eppDataComponents\r\n .filter((a) => a.supply === otherEppData.supply && a.inside === otherEppData.inside)\r\n .reduce((sum, a) => sum + (a.amount ? a.amount : 0), 0);\r\n\r\n if (\r\n !(otherEppData.supply === eppdata.supply && otherEppData.inside === eppdata.inside) &&\r\n componentsCount === 0 &&\r\n (!otherEppData.eppMaterialID ||\r\n otherEppData.eppMaterialID !== eppdata.eppMaterialID ||\r\n !otherEppData.eppDiameterID ||\r\n otherEppData.eppDiameterID !== eppdata.eppDiameterID)\r\n ) {\r\n const newData = {\r\n ...otherEppData,\r\n eppMaterialID: eppdata.eppMaterialID,\r\n eppDiameterID: eppdata.eppDiameterID,\r\n };\r\n if (projectState.activeProject) {\r\n dispatch(\r\n updateAsyncEppDatas({\r\n guid: projectState.activeProject?.guid,\r\n eppdata: newData,\r\n })\r\n );\r\n }\r\n }\r\n });\r\n }\r\n };\r\n};\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\nimport { PlenumDataInside, PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\n\r\nexport interface IEppDataComponent {\r\n eppDataComponentID: number;\r\n supply: PlenumDataSupply;\r\n inside: PlenumDataInside;\r\n eppComponentID?: number;\r\n eppTypeID?: number;\r\n amount?: number;\r\n}\r\n\r\nexport const getEppDataComponents = async (guid: string) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/EppDataComponent/' + guid, config);\r\n return response.data;\r\n};\r\n\r\nexport const getEppDataComponent = async (guid: string, EppDataComponentID: number) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/EppDataComponent/' + guid + '/' + EppDataComponentID, config);\r\n return response.data;\r\n};\r\n\r\nexport const updateEppDataComponent = async (\r\n guid: string,\r\n supply: PlenumDataSupply,\r\n inside: PlenumDataInside,\r\n eppdatacomponent: IEppDataComponent\r\n) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.post(\r\n 'api/EppDataComponent/' + guid + '/' + supply + '/' + inside,\r\n eppdatacomponent,\r\n config\r\n );\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { IEppData } from 'application/project/api/EppData';\r\nimport {\r\n getEppDataComponent,\r\n getEppDataComponents,\r\n IEppDataComponent,\r\n updateEppDataComponent,\r\n} from 'application/project/api/EppDataComponent';\r\nimport { PlenumDataInside, PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { selectProjectState } from 'redux/store';\r\n\r\nexport const fetchAsyncEppDataComponent = createAsyncThunk(\r\n 'project/eppDataComponent/fetchAsyncEppDataComponent',\r\n async (data: { guid: string; EppDataComponentID: number }, thunkAPI) => {\r\n const response = await getEppDataComponent(data.guid, data.EppDataComponentID);\r\n return response;\r\n }\r\n);\r\n\r\nexport const fetchAsyncEppDataComponents = createAsyncThunk(\r\n 'project/eppDataComponent/fetchAsyncEppDataComponents',\r\n async (data: { guid: string }, thunkAPI) => {\r\n const response = await getEppDataComponents(data.guid);\r\n return response;\r\n }\r\n);\r\n\r\nexport const updateAsyncEppDataComponent = createAsyncThunk(\r\n 'project/eppDataComponent/updateAsyncEppDataComponent',\r\n async (\r\n data: { guid: string; supply: PlenumDataSupply; inside: PlenumDataInside; EppDataComponent: IEppDataComponent },\r\n thunkAPI\r\n ) => {\r\n const response = await updateEppDataComponent(data.guid, data.supply, data.inside, data.EppDataComponent);\r\n return response;\r\n }\r\n);\r\n\r\nexport const updateEppDataComponentThunk = (eppData: IEppData, EppDataComponent: IEppDataComponent) => {\r\n return async (dispatch: any, getState: any) => {\r\n const projectState = selectProjectState(getState());\r\n if (projectState.activeProject) {\r\n await dispatch(\r\n updateAsyncEppDataComponent({\r\n guid: projectState.activeProject?.guid,\r\n supply: eppData.supply,\r\n inside: eppData.inside,\r\n EppDataComponent: EppDataComponent,\r\n })\r\n );\r\n }\r\n };\r\n};\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\nimport { PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\n\r\nexport interface IPlenumData {\r\n supply: PlenumDataSupply;\r\n plenumID?: number;\r\n airflowRate?: number;\r\n workPresure?: number;\r\n activeConnectionKey?: string;\r\n}\r\n\r\nexport const getPlenumDatas = async (guid: string) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/plenumdata/' + guid, config);\r\n return response.data;\r\n};\r\n\r\nexport const getPlenumData = async (guid: string, supply: PlenumDataSupply) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/plenumdata/' + guid + '/' + supply, config);\r\n return response.data;\r\n};\r\n\r\nexport const updatePlenumData = async (guid: string, supply: PlenumDataSupply, plenumdata: IPlenumData) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.put('api/plenumdata/' + guid + '/' + supply, plenumdata, config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getPlenumDatas, IPlenumData, updatePlenumData } from 'application/project/api/PlenumData';\r\nimport { selectProjectState } from 'redux/store';\r\n\r\nexport const fetchAsyncPlenumDatas = createAsyncThunk(\r\n 'project/plenumdata/fetchAsyncPlenumDatas',\r\n async (data: { guid: string }, thunkAPI) => {\r\n const response = await getPlenumDatas(data.guid);\r\n return response;\r\n }\r\n);\r\n\r\nexport const updateAsyncPlenumDatas = createAsyncThunk(\r\n 'project/plenumdata/updateAsyncPlenumDatas',\r\n async (data: { guid: string; plenumdata: IPlenumData }, thunkAPI) => {\r\n const response = await updatePlenumData(data.guid, data.plenumdata.supply, data.plenumdata);\r\n return response;\r\n }\r\n);\r\n\r\nexport const updateAsyncPlenumData = (plenumdata: IPlenumData) => {\r\n return async (dispatch: any, getState: any) => {\r\n const projectState = selectProjectState(getState());\r\n if (projectState.activeProject) {\r\n await dispatch(\r\n updateAsyncPlenumDatas({\r\n guid: projectState.activeProject?.guid,\r\n plenumdata: plenumdata,\r\n })\r\n );\r\n }\r\n };\r\n};\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IProjectArticle {\r\n projectArticleID: number;\r\n articleNumber: string;\r\n name: string;\r\n amount: number;\r\n quantity: number;\r\n quantityPerItem: number;\r\n}\r\n\r\nexport const getProjectArticles = async (guid: string) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/ProjectArticle/' + guid, config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getProjectArticles } from 'application/project/api/ProjectArticle';\r\nimport { selectProjectState } from 'redux/store';\r\n\r\nfunction timeout(ms: number) {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport const fetchAsyncProjectArticles = createAsyncThunk(\r\n 'project/extraComponent/fetchAsyncProjectArticles',\r\n async (data: { guid: string; delay: number }, thunkAPI) => {\r\n if (data.delay > 0) {\r\n await timeout(data.delay);\r\n }\r\n return await getProjectArticles(data.guid);\r\n }\r\n);\r\n\r\nexport const asyncInitProjectArticles = (lastUpdate: Date) => {\r\n return (dispatch: any, getState: any) => {\r\n var difference = new Date().getTime() - lastUpdate.getTime();\r\n const compare = 2500;\r\n const delay = Math.max(0, compare - difference);\r\n\r\n const projectState = selectProjectState(getState());\r\n if ((!projectState.projectArticles.valid || delay > 0) && projectState.activeProject) {\r\n dispatch(fetchAsyncProjectArticles({ guid: projectState.activeProject.guid, delay: delay }));\r\n }\r\n };\r\n};\r\n","export enum RoleName {\r\n EditComponent,\r\n Calculator,\r\n SystemAdmin,\r\n Experimental,\r\n}\r\n\r\nexport interface commonState {\r\n user?: {\r\n contactName: string;\r\n userEmail: string;\r\n userID: string;\r\n language: string;\r\n roles: string[];\r\n //flowUnitID: enFlowUnit;\r\n expires_at: string;\r\n expires_in: number;\r\n };\r\n\r\n pageTitle: string;\r\n pageSubTitle: string;\r\n}\r\n\r\nexport const initialState: commonState = {\r\n user: undefined,\r\n pageTitle: '',\r\n pageSubTitle: '',\r\n};\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IProjectExtraComponent {\r\n projectExtraComponentID: number;\r\n extraComponentID: number;\r\n amount?: number;\r\n}\r\n\r\nexport const getProjectExtraComponents = async (guid: string) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/ProjectExtraComponent/' + guid, config);\r\n return response.data;\r\n};\r\n\r\nexport const getProjectExtraComponent = async (guid: string, projectExtraComponentID: number) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/ProjectExtraComponent/' + guid + '/' + projectExtraComponentID, config);\r\n return response.data;\r\n};\r\n\r\nexport const updateProjectExtraComponent = async (guid: string, projectExtraComponent: IProjectExtraComponent) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.post('api/ProjectExtraComponent/' + guid, projectExtraComponent, config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport {\r\n getProjectExtraComponent,\r\n getProjectExtraComponents,\r\n IProjectExtraComponent,\r\n updateProjectExtraComponent,\r\n} from 'application/project/api/ProjectExtraComponent';\r\nimport { selectProjectState } from 'redux/store';\r\n\r\nexport const fetchAsyncProjectExtraComponent = createAsyncThunk(\r\n 'project/extraComponent/fetchAsyncProjectExtraComponent',\r\n async (data: { guid: string; projectExtraComponentID: number }, thunkAPI) => {\r\n const response = await getProjectExtraComponent(data.guid, data.projectExtraComponentID);\r\n return response;\r\n }\r\n);\r\n\r\nexport const fetchAsyncProjectExtraComponents = createAsyncThunk(\r\n 'project/extraComponent/fetchAsyncProjectExtraComponents',\r\n async (data: { guid: string }, thunkAPI) => {\r\n const response = await getProjectExtraComponents(data.guid);\r\n return response;\r\n }\r\n);\r\n\r\nexport const updateAsyncProjectExtraComponent = createAsyncThunk(\r\n 'project/extraComponent/updateAsyncProjectExtraComponent',\r\n async (\r\n data: {\r\n guid: string;\r\n projectExtraComponent: IProjectExtraComponent;\r\n },\r\n thunkAPI\r\n ) => {\r\n const response = await updateProjectExtraComponent(data.guid, data.projectExtraComponent);\r\n return response;\r\n }\r\n);\r\n\r\nexport const updateProjectExtraComponentThunk = (projectExtraComponent: IProjectExtraComponent) => {\r\n return async (dispatch: any, getState: any) => {\r\n const projectState = selectProjectState(getState());\r\n if (projectState.activeProject) {\r\n await dispatch(\r\n updateAsyncProjectExtraComponent({\r\n guid: projectState.activeProject?.guid,\r\n projectExtraComponent: projectExtraComponent,\r\n })\r\n );\r\n }\r\n };\r\n};\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport { PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { WritableDraft } from 'immer/dist/internal';\r\nimport nameof from 'ts-nameof.macro';\r\nimport {\r\n ConnectionDirty,\r\n IApiPlenumConnection,\r\n IApiSection,\r\n IApiSectionBend,\r\n IApiValveConnection,\r\n IPlenumConnection,\r\n ISection,\r\n IValveConnection,\r\n newValveConnection,\r\n} from '../api/Connection';\r\nimport { IEppDataComponent } from '../api/EppDataComponent';\r\nimport { valveConnectionAdapter } from './adapters/valveConnectionAdapter';\r\nimport { eppDataAdapter, GetEppDataID } from './adapters/eppDataAdapter';\r\nimport { eppDataComponentAdapter } from './adapters/eppDataComponentAdapter';\r\nimport { plenumConnectionAdapter, plenumConnectionKeyIntern } from './adapters/plenumConnectionAdapter';\r\nimport { plenumDataAdapter } from './adapters/plenumDataAdapter';\r\nimport { projectArticleAdapter } from './adapters/projectArticleAdapter';\r\nimport { projectExtraComponentAdapter } from './adapters/projectExtraComponentAdapter';\r\nimport { sectionAdapter, sectionKey } from './adapters/sectionAdapter';\r\nimport { sectionBendAdapter } from './adapters/sectionBendAdapter';\r\nimport { initialState, projectState } from './projectState';\r\nimport { fetchAsyncConnections } from './thunks/AsyncConnection';\r\nimport { updateAsyncConnection } from './thunks/AsyncConnectionUpdate';\r\nimport { fetchAsyncEppDatas, updateAsyncEppDatas } from './thunks/AsyncEppData';\r\nimport { fetchAsyncEppDataComponents, updateAsyncEppDataComponent } from './thunks/AsyncEppDataComponent';\r\nimport { fetchAsyncPlenumDatas, updateAsyncPlenumDatas } from './thunks/AsyncPlenumData';\r\nimport { fetchAsyncProjectArticles } from './thunks/AsyncProjectArticle';\r\nimport {\r\n fetchAsyncProjectExtraComponents,\r\n updateAsyncProjectExtraComponent,\r\n} from './thunks/AsyncProjectExtraComponent';\r\n\r\nconst apiSectionBend2redux = (\r\n apiSectionBend: IApiSectionBend,\r\n valveConnectionKey: string,\r\n plenumConnectionIndex: number,\r\n sectionIndex: number,\r\n state: WritableDraft\r\n) => {\r\n //sections eruit halen\r\n const { ...sectionBend } = { ...apiSectionBend };\r\n\r\n sectionBend.valveConnectionKey = valveConnectionKey;\r\n sectionBend.plenumConnectionIndex = plenumConnectionIndex;\r\n sectionBend.sectionIndex = sectionIndex;\r\n\r\n //bijwerken/insert van de plenumConnection\r\n sectionBendAdapter.upsertOne(state.sectionbends, sectionBend);\r\n};\r\n\r\nconst apiSection2redux = (\r\n apiSection: IApiSection,\r\n valveConnectionKey: string,\r\n plenumConnectionIndex: number,\r\n state: WritableDraft\r\n) => {\r\n //sections eruit halen\r\n const { bends, ...section } = apiSection;\r\n\r\n section.valveConnectionKey = valveConnectionKey;\r\n section.plenumConnectionIndex = plenumConnectionIndex;\r\n\r\n //bijwerken/insert van de plenumConnection\r\n sectionAdapter.upsertOne(state.sections, section);\r\n\r\n bends.forEach((bend) => {\r\n apiSectionBend2redux(bend, valveConnectionKey, plenumConnectionIndex, section.indexNumber, state);\r\n });\r\n};\r\n\r\nconst apiPlenumConnection2redux = (\r\n apiPlenumConnection: IApiPlenumConnection,\r\n valveConnectionKey: string,\r\n supply: PlenumDataSupply,\r\n state: WritableDraft\r\n) => {\r\n //sections eruit halen\r\n const { sections, ...plenumConnection } = apiPlenumConnection;\r\n\r\n plenumConnection.valveConnectionKey = valveConnectionKey;\r\n plenumConnection.supply = supply;\r\n\r\n //bijwerken/insert van de plenumConnection\r\n plenumConnectionAdapter.upsertOne(state.plenumConnections, plenumConnection);\r\n\r\n sections.forEach((section) => {\r\n apiSection2redux(section, valveConnectionKey, plenumConnection.indexNumber, state);\r\n });\r\n};\r\n\r\nconst apiValveConnection2redux = (apiConnection: IApiValveConnection, state: WritableDraft) => {\r\n //plenumConnections eruit halen\r\n const { plenumConnections, ...valveConnection } = apiConnection;\r\n\r\n const currentConnections = valveConnectionAdapter.getSelectors().selectAll(state.valveConnections);\r\n const currentItem = currentConnections.find((a) => a.valveConnectionID === valveConnection.valveConnectionID);\r\n if (currentItem) {\r\n valveConnection.valveConnectionKey = currentItem.valveConnectionKey;\r\n }\r\n valveConnection.dirty = ConnectionDirty.saved;\r\n\r\n if (!valveConnection.valveConnectionKey) {\r\n state.connectionKeyCounter = state.connectionKeyCounter + 1;\r\n valveConnection.valveConnectionKey = state.connectionKeyCounter.toString();\r\n valveConnectionAdapter.addOne(state.valveConnections, valveConnection);\r\n } else {\r\n valveConnectionAdapter.updateOne(state.valveConnections, {\r\n id: valveConnection.valveConnectionKey,\r\n changes: valveConnection,\r\n });\r\n }\r\n\r\n plenumConnections.forEach((plenumConnection) => {\r\n apiPlenumConnection2redux(plenumConnection, valveConnection.valveConnectionKey, valveConnection.supply, state);\r\n });\r\n};\r\n\r\n// functions\r\nexport const projectSlice = createSlice({\r\n name: 'project',\r\n initialState,\r\n reducers: {\r\n activeProjectChanged(state, action) {\r\n // ✅ This \"mutating\" code is okay inside of createSlice!\r\n state.activeProject = action.payload;\r\n projectArticleAdapter.removeAll(state.projectArticles);\r\n state.projectArticles.valid = false;\r\n },\r\n setActiveConnection(state, action) {\r\n plenumDataAdapter.updateOne(state.plenumdatas, {\r\n id: action.payload.supply,\r\n changes: { activeConnectionKey: action.payload.valveConnectionKey },\r\n });\r\n },\r\n LanguageChanged(state, action) {\r\n // ✅ This \"mutating\" code is okay inside of createSlice!\r\n projectArticleAdapter.removeAll(state.projectArticles);\r\n state.projectArticles.valid = false;\r\n },\r\n updateSectionBend(state, action) {\r\n sectionBendAdapter.upsertOne(state.sectionbends, {\r\n valveConnectionKey: (action.payload.section as ISection).valveConnectionKey,\r\n plenumConnectionIndex: (action.payload.section as ISection).plenumConnectionIndex,\r\n sectionIndex: (action.payload.section as ISection).indexNumber,\r\n bendID: action.payload.bendID,\r\n amount: action.payload.amount,\r\n });\r\n },\r\n updateSection(state, action) {\r\n if (action.payload.name === nameof((a) => a.ductAdapterID)) {\r\n //we hebben een adapter, of niet\r\n const item = sectionAdapter.getSelectors().selectById(state.sections, action.payload.id);\r\n if (!item) return;\r\n const sections = sectionAdapter\r\n .getSelectors()\r\n .selectAll(state.sections)\r\n .filter(\r\n (a) =>\r\n a.valveConnectionKey === item?.valveConnectionKey &&\r\n a.plenumConnectionIndex === item.plenumConnectionIndex\r\n );\r\n\r\n if (!item.ductAdapterID && action.payload.value > 0 && sections.indexOf(item) === sections.length - 1) {\r\n //we hebben op de laatste positie een adapter\r\n //dan een nieuwe sectie toevoegen\r\n sectionAdapter.addOne(state.sections, {\r\n valveConnectionKey: item.valveConnectionKey,\r\n plenumConnectionIndex: item.plenumConnectionIndex,\r\n indexNumber: item.indexNumber + 1,\r\n } as ISection);\r\n } else if (item.ductAdapterID && !action.payload.value && sections.indexOf(item) < sections.length - 1) {\r\n //we hebben verwijderen op niet de laatste positie de adapter\r\n //dan alles secties hierna weggooien\r\n sectionAdapter.removeMany(\r\n state.sections,\r\n sections.splice(sections.indexOf(item) + 1).map((a) => sectionKey(a))\r\n );\r\n }\r\n }\r\n sectionAdapter.updateOne(state.sections, {\r\n id: action.payload.id,\r\n changes: { [action.payload.name]: action.payload.value },\r\n });\r\n },\r\n updatePlenumConnection(state, action) {\r\n plenumConnectionAdapter.updateOne(state.plenumConnections, {\r\n id: action.payload.id,\r\n changes: action.payload.plenumConnection,\r\n });\r\n },\r\n addValveConnection(state, action) {\r\n state.connectionKeyCounter = state.connectionKeyCounter + 1;\r\n\r\n const valveConnection: IValveConnection = {\r\n valveConnectionKey: state.connectionKeyCounter.toString(),\r\n supply: action.payload.supply,\r\n valveConnectionID: undefined,\r\n airflowRate: undefined,\r\n customValveResistance: undefined,\r\n valveConnectorGridID: action.payload.valveConnectorGridID,\r\n remove: undefined,\r\n description: '',\r\n dual: false,\r\n hasFilter: false,\r\n dirty: ConnectionDirty.dirty,\r\n };\r\n const plenumConnection: IPlenumConnection = {\r\n valveConnectionKey: valveConnection.valveConnectionKey,\r\n supply: valveConnection.supply,\r\n finalAirflowRate: undefined,\r\n connectionIndex: undefined,\r\n connectorRightAngled: false,\r\n restriction: '',\r\n indexNumber: 0,\r\n };\r\n const section: ISection = {\r\n valveConnectionKey: valveConnection.valveConnectionKey,\r\n plenumConnectionIndex: plenumConnection.indexNumber,\r\n ductID: action.payload.ductID,\r\n ductLenght: undefined,\r\n indexNumber: 0,\r\n ductAdapterID: undefined,\r\n };\r\n\r\n plenumDataAdapter.updateOne(state.plenumdatas, {\r\n id: action.payload.supply,\r\n changes: { activeConnectionKey: valveConnection.valveConnectionKey },\r\n });\r\n\r\n valveConnectionAdapter.addOne(state.valveConnections, valveConnection);\r\n plenumConnectionAdapter.addOne(state.plenumConnections, plenumConnection);\r\n sectionAdapter.addOne(state.sections, section);\r\n },\r\n deleteValveConnection(state, action) {\r\n valveConnectionAdapter.removeOne(state.valveConnections, action.payload.id);\r\n },\r\n updateValveConnection(state, action) {\r\n const valveConnection = valveConnectionAdapter\r\n .getSelectors()\r\n .selectById(state.valveConnections, action.payload.id);\r\n if (!valveConnection) return;\r\n\r\n if (action.payload.name === nameof((a) => a.dual)) {\r\n const plenumConnections = plenumConnectionAdapter\r\n .getSelectors()\r\n .selectAll(state.plenumConnections)\r\n .filter((a) => a.valveConnectionKey === valveConnection.valveConnectionKey);\r\n\r\n if (plenumConnections.length === 1 && action.payload.value) {\r\n plenumConnectionAdapter.addOne(state.plenumConnections, {\r\n valveConnectionKey: valveConnection.valveConnectionKey,\r\n indexNumber: 1,\r\n } as IPlenumConnection);\r\n } else if (plenumConnections.length === 2 && !action.payload.value) {\r\n plenumConnectionAdapter.removeOne(\r\n state.plenumConnections,\r\n plenumConnectionKeyIntern(valveConnection.valveConnectionKey, 1)\r\n );\r\n }\r\n }\r\n\r\n valveConnectionAdapter.updateOne(state.valveConnections, {\r\n id: action.payload.id,\r\n changes: { [action.payload.name]: action.payload.value },\r\n });\r\n },\r\n },\r\n extraReducers: (builder) => {\r\n builder //fetchEnginePriceLists\r\n //plenumdata\r\n .addCase(fetchAsyncPlenumDatas.pending, (state, action) => {\r\n state.plenumdatas.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncPlenumDatas.fulfilled, (state, action) => {\r\n plenumDataAdapter.setAll(state.plenumdatas, action.payload);\r\n state.plenumdatas.loading = 'idle';\r\n })\r\n .addCase(updateAsyncPlenumDatas.pending, (state, action) => {\r\n state.plenumdatas.saving = 'loading';\r\n })\r\n .addCase(updateAsyncPlenumDatas.fulfilled, (state, action) => {\r\n plenumDataAdapter.updateOne(state.plenumdatas, {\r\n id: action.meta.arg.plenumdata.supply,\r\n changes: { plenumID: action.payload.plenumID },\r\n });\r\n state.plenumdatas.saving = 'idle';\r\n state.projectArticles.valid = false;\r\n })\r\n //fetch connections\r\n .addCase(fetchAsyncConnections.pending, (state, action) => {\r\n state.valveConnections.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncConnections.fulfilled, (state, action) => {\r\n valveConnectionAdapter.removeAll(state.valveConnections);\r\n plenumConnectionAdapter.removeAll(state.plenumConnections);\r\n sectionAdapter.removeAll(state.sections);\r\n sectionBendAdapter.removeAll(state.sectionbends);\r\n action.payload.forEach((connection: IApiValveConnection) => {\r\n apiValveConnection2redux(connection, state);\r\n });\r\n state.valveConnections.loading = 'idle';\r\n })\r\n //update connection\r\n .addCase(updateAsyncConnection.pending, (state, action) => {\r\n state.valveConnections.saving = 'loading';\r\n if (!action.meta.arg.apiConnection.remove) {\r\n valveConnectionAdapter.updateOne(state.valveConnections, {\r\n id: action.meta.arg.apiConnection.valveConnectionKey,\r\n changes: { dirty: ConnectionDirty.saving },\r\n });\r\n }\r\n })\r\n .addCase(updateAsyncConnection.fulfilled, (state, action) => {\r\n //plenumdata vervangen\r\n state.projectArticles.valid = false;\r\n plenumDataAdapter.updateOne(state.plenumdatas, {\r\n id: action.payload.plenumData.supply,\r\n changes: action.payload.plenumData,\r\n });\r\n\r\n if (!action.meta.arg.apiConnection.remove) {\r\n action.payload.connections.forEach((connection: IApiValveConnection) => {\r\n apiValveConnection2redux(connection, state);\r\n });\r\n }\r\n state.valveConnections.loading = 'idle';\r\n })\r\n //eppdata\r\n .addCase(fetchAsyncEppDatas.pending, (state, action) => {\r\n state.eppdatas.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncEppDatas.fulfilled, (state, action) => {\r\n eppDataAdapter.setAll(state.eppdatas, action.payload);\r\n state.eppdatas.loading = 'idle';\r\n })\r\n //update eppdata\r\n .addCase(updateAsyncEppDatas.pending, (state, action) => {\r\n state.eppdatas.saving = 'loading';\r\n })\r\n .addCase(updateAsyncEppDatas.fulfilled, (state, action) => {\r\n //create a copy (IEppData)\r\n const changedItem = { ...action.payload };\r\n const remoteEppDataComponents: IEppDataComponent[] = changedItem.eppDataComponents;\r\n delete changedItem.eppDataComponents;\r\n\r\n eppDataAdapter.updateOne(state.eppdatas, {\r\n id: GetEppDataID(action.meta.arg.eppdata.supply, action.meta.arg.eppdata.inside),\r\n changes: changedItem,\r\n });\r\n\r\n //ale eppdatacomponents ophalen\r\n const eppDataComponentIDs = eppDataComponentAdapter\r\n .getSelectors()\r\n .selectAll(state.eppdatacomponents)\r\n .filter((a) => a.supply === action.meta.arg.eppdata.supply && a.inside === action.meta.arg.eppdata.inside)\r\n .map((a) => a.eppDataComponentID);\r\n //kijken welke er weg is, of aangepast.\r\n eppDataComponentAdapter.removeMany(state.eppdatacomponents, eppDataComponentIDs);\r\n eppDataComponentAdapter.addMany(state.eppdatacomponents, remoteEppDataComponents);\r\n\r\n state.projectArticles.valid = false;\r\n state.eppdatas.saving = 'idle';\r\n })\r\n //eppdatacomponents\r\n .addCase(fetchAsyncEppDataComponents.pending, (state, action) => {\r\n state.eppdatacomponents.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncEppDataComponents.fulfilled, (state, action) => {\r\n eppDataComponentAdapter.setAll(state.eppdatacomponents, action.payload);\r\n state.eppdatacomponents.loading = 'idle';\r\n })\r\n //update eppdatacomponents\r\n .addCase(updateAsyncEppDataComponent.pending, (state, action) => {\r\n state.eppdatacomponents.saving = 'loading';\r\n })\r\n .addCase(updateAsyncEppDataComponent.fulfilled, (state, action) => {\r\n eppDataComponentAdapter.upsertOne(state.eppdatacomponents, action.payload);\r\n state.projectArticles.valid = false;\r\n state.eppdatacomponents.saving = 'idle';\r\n })\r\n //ProjectExtraComponents\r\n .addCase(fetchAsyncProjectExtraComponents.pending, (state, action) => {\r\n state.projectExtraComponents.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncProjectExtraComponents.fulfilled, (state, action) => {\r\n projectExtraComponentAdapter.setAll(state.projectExtraComponents, action.payload);\r\n state.projectExtraComponents.loading = 'idle';\r\n })\r\n //update ProjectExtraComponents\r\n .addCase(updateAsyncProjectExtraComponent.pending, (state, action) => {\r\n state.projectExtraComponents.saving = 'loading';\r\n })\r\n .addCase(updateAsyncProjectExtraComponent.fulfilled, (state, action) => {\r\n projectExtraComponentAdapter.upsertOne(state.projectExtraComponents, action.payload);\r\n state.projectArticles.valid = false;\r\n state.projectExtraComponents.saving = 'idle';\r\n })\r\n //projectArticleAdapter\r\n .addCase(fetchAsyncProjectArticles.pending, (state, action) => {\r\n projectArticleAdapter.removeAll(state.projectArticles);\r\n state.projectArticles.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncProjectArticles.fulfilled, (state, action) => {\r\n projectArticleAdapter.setAll(state.projectArticles, action.payload);\r\n state.projectArticles.valid = true;\r\n state.projectArticles.loading = 'idle';\r\n });\r\n },\r\n});\r\n\r\nexport default projectSlice.reducer;\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IDuctAdapter } from 'application/components/api/DuctAdapter';\r\n\r\nexport const ductAdapterAdapter = createEntityAdapter({\r\n selectId: (project) => project.ductAdapterID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IEppColor } from 'application/components/api/EppColor';\r\n\r\nexport const eppColorAdapter = createEntityAdapter({\r\n selectId: (project) => project.eppColorID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IEppTerminalType } from 'application/components/api/EppTerminalType';\r\n\r\nexport const eppTerminalTypeAdapter = createEntityAdapter({\r\n selectId: (project) => project.eppTerminalTypeID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IEppDiameter } from 'application/components/api/EppDiameter';\r\n\r\nexport const eppDiameterAdapter = createEntityAdapter({\r\n selectId: (project) => project.eppDiameterID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IEppMaterial } from 'application/components/api/EppMaterial';\r\n\r\nexport const eppMaterialAdapter = createEntityAdapter({\r\n selectId: (project) => project.eppMaterialID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IEppTerminal } from 'application/components/api/EppTerminal';\r\n\r\nexport const eppTerminalAdapter = createEntityAdapter({\r\n selectId: (project) => project.eppTerminalID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IEppComponent } from 'application/components/api/EppComponent';\r\n\r\nexport const eppComponentAdapter = createEntityAdapter({\r\n selectId: (project) => project.eppComponentID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IEppType } from 'application/components/api/EppType';\r\n\r\nexport const eppTypeAdapter = createEntityAdapter({\r\n selectId: (project) => project.eppTypeID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IExtraComponent } from 'application/components/api/ExtraComponent';\r\n\r\nexport const extraComponentAdapter = createEntityAdapter({\r\n selectId: (project) => project.extraComponentID,\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IEppDamper } from 'application/components/api/EppDamper';\r\n\r\nexport const eppDamperAdapter = createEntityAdapter({\r\n selectId: (project) => project.eppDamperID,\r\n sortComparer: (a, b) => {\r\n let res = a.eppDamperTypeID - b.eppDamperTypeID;\r\n if (res === 0) res = a.eppDamperID - b.eppDamperID;\r\n return res;\r\n },\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IEppDamperType } from 'application/components/api/EppDamperTerminal';\r\n\r\nexport const eppDamperTypeAdapter = createEntityAdapter({\r\n selectId: (project) => project.eppDamperTypeID,\r\n});\r\n","import { ComponentEntityState, initialComponentEntityState } from 'redux/shared';\r\nimport { IBend } from '../api/Bend';\r\nimport { IDuct } from '../api/Duct';\r\nimport { IDuctAdapter } from '../api/DuctAdapter';\r\nimport { IEppColor } from '../api/EppColor';\r\nimport { IEppComponent } from '../api/EppComponent';\r\nimport { IEppDiameter } from '../api/EppDiameter';\r\nimport { IEppMaterial } from '../api/EppMaterial';\r\nimport { IEppTerminal } from '../api/EppTerminal';\r\nimport { IEppTerminalType } from '../api/EppTerminalType';\r\nimport { IEppType } from '../api/EppType';\r\nimport { IExtraComponent } from '../api/ExtraComponent';\r\nimport { IPlenum } from '../api/Plenum';\r\nimport { IValveConnectorGrid } from '../api/ValveConnectorGrid';\r\nimport { bendAdapter } from './adapters/bendAdapter';\r\nimport { ductAdapter } from './adapters/ductAdapter';\r\nimport { ductAdapterAdapter } from './adapters/ductAdapterAdapter';\r\nimport { eppColorAdapter } from './adapters/eppColorAdapter';\r\nimport { eppDiameterAdapter } from './adapters/eppDiameterAdapter';\r\nimport { eppMaterialAdapter } from './adapters/eppMaterialAdapter';\r\nimport { eppTerminalAdapter } from './adapters/eppTerminalAdapter';\r\nimport { eppTerminalTypeAdapter } from './adapters/eppTerminalTypeAdapter';\r\nimport { eppComponentAdapter } from './adapters/eppComponentAdapter';\r\nimport { eppTypeAdapter } from './adapters/eppTypeAdapter';\r\nimport { extraComponentAdapter } from './adapters/extraComponentAdapter';\r\nimport { plenumAdapter } from './adapters/plenumAdapter';\r\nimport { valveConnectorGridAdapter } from './adapters/valveConnectorGridAdapter';\r\nimport { IEppDamperType } from '../api/EppDamperTerminal';\r\nimport { IEppDamper } from '../api/EppDamper';\r\nimport { eppDamperAdapter } from './adapters/eppDamperAdapter';\r\nimport { eppDamperTypeAdapter } from './adapters/eppDamperTypeAdapter';\r\n\r\nexport interface componentState {\r\n bends: ComponentEntityState;\r\n ductadapters: ComponentEntityState;\r\n ducts: ComponentEntityState;\r\n eppColors: ComponentEntityState;\r\n eppComponents: ComponentEntityState;\r\n eppDiameters: ComponentEntityState;\r\n eppMaterials: ComponentEntityState;\r\n eppTerminalTypes: ComponentEntityState;\r\n eppTerminals: ComponentEntityState;\r\n eppDamperTypes: ComponentEntityState;\r\n eppDampers: ComponentEntityState;\r\n eppTypes: ComponentEntityState;\r\n extraComponents: ComponentEntityState;\r\n plenums: ComponentEntityState;\r\n valveConnectorGrids: ComponentEntityState;\r\n}\r\n\r\nexport const initialState: componentState = {\r\n bends: bendAdapter.getInitialState(initialComponentEntityState),\r\n ductadapters: ductAdapterAdapter.getInitialState(initialComponentEntityState),\r\n ducts: ductAdapter.getInitialState(initialComponentEntityState),\r\n eppColors: eppColorAdapter.getInitialState(initialComponentEntityState),\r\n eppComponents: eppComponentAdapter.getInitialState(initialComponentEntityState),\r\n eppDiameters: eppDiameterAdapter.getInitialState(initialComponentEntityState),\r\n eppMaterials: eppMaterialAdapter.getInitialState(initialComponentEntityState),\r\n eppTerminalTypes: eppTerminalTypeAdapter.getInitialState(initialComponentEntityState),\r\n eppTerminals: eppTerminalAdapter.getInitialState(initialComponentEntityState),\r\n eppDamperTypes: eppDamperTypeAdapter.getInitialState(initialComponentEntityState),\r\n eppDampers: eppDamperAdapter.getInitialState(initialComponentEntityState),\r\n eppTypes: eppTypeAdapter.getInitialState(initialComponentEntityState),\r\n extraComponents: extraComponentAdapter.getInitialState(initialComponentEntityState),\r\n plenums: plenumAdapter.getInitialState(initialComponentEntityState),\r\n valveConnectorGrids: valveConnectorGridAdapter.getInitialState(initialComponentEntityState),\r\n};\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IBend {\r\n bendID: number;\r\n name: string;\r\n bendTypeID: number;\r\n ductID: number;\r\n}\r\n\r\nexport const getBends = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/Bend', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getBends } from 'application/components/api/Bend';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncBends = createAsyncThunk(\r\n 'components/fetchAsyncBends',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getBends();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).bends.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IDuctAdapter {\r\n ductAdapterID: number;\r\n name: string;\r\n ductID1: number;\r\n ductID2: number;\r\n}\r\n\r\nexport const getDuctAdapters = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/DuctAdapter', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getDuctAdapters } from 'application/components/api/DuctAdapter';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncDuctAdapters = createAsyncThunk(\r\n 'components/fetchAsyncDuctAdapters',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getDuctAdapters();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).ductadapters.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IDuct {\r\n ductID: number;\r\n name: string;\r\n flowSupplyMin: number;\r\n flowSupplyMax: number;\r\n flowSupplyWarn: number;\r\n flowExtractionMin: number;\r\n flowExtractionMax: number;\r\n flowExtractionWarn: number;\r\n canRightAngled: boolean;\r\n}\r\n\r\nexport const getDucts = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/Duct', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getDucts } from 'application/components/api/Duct';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncDucts = createAsyncThunk(\r\n 'components/fetchAsyncDucts',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getDucts();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).ducts.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IEppColor {\r\n eppColorID: number;\r\n name: string;\r\n colorValue: number;\r\n}\r\n\r\nexport const getEppColors = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/EppColor', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getEppColors } from 'application/components/api/EppColor';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncEppColors = createAsyncThunk(\r\n 'components/fetchAsyncEppColor',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getEppColors();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).eppColors.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IEppComponent {\r\n eppComponentID: number;\r\n name: string;\r\n eppTypeID: number;\r\n eppDiameterID: number;\r\n eppMaterialID: number;\r\n}\r\n\r\nexport const getEppComponents = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/EppComponent', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getEppComponents } from 'application/components/api/EppComponent';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncEppComponents = createAsyncThunk(\r\n 'components/fetchAsyncEppComponents',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getEppComponents();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).eppComponents.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IEppDiameter {\r\n eppDiameterID: number;\r\n name: string;\r\n}\r\n\r\nexport const getEppDiameters = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/EppDiameter', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getEppDiameters } from 'application/components/api/EppDiameter';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncEppDiameters = createAsyncThunk(\r\n 'components/fetchAsyncEppDiameters',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getEppDiameters();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).eppDiameters.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IEppMaterial {\r\n eppMaterialID: number;\r\n name: string;\r\n}\r\n\r\nexport const getEppMaterials = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/EppMaterial', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getEppMaterials } from 'application/components/api/EppMaterial';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncEppMaterials = createAsyncThunk(\r\n 'components/fetchAsyncEppMaterial',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getEppMaterials();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).eppMaterials.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IEppTerminal {\r\n eppTerminalID: number;\r\n name: string;\r\n eppTerminalTypeID: number;\r\n eppColorID: number;\r\n eppDiameterID: number;\r\n}\r\n\r\nexport const getEppTerminals = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/EppTerminal', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getEppTerminals } from 'application/components/api/EppTerminal';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncEppTerminals = createAsyncThunk(\r\n 'components/fetchAsyncEppTerminal',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getEppTerminals();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).eppTerminals.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IEppTerminalType {\r\n eppTerminalTypeID: number;\r\n name: string;\r\n}\r\n\r\nexport const getEppTerminalTypes = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/EppTerminalType', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getEppTerminalTypes } from 'application/components/api/EppTerminalType';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncEppTerminalTypes = createAsyncThunk(\r\n 'components/fetchAsyncEppTerminalType',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getEppTerminalTypes();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).eppTerminalTypes.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IEppType {\r\n eppTypeID: number;\r\n name: string;\r\n}\r\n\r\nexport const getEppTypes = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/EppType', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getEppTypes } from 'application/components/api/EppType';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncEppTypes = createAsyncThunk(\r\n 'components/fetchAsyncEppType',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getEppTypes();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).eppTypes.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IExtraComponent {\r\n extraComponentID: number;\r\n name: string;\r\n imageID: number;\r\n extraComponentGroupID?: number;\r\n extraComponentGroupImageID?: number;\r\n extraComponentOrder?: number;\r\n extraComponentGroupOrder?: number;\r\n}\r\n\r\nexport const getExtraComponents = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/ExtraComponent', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getExtraComponents } from 'application/components/api/ExtraComponent';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncExtraComponents = createAsyncThunk(\r\n 'components/fetchAsyncExtraComponents',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getExtraComponents();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).extraComponents.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IPlenum {\r\n plenumID: number;\r\n name: string;\r\n numberConnections: number;\r\n maxFlowRate: number;\r\n canSupply: boolean;\r\n canExtraction: boolean;\r\n ductID: number;\r\n imageID: number;\r\n}\r\n\r\nexport const getPlenums = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/Plenum', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getPlenums } from 'application/components/api/Plenum';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncPlenums = createAsyncThunk(\r\n 'components/fetchAsyncPlenums',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getPlenums();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).plenums.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IValveConnectorGrid {\r\n valveConnectorGridID: number;\r\n name: string;\r\n valveConnectorID: number;\r\n valveGridID: number;\r\n imageID: number;\r\n valveGridImageID: number;\r\n\r\n supplyFlowMax: number;\r\n extractionFlowMax: number;\r\n supplyFlowMaxDuplex: number;\r\n extractionFlowMaxDuplex: number;\r\n\r\n supplyFlowWarn: number;\r\n extractionFlowWarn: number;\r\n supplyFlowWarnDuplex: number;\r\n extractionFlowWarnDuplex: number;\r\n\r\n canSupply: boolean;\r\n canExtraction: boolean;\r\n canDuplex: boolean;\r\n\r\n onlyWall: boolean;\r\n isCustom: boolean;\r\n valveConnectionID: number;\r\n valveDiameterID: number;\r\n plenumConnector: boolean;\r\n ductID: number;\r\n}\r\n\r\nexport const getValveConnectorGrids = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/ValveConnectorGrid', config);\r\n return response.data;\r\n};\r\n\r\nexport const uploadValveConnectorGridImage = async (valveConnectorGridID: number, file: any, name: string) => {\r\n // Create an object of formData\r\n const formData = new FormData();\r\n\r\n // Update the formData object\r\n formData.append('files', file, name);\r\n const response = await axios.post('api/ValveConnectorGrid/image/' + valveConnectorGridID, formData).then();\r\n return response.data;\r\n};\r\n\r\nexport const getValveConnectorGridImage = (valveConnectorGridID: number, imageID: number) => {\r\n return imageID ? 'api/ValveConnectorGrid/image/' + valveConnectorGridID + '/' + imageID : '';\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getValveConnectorGrids } from 'application/components/api/ValveConnectorGrid';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncValveConnectorGrids = createAsyncThunk(\r\n 'components/fetchAsyncValveConnectorGrids',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getValveConnectorGrids();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).valveConnectorGrids.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IEppDamper {\r\n eppDamperID: number;\r\n name: string;\r\n eppDamperTypeID: number;\r\n eppDiameterID: number;\r\n}\r\n\r\nexport const getEppDampers = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/EppDamper', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getEppDampers } from 'application/components/api/EppDamper';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncEppDampers = createAsyncThunk(\r\n 'components/fetchAsyncEppDampers',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getEppDampers();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).eppDampers.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IEppDamperType {\r\n eppDamperTypeID: number;\r\n name: string;\r\n}\r\n\r\nexport const getEppDamperTypes = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/EppDamperType', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getEppDamperTypes } from 'application/components/api/EppDamperTerminal';\r\nimport { selectComponentState } from 'redux/store';\r\n\r\nexport const fetchAsyncEppDamperTypes = createAsyncThunk(\r\n 'components/fetchAsyncEppDamperTypes',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getEppDamperTypes();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectComponentState(thunkAPI.getState()).eppDamperTypes.loading === 'init';\r\n },\r\n }\r\n);\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport { bendAdapter } from './adapters/bendAdapter';\r\nimport { ductAdapter } from './adapters/ductAdapter';\r\nimport { ductAdapterAdapter } from './adapters/ductAdapterAdapter';\r\nimport { eppColorAdapter } from './adapters/eppColorAdapter';\r\nimport { eppTerminalTypeAdapter } from './adapters/eppTerminalTypeAdapter';\r\nimport { eppDiameterAdapter } from './adapters/eppDiameterAdapter';\r\nimport { eppMaterialAdapter } from './adapters/eppMaterialAdapter';\r\nimport { eppTerminalAdapter } from './adapters/eppTerminalAdapter';\r\nimport { eppComponentAdapter } from './adapters/eppComponentAdapter';\r\nimport { eppTypeAdapter } from './adapters/eppTypeAdapter';\r\nimport { extraComponentAdapter } from './adapters/extraComponentAdapter';\r\nimport { plenumAdapter } from './adapters/plenumAdapter';\r\n//import { valveAdapter } from './adapters/valveAdapter';\r\nimport { valveConnectorGridAdapter } from './adapters/valveConnectorGridAdapter';\r\nimport { initialState } from './componentState';\r\nimport { fetchAsyncBends } from './thunks/fetchAsyncBends';\r\nimport { fetchAsyncDuctAdapters } from './thunks/fetchAsyncDuctAdapters';\r\nimport { fetchAsyncDucts } from './thunks/fetchAsyncDucts';\r\nimport { fetchAsyncEppColors } from './thunks/fetchAsyncEppColors';\r\nimport { fetchAsyncEppComponents } from './thunks/fetchAsyncEppComponents';\r\nimport { fetchAsyncEppDiameters } from './thunks/fetchAsyncEppDiameters';\r\nimport { fetchAsyncEppMaterials } from './thunks/fetchAsyncEppMaterials';\r\nimport { fetchAsyncEppTerminals } from './thunks/fetchAsyncEppTerminals';\r\nimport { fetchAsyncEppTerminalTypes } from './thunks/fetchAsyncEppTerminalTypes';\r\nimport { fetchAsyncEppTypes } from './thunks/fetchAsyncEppTypes';\r\nimport { fetchAsyncExtraComponents } from './thunks/fetchAsyncExtraComponents';\r\nimport { fetchAsyncPlenums } from './thunks/fetchAsyncPlenums';\r\nimport { fetchAsyncValveConnectorGrids } from './thunks/fetchAsyncValveConnectorGrids';\r\nimport { fetchAsyncEppDampers } from './thunks/fetchAsyncEppDamper';\r\nimport { fetchAsyncEppDamperTypes } from './thunks/fetchAsyncEppDamperTypes';\r\nimport { eppDamperAdapter } from './adapters/eppDamperAdapter';\r\nimport { eppDamperTypeAdapter } from './adapters/eppDamperTypeAdapter';\r\n//import { fetchAsyncValves } from './thunks/fetchAsyncValves';\r\n\r\n// functions\r\n\r\nexport const componentSlice = createSlice({\r\n name: 'component',\r\n initialState,\r\n reducers: {\r\n LanguageChanged(state, action) {\r\n // ✅ This \"mutating\" code is okay inside of createSlice!\r\n state.bends.loading = 'init';\r\n state.eppColors.loading = 'init';\r\n state.eppComponents.loading = 'init';\r\n state.eppDiameters.loading = 'init';\r\n state.eppMaterials.loading = 'init';\r\n state.eppTerminals.loading = 'init';\r\n state.eppTerminalTypes.loading = 'init';\r\n state.eppTypes.loading = 'init';\r\n state.extraComponents.loading = 'init';\r\n state.ductadapters.loading = 'init';\r\n state.ducts.loading = 'init';\r\n state.plenums.loading = 'init';\r\n state.valveConnectorGrids.loading = 'init';\r\n },\r\n },\r\n extraReducers: (builder) => {\r\n builder\r\n //bends\r\n .addCase(fetchAsyncBends.pending, (state, action) => {\r\n state.bends.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncBends.fulfilled, (state, action) => {\r\n bendAdapter.setAll(state.bends, action.payload);\r\n state.bends.loading = 'idle';\r\n })\r\n //EppColors\r\n .addCase(fetchAsyncEppColors.pending, (state, action) => {\r\n state.eppColors.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncEppColors.fulfilled, (state, action) => {\r\n eppColorAdapter.setAll(state.eppColors, action.payload);\r\n state.eppColors.loading = 'idle';\r\n })\r\n //EppComponents\r\n .addCase(fetchAsyncEppComponents.pending, (state, action) => {\r\n state.eppComponents.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncEppComponents.fulfilled, (state, action) => {\r\n eppComponentAdapter.setAll(state.eppComponents, action.payload);\r\n state.eppComponents.loading = 'idle';\r\n })\r\n //EppDiameters\r\n .addCase(fetchAsyncEppDiameters.pending, (state, action) => {\r\n state.eppDiameters.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncEppDiameters.fulfilled, (state, action) => {\r\n eppDiameterAdapter.setAll(state.eppDiameters, action.payload);\r\n state.eppDiameters.loading = 'idle';\r\n })\r\n //EppMaterials\r\n .addCase(fetchAsyncEppMaterials.pending, (state, action) => {\r\n state.eppMaterials.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncEppMaterials.fulfilled, (state, action) => {\r\n eppMaterialAdapter.setAll(state.eppMaterials, action.payload);\r\n state.eppMaterials.loading = 'idle';\r\n })\r\n //EppTerminals\r\n .addCase(fetchAsyncEppTerminals.pending, (state, action) => {\r\n state.eppTerminals.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncEppTerminals.fulfilled, (state, action) => {\r\n eppTerminalAdapter.setAll(state.eppTerminals, action.payload);\r\n state.eppTerminals.loading = 'idle';\r\n })\r\n //EppTerminalTypes\r\n .addCase(fetchAsyncEppTerminalTypes.pending, (state, action) => {\r\n state.eppTerminalTypes.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncEppTerminalTypes.fulfilled, (state, action) => {\r\n eppTerminalTypeAdapter.setAll(state.eppTerminalTypes, action.payload);\r\n state.eppTerminalTypes.loading = 'idle';\r\n })\r\n //EppDampers\r\n .addCase(fetchAsyncEppDampers.pending, (state, action) => {\r\n state.eppDampers.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncEppDampers.fulfilled, (state, action) => {\r\n eppDamperAdapter.setAll(state.eppDampers, action.payload);\r\n state.eppDampers.loading = 'idle';\r\n })\r\n //EppDamperTypes\r\n .addCase(fetchAsyncEppDamperTypes.pending, (state, action) => {\r\n state.eppDamperTypes.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncEppDamperTypes.fulfilled, (state, action) => {\r\n eppDamperTypeAdapter.setAll(state.eppDamperTypes, action.payload);\r\n state.eppDamperTypes.loading = 'idle';\r\n })\r\n //EppTypes\r\n .addCase(fetchAsyncEppTypes.pending, (state, action) => {\r\n state.eppTypes.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncEppTypes.fulfilled, (state, action) => {\r\n eppTypeAdapter.setAll(state.eppTypes, action.payload);\r\n state.eppTypes.loading = 'idle';\r\n })\r\n //ExtraComponents\r\n .addCase(fetchAsyncExtraComponents.pending, (state, action) => {\r\n state.extraComponents.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncExtraComponents.fulfilled, (state, action) => {\r\n extraComponentAdapter.setAll(state.extraComponents, action.payload);\r\n state.extraComponents.loading = 'idle';\r\n })\r\n //ductAdapters\r\n .addCase(fetchAsyncDuctAdapters.pending, (state, action) => {\r\n state.ductadapters.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncDuctAdapters.fulfilled, (state, action) => {\r\n ductAdapterAdapter.setAll(state.ductadapters, action.payload);\r\n state.ductadapters.loading = 'idle';\r\n })\r\n //ducs\r\n .addCase(fetchAsyncDucts.pending, (state, action) => {\r\n state.ducts.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncDucts.fulfilled, (state, action) => {\r\n ductAdapter.setAll(state.ducts, action.payload);\r\n state.ducts.loading = 'idle';\r\n })\r\n //plenums\r\n .addCase(fetchAsyncPlenums.pending, (state, action) => {\r\n state.plenums.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncPlenums.fulfilled, (state, action) => {\r\n plenumAdapter.setAll(state.plenums, action.payload);\r\n state.plenums.loading = 'idle';\r\n })\r\n //valveConnectorGrids\r\n .addCase(fetchAsyncValveConnectorGrids.pending, (state, action) => {\r\n state.valveConnectorGrids.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncValveConnectorGrids.fulfilled, (state, action) => {\r\n valveConnectorGridAdapter.setAll(state.valveConnectorGrids, action.payload);\r\n state.valveConnectorGrids.loading = 'idle';\r\n });\r\n },\r\n});\r\n\r\nexport default componentSlice.reducer;\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\nimport nameof from 'ts-nameof.macro';\r\n\r\nexport enum enFlowUnit {\r\n m3_h = 1,\r\n dm3_s = 2,\r\n}\r\n\r\nexport interface IProject {\r\n guid: string;\r\n title: string;\r\n description: string;\r\n address: string;\r\n advizer: string;\r\n date: string;\r\n ductTypeID: number;\r\n ductType: string;\r\n ventilationTypeID: number;\r\n ventilationType: string;\r\n heatRecoveryUnitID?: number;\r\n heatRecoveryUnit?: string;\r\n valveDiameterID: number;\r\n valveDiameter: string;\r\n flowUnitID: enFlowUnit;\r\n experimental: boolean;\r\n attributes: string[];\r\n}\r\n\r\nexport const getProjectObject = (project?: IProject): IProject => {\r\n if (project) {\r\n return { ...project };\r\n } else {\r\n return {\r\n guid: '',\r\n title: '',\r\n description: '',\r\n address: '',\r\n advizer: '',\r\n date: new Date().toISOString(),\r\n ductTypeID: 1,\r\n ductType: '',\r\n ventilationTypeID: 1,\r\n ventilationType: '',\r\n valveDiameterID: 0,\r\n valveDiameter: '',\r\n flowUnitID: enFlowUnit.dm3_s,\r\n experimental: false,\r\n attributes: [],\r\n };\r\n }\r\n};\r\n\r\nconst mapProject = (project: any): IProject => {\r\n return {\r\n ...project,\r\n experimental: project.attributes?.includes(nameof((a) => a.experimental)) || false,\r\n };\r\n};\r\n\r\nexport const getProjects = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/project', config);\r\n if (!response) return undefined;\r\n return response.data.map((project: any) => mapProject(project));\r\n};\r\n\r\nexport const getProject = async (guid: string) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/project/' + guid, config);\r\n return mapProject(response.data);\r\n};\r\n\r\nexport const createProject = async (project: IProject) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.post('api/project', project, config);\r\n return mapProject(response.data);\r\n};\r\n\r\nexport const copyProject = async (project: IProject) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.post('api/project/' + project.guid, project, config);\r\n return mapProject(response.data);\r\n};\r\n\r\nconst addRemoveAttribute = (attributes: string[], name: string, value: boolean) => {\r\n let newAttributes = [...attributes];\r\n const index = newAttributes.indexOf(name);\r\n if (value && index === -1) newAttributes.push(name);\r\n else if (!value && index >= 0) newAttributes = newAttributes.filter((a) => a === name);\r\n return newAttributes;\r\n};\r\n\r\nexport const updateProject = async (project: IProject) => {\r\n const config = await bearerTokenHeader();\r\n let attributes = addRemoveAttribute(project.attributes, nameof(project.experimental), project.experimental);\r\n const response = await axios.put('api/project/' + project.guid, { ...project, attributes: attributes }, config);\r\n return mapProject(response.data);\r\n};\r\n\r\nexport const deleteProject = async (project: IProject) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.delete('api/project/' + project.guid, config);\r\n return mapProject(response.data);\r\n};\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport { initialState } from './commonState';\r\n\r\n// functions\r\n\r\nexport const commonSlice = createSlice({\r\n name: 'common',\r\n initialState,\r\n reducers: {\r\n userChanged(state, action) {\r\n // ✅ This \"mutating\" code is okay inside of createSlice!\r\n if (!action.payload) {\r\n state.user = undefined;\r\n } else {\r\n state.user = {\r\n contactName: action.payload.contactName,\r\n userEmail: action.payload.userEmail,\r\n userID: action.payload.userID,\r\n language: action.payload.language,\r\n roles: action.payload.roles,\r\n expires_at: action.payload.expires_at,\r\n expires_in: action.payload.expires_in,\r\n };\r\n }\r\n },\r\n pageTitleChanged(state, action) {\r\n // ✅ This \"mutating\" code is okay inside of createSlice!\r\n state.pageTitle = action.payload;\r\n },\r\n LanguageChanged(state, action) {\r\n // ✅ This \"mutating\" code is okay inside of createSlice!\r\n if (state.user) {\r\n state.user.language = action.payload;\r\n }\r\n },\r\n },\r\n});\r\n\r\nexport default commonSlice.reducer;\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IValveConnectorEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorEdit';\r\n\r\nexport const valveConnectorEditAdapter = createEntityAdapter({\r\n selectId: (project) => project.valveConnectorID,\r\n sortComparer: (a, b) => a.name.localeCompare(b.name),\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IValveConnectorGridEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorGridEdit';\r\n\r\nexport const valveConnectorGridEditAdapter = createEntityAdapter({\r\n selectId: (project) => project.valveConnectorGridID,\r\n //sortComparer: (a, b) => a.valveConnector.localeCompare(b.valveConnector),\r\n});\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IValveGridEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveGridEdit';\r\n\r\nexport const valveGridEditAdapter = createEntityAdapter({\r\n selectId: (project) => project.valveGridID,\r\n sortComparer: (a, b) => a.name.localeCompare(b.name),\r\n});\r\n","import {\r\n ComponentEntityState,\r\n initialComponentEntityState,\r\n initialLoadingEntityState,\r\n LoadingEntityState,\r\n} from 'redux/shared';\r\nimport { IValveConnectorEdit } from '../api/ValveConnectorGrid/ValveConnectorEdit';\r\nimport { IValveConnectorGridEdit } from '../api/ValveConnectorGrid/ValveConnectorGridEdit';\r\nimport { IValveGridEdit } from '../api/ValveConnectorGrid/ValveGridEdit';\r\nimport { valveConnectorEditAdapter } from './adapters/valveConnectorEditAdapter';\r\nimport { valveConnectorGridEditAdapter } from './adapters/valveConnectorGridEditAdapter';\r\nimport { valveGridEditAdapter } from './adapters/valveGridEditAdapter';\r\n\r\nexport interface compeditState {\r\n valveConnectorGrids: LoadingEntityState;\r\n valveConnectors: ComponentEntityState;\r\n valveGrids: ComponentEntityState;\r\n}\r\n\r\nexport const initialState: compeditState = {\r\n valveConnectorGrids: valveConnectorGridEditAdapter.getInitialState(initialLoadingEntityState),\r\n valveConnectors: valveConnectorEditAdapter.getInitialState(initialComponentEntityState),\r\n valveGrids: valveGridEditAdapter.getInitialState(initialComponentEntityState),\r\n};\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IValveConnectorGridEdit {\r\n valveConnectorGridID: number;\r\n valveConnectorID: number;\r\n valveConnector: string;\r\n valveGridID: number;\r\n valveGrid: string;\r\n\r\n supplyZeta: number;\r\n supplyFlowMax: number;\r\n supplyZetaDuplex: number;\r\n supplyFlowMaxDuplex: number;\r\n\r\n extractionZeta: number;\r\n extractionFlowMax: number;\r\n extractionZetaDuplex: number;\r\n extractionFlowMaxDuplex: number;\r\n\r\n imageID: number;\r\n}\r\n\r\nexport const getValveConnectorGridsEdit = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/ValveConnectorGrid/edit', config);\r\n return response.data;\r\n};\r\n\r\nexport const updateValveConnectorGridsEdit = async (grid: IValveConnectorGridEdit) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.post('api/ValveConnectorGrid/edit', grid, config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getValveConnectorGridsEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorGridEdit';\r\nimport { selectCompEditState } from 'redux/store';\r\n\r\nexport const fetchAsyncValveConnectorGridsEdit = createAsyncThunk(\r\n 'editcomp/fetchAsyncValveConnectorGridsEdit',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getValveConnectorGridsEdit();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectCompEditState(thunkAPI.getState()).valveConnectorGrids.loading === 'init';\r\n },\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getValveConnectorGridsEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorGridEdit';\r\nimport { selectCompEditState } from 'redux/store';\r\n\r\nexport const fetchAsyncValveConnectorsEdit = createAsyncThunk(\r\n 'editcomp/updateAsyncValveConnectorGridEdit',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getValveConnectorGridsEdit();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectCompEditState(thunkAPI.getState()).valveConnectorGrids.loading === 'init';\r\n },\r\n }\r\n);\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IValveGridEdit {\r\n valveGridID: number;\r\n name: string;\r\n enArticle: string;\r\n canSupply: boolean;\r\n canExtraction: boolean;\r\n flowSupplyMax: boolean;\r\n flowExtractionMax: boolean;\r\n plenumConnector: boolean;\r\n isCustom: boolean;\r\n onlyWall: boolean;\r\n articleID: number;\r\n article: string;\r\n articleNumber: string;\r\n gridImageID: number;\r\n}\r\n\r\nexport const getValveGridsEdit = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/ValveGrid/edit', config);\r\n return response.data;\r\n};\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getValveGridsEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveGridEdit';\r\nimport { selectCompEditState } from 'redux/store';\r\n\r\nexport const fetchAsyncValveGridsEdit = createAsyncThunk(\r\n 'editcomp/fetchAsyncValveGridsEdit',\r\n async (data: {}, thunkAPI) => {\r\n const response = await getValveGridsEdit();\r\n return response;\r\n },\r\n {\r\n condition(arg, thunkAPI) {\r\n return selectCompEditState(thunkAPI.getState()).valveGrids.loading === 'init';\r\n },\r\n }\r\n);\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport { valveConnectorEditAdapter } from './adapters/valveConnectorEditAdapter';\r\nimport { valveConnectorGridEditAdapter } from './adapters/valveConnectorGridEditAdapter';\r\nimport { valveGridEditAdapter } from './adapters/valveGridEditAdapter';\r\n\r\nimport { initialState } from './editcompState';\r\nimport { fetchAsyncValveConnectorGridsEdit } from './thunks/fetchAsyncValveConnectorGridsEdit';\r\nimport { fetchAsyncValveConnectorsEdit } from './thunks/fetchAsyncValveConnectorsEdit';\r\nimport { fetchAsyncValveGridsEdit } from './thunks/fetchAsyncValveGridsEdit';\r\n// functions\r\n\r\nexport const editcompSlice = createSlice({\r\n name: 'editcomp',\r\n initialState,\r\n reducers: {\r\n Refresh(state, action) {\r\n // ✅ This \"mutating\" code is okay inside of createSlice!\r\n state.valveConnectorGrids.loading = 'init';\r\n state.valveConnectors.loading = 'init';\r\n state.valveGrids.loading = 'init';\r\n },\r\n },\r\n extraReducers: (builder) => {\r\n builder\r\n .addCase(fetchAsyncValveConnectorGridsEdit.pending, (state, action) => {\r\n state.valveConnectorGrids.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncValveConnectorGridsEdit.fulfilled, (state, action) => {\r\n valveConnectorGridEditAdapter.setAll(state.valveConnectorGrids, action.payload);\r\n state.valveConnectorGrids.loading = 'idle';\r\n })\r\n .addCase(fetchAsyncValveConnectorsEdit.pending, (state, action) => {\r\n state.valveConnectors.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncValveConnectorsEdit.fulfilled, (state, action) => {\r\n valveConnectorEditAdapter.setAll(state.valveConnectors, action.payload);\r\n state.valveConnectors.loading = 'idle';\r\n })\r\n .addCase(fetchAsyncValveGridsEdit.pending, (state, action) => {\r\n state.valveGrids.loading = 'loading';\r\n })\r\n .addCase(fetchAsyncValveGridsEdit.fulfilled, (state, action) => {\r\n valveGridEditAdapter.setAll(state.valveGrids, action.payload);\r\n state.valveGrids.loading = 'idle';\r\n });\r\n },\r\n});\r\n\r\nexport default editcompSlice.reducer;\r\n","import { configureStore } from '@reduxjs/toolkit';\r\nimport projectReducer from '../application/project/redux/projectSlice';\r\nimport componentReducer from '../application/components/redux/componentSlice';\r\nimport commonReducer from '../application/common/redux/commonSlice';\r\nimport editcompReducer from '../application/editcomp/redux/editcompSlice';\r\nimport { projectState } from '../application/project/redux/projectState';\r\nimport { componentState } from '../application/components/redux/componentState';\r\nimport { commonState } from '../application/common/redux/commonState';\r\nimport { compeditState } from 'application/editcomp/redux/editcompState';\r\n\r\nexport const store = configureStore({\r\n reducer: {\r\n project: projectReducer,\r\n component: componentReducer,\r\n common: commonReducer,\r\n editcomp: editcompReducer,\r\n },\r\n devTools: process.env.NODE_ENV === 'development',\r\n});\r\n\r\nexport default store;\r\n\r\nexport const selectProjectState = (state: any): projectState => {\r\n return state['project'];\r\n};\r\n\r\nexport const selectComponentState = (state: any): componentState => {\r\n return state['component'];\r\n};\r\n\r\nexport const selectCommonState = (state: any): commonState => {\r\n return state['common'];\r\n};\r\n\r\nexport const selectCompEditState = (state: any): compeditState => {\r\n return state['editcomp'];\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { selectProjectState } from 'redux/store';\r\nimport { projectArticleAdapter } from '../adapters/projectArticleAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllProjectArticles,\r\n selectById: selectProjectArticleById,\r\n selectEntities: selectProjectArticleEntities,\r\n} = projectArticleAdapter.getSelectors((state) => selectProjectState(state).projectArticles);\r\n\r\nexport const projectArticlesLoading = createSelector(\r\n (state: any) => selectProjectState(state).projectArticles,\r\n (articles) => !articles.valid || articles.loading === 'loading'\r\n);\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { enFlowUnit } from 'application/project/api/Project';\r\nimport { selectProjectState } from 'redux/store';\r\n\r\nexport const selectActiveProject = createSelector(selectProjectState, (projectState) => projectState.activeProject);\r\n\r\nexport const selectFlowUnitID = createSelector(\r\n (state: any) => selectProjectState(state).activeProject?.flowUnitID,\r\n (flowUnitID) => flowUnitID ?? enFlowUnit.m3_h\r\n);\r\n","import { makeStyles, createTheme, createStyles, Theme } from '@material-ui/core/styles';\r\n\r\nexport const useGlobalStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {},\r\n paper: {\r\n padding: theme.spacing(2),\r\n width: '100%',\r\n marginTop: theme.spacing(2),\r\n },\r\n regularContentWidth: {\r\n maxWidth: 940,\r\n },\r\n regularContent: {\r\n maxWidth: 940,\r\n padding: theme.spacing(2),\r\n },\r\n roomContent: {\r\n padding: theme.spacing(2),\r\n },\r\n })\r\n);\r\n\r\nexport const globalTheme = createTheme({\r\n palette: {\r\n primary: {\r\n main: '#006699',\r\n },\r\n secondary: {\r\n main: '#ee7203',\r\n },\r\n text: {\r\n primary: '#666666',\r\n },\r\n divider: '#006699',\r\n },\r\n typography: {\r\n // In Chinese and Japanese the characters are usually larger,\r\n // so a smaller fontsize may be appropriate.\r\n fontSize: 14,\r\n fontFamily: 'Open Sans, sans-serif',\r\n\r\n h6: {\r\n fontWeight: 600,\r\n },\r\n },\r\n});\r\n","import * as React from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\nimport clsx from 'clsx';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faAngleRight } from '@fortawesome/free-solid-svg-icons';\r\n\r\nexport const useActionButtonStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n display: 'block',\r\n marginBottom: 21.74,\r\n maxWidth: '100%',\r\n },\r\n link: {\r\n color: '#ffffff !important',\r\n display: 'inline-block',\r\n paddingLeft: 20,\r\n paddingRight: 48,\r\n paddingTop: 14,\r\n paddingBottom: 14,\r\n backgroundColor: theme.palette.secondary.main,\r\n fontWeight: 600,\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: 'transparent',\r\n textTransform: 'uppercase',\r\n '&::after': {\r\n content: '\"\" !important',\r\n },\r\n '&:hover': {\r\n borderColor: theme.palette.secondary.main,\r\n color: theme.palette.secondary.main + ' !important',\r\n backgroundColor: '#ffffff',\r\n textDecoration: 'none',\r\n },\r\n position: 'relative',\r\n },\r\n helperlink: {\r\n backgroundColor: theme.palette.primary.main,\r\n '&:hover': {\r\n borderColor: theme.palette.primary.main,\r\n color: theme.palette.primary.main + ' !important',\r\n backgroundColor: '#ffffff',\r\n textDecoration: 'none',\r\n },\r\n },\r\n arrow: {\r\n fontWeight: 400,\r\n fontSize: 20,\r\n height: 20,\r\n lineHeight: 20,\r\n marginTop: 'auto',\r\n marginBottom: 'auto',\r\n fontFamily: 'FontAwesome',\r\n position: 'absolute',\r\n right: 19,\r\n textAlign: 'center',\r\n },\r\n })\r\n);\r\n\r\nconst ActionButton = (props: {\r\n linkClassName?: string;\r\n className?: string;\r\n style?: any;\r\n caption: any;\r\n helperlink?: boolean;\r\n href?: string;\r\n onClick?: () => any;\r\n title: string;\r\n}) => {\r\n const classes = useActionButtonStyles();\r\n\r\n const onClick = (e: any) => {\r\n e.preventDefault();\r\n if (props.onClick) {\r\n props.onClick();\r\n }\r\n };\r\n\r\n return (\r\n
\r\n \r\n {props.caption}\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default ActionButton;\r\n","import * as React from 'react';\r\nimport { selectActiveProject } from 'application/project/redux/selectors/projectSelector';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { commonSlice } from 'application/common/redux/commonSlice';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ActionButton from './ActionButton';\r\nimport { createStyles, makeStyles, Theme, useTheme } from '@material-ui/core/styles';\r\nimport { useGlobalStyles } from 'application/shared/styles';\r\nimport clsx from 'clsx';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n flexContainer: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n alignItems: 'stretch',\r\n },\r\n flexGrowHor: {\r\n flexGrow: 1,\r\n },\r\n extraPadding: {\r\n paddingRight: theme.spacing(4),\r\n },\r\n })\r\n);\r\n\r\nconst PageTitle = (props: { title: string; onNext?: () => any; extrapadding?: boolean }) => {\r\n const dispatch = useDispatch();\r\n const project = useSelector(selectActiveProject);\r\n const globalclasses = useGlobalStyles();\r\n const { t } = useTranslation(['editortabs']);\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n\r\n React.useEffect(() => {\r\n const title = props.title + ' - ' + (project?.title || 'untitled') + ' - Hybalans+';\r\n document.title = title;\r\n dispatch(commonSlice.actions.pageTitleChanged(title));\r\n }, [props.title, project, dispatch]);\r\n\r\n return (\r\n
\r\n \r\n
\r\n {props.title}\r\n
\r\n {props.onNext ? (\r\n (props.onNext ? props.onNext() : null)}\r\n />\r\n ) : null}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default PageTitle;\r\n","import Paper from '@material-ui/core/Paper';\r\nimport { useGlobalStyles } from 'application/shared/styles';\r\nimport * as React from 'react';\r\nimport PageTitle from './PageTitle';\r\n\r\nconst EditorPage = (props: { children?: any; title: string; onNext?: () => any }) => {\r\n const classes = useGlobalStyles();\r\n\r\n return (\r\n
\r\n \r\n {props.children}\r\n {/* {props.onNext ? : null} */}\r\n
\r\n );\r\n};\r\n\r\nexport default EditorPage;\r\n","const DecimalSeparator = (1.1).toLocaleString().substring(1, 2);\r\n\r\nexport function FormatDecimal(value: number | undefined, decimals: number = 2): string {\r\n let power = 10 ** decimals;\r\n if (value === undefined || value === null || isNaN(value)) {\r\n return '';\r\n }\r\n return (Math.round(value * power) / power).toFixed(decimals).replace('.', DecimalSeparator);\r\n}\r\n\r\nexport function FormatInteger(value: number | undefined): string {\r\n if (value && !isNaN(value) && Math.round(value) !== 0) {\r\n return Math.round(value).toLocaleString();\r\n } else {\r\n return '\\u00A0';\r\n }\r\n}\r\n\r\nexport function FormatPercentage(value: number | undefined, decimals: number = 1): string {\r\n let power = 10 ** decimals;\r\n if (value === undefined || value === null || isNaN(value)) {\r\n return '';\r\n }\r\n return (Math.round(value * 100 * power) / power).toFixed(decimals).replace('.', DecimalSeparator);\r\n}\r\n\r\nexport function FormatMin2HourMin(value?: number): string {\r\n if (value && !isNaN(value) && Math.round(value) !== 0) {\r\n const hours = Math.floor(value / 60);\r\n const min = value - 60 * hours;\r\n const szMin = '0' + min.toLocaleString();\r\n return hours.toLocaleString() + ':' + szMin.substr(szMin.length - 2);\r\n } else {\r\n return '\\u00A0';\r\n }\r\n}\r\n\r\nexport function ParseDecimal(value: string | undefined): number | undefined {\r\n if (value === undefined || value === null || value === '') {\r\n return undefined;\r\n }\r\n if (typeof value === 'number') return value;\r\n const val = parseFloat(value.replace(DecimalSeparator, '.'));\r\n return isNaN(val) ? undefined : val;\r\n}\r\n\r\nexport function ParseInteger(value: string | undefined): number | undefined {\r\n if (value === undefined || value === null || value === '') {\r\n return undefined;\r\n }\r\n if (typeof value === 'number') return value;\r\n const val = parseInt(value);\r\n return isNaN(val) ? undefined : val;\r\n}\r\n","import * as React from 'react';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport AwesomeDebouncePromise from 'awesome-debounce-promise';\r\nimport useConstant from 'use-constant';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport clsx from 'clsx';\r\nimport { ParseDecimal } from 'application/shared/format';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {},\r\n deleted: {\r\n textDecoration: 'line-through',\r\n },\r\n inputLabelProps: {\r\n overflowY: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n },\r\n}));\r\n\r\nexport interface IValidateResult {\r\n warn: string;\r\n error: string;\r\n}\r\n\r\nexport const validateNoError = () => {\r\n return {\r\n warn: '',\r\n error: '',\r\n };\r\n};\r\n\r\nexport const lastUpdate: { LastDebouce: Date } = { LastDebouce: new Date() };\r\n\r\nexport default function TextInputField(props: {\r\n value: string | number | undefined;\r\n name?: string;\r\n label?: string;\r\n helperText?: string;\r\n onChange: (value: string, name: string, error: string) => void;\r\n validate?: (value: string) => IValidateResult;\r\n onBlur?: (value: string) => string;\r\n required?: boolean;\r\n debounce?: boolean;\r\n disabled?: boolean;\r\n deleted?: boolean;\r\n multiline?: boolean;\r\n inputClassName?: string;\r\n rows?: number;\r\n style?: any;\r\n readOnly?: boolean;\r\n type?: 'text' | 'int' | 'decimal';\r\n fullWidth?: boolean;\r\n className?: string;\r\n error?: boolean;\r\n}) {\r\n const classes = useStyles();\r\n\r\n const { onChange, onBlur, validate } = props;\r\n\r\n const valueRef = React.useRef('');\r\n if (valueRef.current !== props.value?.toString()) {\r\n valueRef.current = props.value?.toString() || '';\r\n }\r\n\r\n const [TextValue, setTextValue] = React.useState(props.value ? props.value.toString() : '');\r\n const [Error, setError] = React.useState(\r\n props.validate ? props.validate(props.value ? props.value.toString() : '') : validateNoError()\r\n );\r\n const [empty, setEmpty] = React.useState(props.value ? false : true);\r\n\r\n const onChangeCallBack = React.useCallback(\r\n (value: string, name: string, error: string) => {\r\n //console.log('TextInputField.onChangeCallBack', name, value);\r\n if (valueRef.current !== value) {\r\n onChange(value, name, error);\r\n }\r\n },\r\n [onChange]\r\n );\r\n\r\n // Debounce the original search async function\r\n const searchAPIDebounced = useConstant(() => AwesomeDebouncePromise(onChangeCallBack, 1000));\r\n\r\n React.useEffect(() => {\r\n setTextValue(props.value ? props.value.toString() : '');\r\n }, [props.value]);\r\n\r\n const handleTextChange = React.useCallback(\r\n async (value: string, name: string) => {\r\n //console.log('TextInputField.onLocalChange', name, value);\r\n if (props.type === 'decimal') {\r\n if (value && !ParseDecimal(value)) {\r\n setTextValue('');\r\n }\r\n }\r\n setTextValue(value);\r\n let error = validate ? validate(value) : validateNoError();\r\n setError(error);\r\n if (props.debounce) {\r\n lastUpdate.LastDebouce = new Date();\r\n await searchAPIDebounced(value, name, error.error);\r\n } else {\r\n if (props.value !== value) {\r\n onChangeCallBack(value, name, error.error);\r\n }\r\n }\r\n },\r\n [onChangeCallBack, validate, props.debounce, searchAPIDebounced, props.type, props.value]\r\n );\r\n\r\n const helperTextRef = React.useRef(props.helperText);\r\n React.useEffect(() => {\r\n if (helperTextRef.current !== props.helperText) {\r\n helperTextRef.current = props.helperText;\r\n //als de helperText is aangepast, dan de boel opnieuw valideren\r\n const val = props.value ? props.value.toString() : '';\r\n let error = validate ? validate(val) : validateNoError();\r\n setError(error);\r\n }\r\n }, [props.helperText, props.value, validate]);\r\n\r\n //console.log('TextInputField', props);\r\n\r\n return (\r\n {\r\n event.target.select();\r\n }}\r\n rows={props.rows}\r\n type={'text'}\r\n onChange={React.useCallback(\r\n (event: React.ChangeEvent) => {\r\n setEmpty(!event.target.value);\r\n handleTextChange(event.target.value, event.target.name);\r\n },\r\n [handleTextChange]\r\n )}\r\n onBlur={React.useCallback(\r\n (event: React.FocusEvent) => {\r\n if (event.target.value === '' && TextValue !== '') {\r\n setTextValue('');\r\n }\r\n if (onBlur) {\r\n handleTextChange(onBlur(event.target.value), event.target.name);\r\n }\r\n },\r\n [onBlur, handleTextChange, TextValue, setTextValue]\r\n )}\r\n InputProps={{\r\n readOnly: props.readOnly,\r\n classes: {\r\n input: clsx(props.deleted ? classes.deleted : null, props.inputClassName),\r\n },\r\n }}\r\n InputLabelProps={{\r\n className: classes.inputLabelProps,\r\n }}\r\n error={\r\n props.error !== undefined\r\n ? props.error\r\n : Error.error !== '' || (props.required && !props.value) || (props.required && empty)\r\n }\r\n helperText={Error.error ? Error.error : Error.warn ? Error.warn : props.helperText}\r\n />\r\n );\r\n}\r\n","import Button from '@material-ui/core/Button';\r\nimport { getInstallationPlanXlsx } from 'application/project/api/InstallationPlan';\r\nimport {\r\n projectArticlesLoading,\r\n selectAllProjectArticles,\r\n} from 'application/project/redux/selectors/projectArticleSelectors';\r\nimport { selectActiveProject } from 'application/project/redux/selectors/projectSelector';\r\nimport { asyncInitProjectArticles } from 'application/project/redux/thunks/AsyncProjectArticle';\r\nimport EditorPage from 'components/controls/EditorPage';\r\nimport { lastUpdate } from 'components/controls/TextInputField';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nconst ComponentList = (props: { onNext: () => any }) => {\r\n const dispatch = useDispatch();\r\n\r\n const project = useSelector(selectActiveProject);\r\n const [downLoading, setDownLoading] = React.useState(false);\r\n const { t } = useTranslation(['componentlist']);\r\n\r\n React.useEffect(() => {\r\n dispatch(asyncInitProjectArticles(lastUpdate.LastDebouce));\r\n }, [dispatch]);\r\n\r\n const projectArticles = useSelector(selectAllProjectArticles);\r\n const articlesLoading = useSelector(projectArticlesLoading);\r\n\r\n return (\r\n \r\n
\r\n {\r\n if (project) {\r\n setDownLoading(true);\r\n getInstallationPlanXlsx(project.guid).then((result) => {\r\n setDownLoading(false);\r\n });\r\n }\r\n }, [project])}>\r\n {downLoading ? t('downloading', 'downloading ...') : t('downloadxlsx', 'download xlsx')}\r\n \r\n
\r\n\r\n
\r\n {articlesLoading ? (\r\n
{t('Componentlistloading', 'the components list is being compiled.')}
\r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {projectArticles.map((projectArticle) => (\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
{t('amount', 'Amount')}{t('articlenumber', 'Article number')}{t('article', 'Article')}
\r\n {projectArticle.amount}{' '}\r\n {projectArticle.quantityPerItem > 0 ? '(' + projectArticle.quantity + 'm)' : ''}\r\n {projectArticle.articleNumber}{projectArticle.name}
\r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ComponentList;\r\n","import * as React from 'react';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormLabel from '@material-ui/core/FormLabel';\r\nimport Radio from '@material-ui/core/Radio';\r\nimport RadioGroup from '@material-ui/core/RadioGroup';\r\nimport { useTheme } from '@material-ui/core';\r\n\r\nexport const RadioSelector = (props: {\r\n value: number | undefined;\r\n name: string;\r\n label?: string;\r\n valueFieldName: string;\r\n displayFieldName: string;\r\n options: any[];\r\n onChange: (value: number | undefined, name: string, error: string) => any;\r\n}) => {\r\n const { onChange } = props;\r\n const theme = useTheme();\r\n\r\n const handleChange = React.useCallback(\r\n (event: React.ChangeEvent) => {\r\n const value =\r\n (event.target as HTMLInputElement).value === ''\r\n ? undefined\r\n : parseInt((event.target as HTMLInputElement).value);\r\n onChange(value, props.name, '');\r\n },\r\n [onChange, props.name]\r\n );\r\n\r\n return (\r\n \r\n {props.label ? (\r\n \r\n {props.label}\r\n \r\n ) : null}\r\n \r\n {props.options.map((a) => (\r\n }\r\n label={a[props.displayFieldName]}\r\n />\r\n ))}\r\n \r\n \r\n );\r\n};\r\n","import { selectComponentState } from 'redux/store';\r\nimport { eppTypeAdapter } from '../adapters/eppTypeAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllEppTypes,\r\n selectById: selectEppTypeById,\r\n selectEntities: selectEppTypeEntities,\r\n} = eppTypeAdapter.getSelectors((state) => selectComponentState(state).eppTypes);\r\n","import * as React from 'react';\r\nimport { ParseDecimal } from 'application/shared/format';\r\nimport TextInputField, { IValidateResult, validateNoError } from './TextInputField';\r\n\r\nexport default function NumberInputField(props: {\r\n value: number | undefined;\r\n name: string;\r\n label?: string;\r\n helperText?: string;\r\n onChange: (value: number | undefined, name: string, error: string) => any;\r\n validate?: (value: number) => IValidateResult;\r\n onBlur?: (value: string) => string;\r\n inputClassName?: string;\r\n required?: boolean;\r\n debounce?: boolean;\r\n disabled?: boolean;\r\n zeroAsEmpty?: boolean;\r\n style?: any;\r\n readOnly?: boolean;\r\n type: 'int' | 'decimal';\r\n fullWidth?: boolean;\r\n className?: string;\r\n}) {\r\n const { onBlur, onChange, validate } = props;\r\n\r\n const valueRef = React.useRef();\r\n let propsValue = props.value;\r\n if (props.zeroAsEmpty) {\r\n propsValue = props.value === 0 ? undefined : props.value;\r\n }\r\n\r\n if (valueRef.current !== propsValue) {\r\n valueRef.current = propsValue;\r\n }\r\n\r\n const myValidate = React.useCallback(\r\n (value: string): IValidateResult => {\r\n if (!value) return validateNoError();\r\n let val: number | undefined;\r\n if (props.type === 'int') {\r\n val = parseInt(value);\r\n } else {\r\n val = ParseDecimal(value);\r\n }\r\n if (val === undefined)\r\n return {\r\n warn: '',\r\n error: 'invalid value',\r\n };\r\n if (validate) return validate(val);\r\n return validateNoError();\r\n },\r\n [validate, props.type]\r\n );\r\n\r\n const onMyBlur = React.useCallback(\r\n (value: string) => {\r\n if (onBlur) return onBlur(value);\r\n\r\n let val: number | undefined;\r\n if (props.type === 'int') {\r\n val = parseInt(value);\r\n } else {\r\n val = ParseDecimal(value);\r\n }\r\n\r\n if (!val || isNaN(val)) return '';\r\n\r\n const error = myValidate(value);\r\n if (error?.error) {\r\n return props.value ? props.value.toString() : '';\r\n } else {\r\n return val.toString();\r\n }\r\n },\r\n [onBlur, props.type, myValidate, props.value]\r\n );\r\n\r\n const onLocalChange = React.useCallback(\r\n //deze wordt aangeroepen als validate is geslaagd, nog even een extra testje uitvoeren ...\r\n (value: string, name: string, error: string) => {\r\n let val: number | undefined;\r\n if (props.type === 'int') {\r\n val = parseInt(value);\r\n } else {\r\n val = ParseDecimal(value);\r\n }\r\n if (\r\n value.trim().length === 0 ||\r\n val === undefined ||\r\n val === null ||\r\n isNaN(val) ||\r\n (val === 0 && props.zeroAsEmpty)\r\n ) {\r\n val = undefined;\r\n }\r\n if (valueRef.current !== val) {\r\n onChange(val, name, error);\r\n }\r\n },\r\n [onChange, props.type, props.required, props.zeroAsEmpty]\r\n );\r\n\r\n //console.log('NumberInputField.render', props);\r\n\r\n return ;\r\n}\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport NumberInputField from './NumberInputField';\r\nimport { validateNoError } from './TextInputField';\r\n\r\nexport default function AmountInputField(props: {\r\n value: number | undefined;\r\n name: string;\r\n label?: string;\r\n onChange: (value: number | undefined, name: string, error: string) => any;\r\n readOnly?: boolean;\r\n fullWidth?: boolean;\r\n className?: string;\r\n maxAmount?: number;\r\n required?: boolean;\r\n}) {\r\n const { onChange } = props;\r\n\r\n const { t } = useTranslation();\r\n const helperText = React.useMemo(() => t('helpamountunit', 'amount (pcs)'), [t]);\r\n\r\n const validate = React.useCallback(\r\n (val: number) => {\r\n if (val < 0) return { error: helperText, warn: '' };\r\n if (props.maxAmount && val > props.maxAmount) return { error: helperText, warn: '' };\r\n return validateNoError();\r\n },\r\n [props.maxAmount, helperText]\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\n","import { IEppComponent } from 'application/components/api/EppComponent';\r\nimport { selectEppTypeById } from 'application/components/redux/selectors/eppTypeSelector';\r\nimport { IEppData } from 'application/project/api/EppData';\r\nimport { IEppDataComponent } from 'application/project/api/EppDataComponent';\r\nimport { updateEppDataComponentThunk } from 'application/project/redux/thunks/AsyncEppDataComponent';\r\nimport AmountInputField from 'components/controls/AmountInputField';\r\nimport React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\n\r\nconst newEppDataComponent = (eppData: IEppData, eppComponent: IEppComponent): IEppDataComponent => {\r\n return {\r\n eppDataComponentID: 0,\r\n supply: eppData.supply,\r\n inside: eppData.inside,\r\n eppComponentID: eppComponent.eppComponentID,\r\n eppTypeID: eppComponent.eppTypeID,\r\n amount: undefined,\r\n };\r\n};\r\n\r\nexport const EppComponent = (props: {\r\n component: IEppComponent;\r\n eppDataComponent: IEppDataComponent | undefined;\r\n eppData: IEppData;\r\n}) => {\r\n const dispatch = useDispatch();\r\n const EppType = useSelector((state) => selectEppTypeById(state, props.component.eppTypeID));\r\n\r\n const onChange = React.useCallback(\r\n (value: number | undefined, name: string, error: string) => {\r\n const newValue = props.eppDataComponent\r\n ? { ...props.eppDataComponent }\r\n : newEppDataComponent(props.eppData, props.component);\r\n newValue.amount = value;\r\n dispatch(updateEppDataComponentThunk(props.eppData, newValue));\r\n },\r\n [dispatch, props.component, props.eppDataComponent, props.eppData]\r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default EppComponent;\r\n","export enum ImageType {\r\n plenum = 1,\r\n valvegrid,\r\n extracomponent,\r\n dealer,\r\n valveconnectorgrid,\r\n}\r\n\r\nexport const getImage = (imageID: number, imageType: ImageType) => {\r\n return imageID ? 'api/Image/' + imageType + '/' + imageID : '';\r\n};\r\n\r\nexport const getValveImage = (imageID: number) => {\r\n return getImage(imageID, ImageType.valvegrid);\r\n};\r\n\r\nexport const getPlenumImage = (imageID: number) => {\r\n return getImage(imageID, ImageType.plenum);\r\n};\r\n\r\nexport const getExtraComponentImage = (imageID: number) => {\r\n return getImage(imageID, ImageType.extracomponent);\r\n};\r\n","import { selectComponentState } from 'redux/store';\r\nimport { eppColorAdapter } from '../adapters/eppColorAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllEppColors,\r\n selectById: selectEppColorById,\r\n selectEntities: selectEppColorEntities,\r\n} = eppColorAdapter.getSelectors((state) => selectComponentState(state).eppColors);\r\n","import { selectComponentState } from 'redux/store';\r\nimport { eppComponentAdapter } from '../adapters/eppComponentAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllEppComponents,\r\n selectById: selectEppComponentById,\r\n selectEntities: selectEppComponentEntities,\r\n} = eppComponentAdapter.getSelectors((state) => selectComponentState(state).eppComponents);\r\n","import { selectComponentState } from 'redux/store';\r\nimport { eppDiameterAdapter } from '../adapters/eppDiameterAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllEppDiameters,\r\n selectById: selectEppDiameterById,\r\n selectEntities: selectEppDiameterEntities,\r\n} = eppDiameterAdapter.getSelectors((state) => selectComponentState(state).eppDiameters);\r\n","import { selectComponentState } from 'redux/store';\r\nimport { eppMaterialAdapter } from '../adapters/eppMaterialAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllEppMaterials,\r\n selectById: selectEppMaterialById,\r\n selectEntities: selectEppMaterialEntities,\r\n} = eppMaterialAdapter.getSelectors((state) => selectComponentState(state).eppMaterials);\r\n","import { selectComponentState } from 'redux/store';\r\nimport { eppTerminalAdapter } from '../adapters/eppTerminalAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllEppTerminals,\r\n selectById: selectEppTerminalById,\r\n selectEntities: selectEppTerminalEntities,\r\n} = eppTerminalAdapter.getSelectors((state) => selectComponentState(state).eppTerminals);\r\n","import { selectComponentState } from 'redux/store';\r\nimport { eppTerminalTypeAdapter } from '../adapters/eppTerminalTypeAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllEppTerminalTypes,\r\n selectById: selectEppTerminalTypeById,\r\n selectEntities: selectEppTerminalTypeEntities,\r\n} = eppTerminalTypeAdapter.getSelectors((state) => selectComponentState(state).eppTerminalTypes);\r\n","import { selectComponentState } from 'redux/store';\r\nimport { eppDamperTypeAdapter } from '../adapters/eppDamperTypeAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllEppDamperTypes,\r\n selectById: selectEppDamperTypeById,\r\n selectEntities: selectEppDamperTypeEntities,\r\n} = eppDamperTypeAdapter.getSelectors((state) => selectComponentState(state).eppDamperTypes);\r\n","import { selectComponentState } from 'redux/store';\r\nimport { eppDamperAdapter } from '../adapters/eppDamperAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllEppDampers,\r\n selectById: selectEppDamperById,\r\n selectEntities: selectEppDamperEntities,\r\n} = eppDamperAdapter.getSelectors((state) => selectComponentState(state).eppDampers);\r\n","import * as React from 'react';\r\nimport { selectAllEppColors } from 'application/components/redux/selectors/eppColorSelector';\r\nimport { selectAllEppComponents } from 'application/components/redux/selectors/eppComponentSelector';\r\nimport { selectAllEppDiameters } from 'application/components/redux/selectors/eppDiameterSelector';\r\nimport { selectAllEppMaterials } from 'application/components/redux/selectors/eppMaterialSelector';\r\nimport { selectAllEppTerminals } from 'application/components/redux/selectors/eppTerminalSelector';\r\nimport { selectAllEppTerminalTypes } from 'application/components/redux/selectors/eppTerminalTypeSelector';\r\nimport { GetEppDataID } from 'application/project/redux/adapters/eppDataAdapter';\r\nimport { makeSelectEppDataComponentsByDirection } from 'application/project/redux/selectors/eppdataComponentSelectors';\r\nimport { selectEppDataBySupplyInside } from 'application/project/redux/selectors/eppdataSelectors';\r\nimport { PlenumDataInside, PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { IEppData } from 'application/project/api/EppData';\r\nimport { updateAsyncEppData } from 'application/project/redux/thunks/AsyncEppData';\r\nimport { IEppDataComponent } from 'application/project/api/EppDataComponent';\r\nimport { IEppMaterial } from 'application/components/api/EppMaterial';\r\nimport { IEppDiameter } from 'application/components/api/EppDiameter';\r\nimport { IEppTerminalType } from 'application/components/api/EppTerminalType';\r\nimport { IEppColor } from 'application/components/api/EppColor';\r\nimport { IEppComponent } from 'application/components/api/EppComponent';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { selectAllEppDamperTypes } from 'application/components/redux/selectors/eppDamperTypeSelector';\r\nimport { selectAllEppDampers } from 'application/components/redux/selectors/eppDamperSelector';\r\nimport { IEppDamperType } from 'application/components/api/EppDamperTerminal';\r\n\r\nexport const isEppDataValid = (eppdata: IEppData): boolean => {\r\n if (!eppdata.eppMaterialID) return false;\r\n if (!eppdata.eppDiameterID) return false;\r\n if (eppdata.inside === PlenumDataInside.outside) {\r\n if (eppdata.eppTerminalID && (!eppdata.eppTerminalTypeID || !eppdata.eppColorID)) return false;\r\n }\r\n if (eppdata.inside === PlenumDataInside.inside) {\r\n if (eppdata.eppDamperID && !eppdata.eppDamperTypeID) return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const useEppData = (\r\n supply: PlenumDataSupply,\r\n inside: PlenumDataInside\r\n): [\r\n string,\r\n IEppData | undefined,\r\n IEppMaterial[],\r\n IEppDiameter[],\r\n IEppTerminalType[],\r\n IEppDamperType[],\r\n IEppColor[],\r\n {\r\n component: IEppComponent;\r\n eppDataComponent: IEppDataComponent | undefined;\r\n }[],\r\n (value: string | number | undefined | boolean, field: string, error: string) => any\r\n] => {\r\n const dispatch = useDispatch();\r\n const diameters = useSelector((state) => selectAllEppDiameters(state));\r\n const eppMaterials = useSelector((state) => selectAllEppMaterials(state));\r\n const eppColors = useSelector((state) => selectAllEppColors(state));\r\n const eppTerminalTypes = useSelector((state) => selectAllEppTerminalTypes(state));\r\n const eppDamperTypes = useSelector((state) => selectAllEppDamperTypes(state));\r\n const eppTerminals = useSelector((state) => selectAllEppTerminals(state));\r\n const eppDampers = useSelector((state) => selectAllEppDampers(state));\r\n const eppComponents = useSelector((state) => selectAllEppComponents(state));\r\n const eppData = useSelector((state) => selectEppDataBySupplyInside(state, GetEppDataID(supply, inside)));\r\n const selectEppDataComponentsByDirection = React.useMemo(makeSelectEppDataComponentsByDirection, []);\r\n const eppDataComponents = useSelector((state) => selectEppDataComponentsByDirection(state, supply, inside));\r\n\r\n const [editEppData, setEditEppData] = React.useState(eppData as IEppData);\r\n React.useEffect(() => setEditEppData(eppData as IEppData), [eppData]);\r\n\r\n const { t } = useTranslation(['eppedit']);\r\n\r\n const screenMaterial = React.useMemo(() => {\r\n return eppMaterials.filter((a) => eppComponents.find((c) => c.eppMaterialID === a.eppMaterialID));\r\n }, [eppMaterials, eppComponents]);\r\n\r\n const screenDiameter = React.useMemo(() => {\r\n if (!editEppData?.eppMaterialID) return [];\r\n return diameters.filter((a) =>\r\n eppComponents.find((c) => c.eppMaterialID === editEppData?.eppMaterialID && c.eppDiameterID === a.eppDiameterID)\r\n );\r\n }, [editEppData?.eppMaterialID, diameters, eppComponents]);\r\n\r\n const screenTerminalTypes = React.useMemo(() => {\r\n if (!editEppData?.eppDiameterID) return [];\r\n const retval = eppTerminalTypes.filter((a) =>\r\n eppTerminals.find(\r\n (c) => c.eppDiameterID === editEppData?.eppDiameterID && c.eppTerminalTypeID === a.eppTerminalTypeID\r\n )\r\n );\r\n if (retval.length > 0) {\r\n retval.splice(0, 0, {\r\n eppTerminalTypeID: 0,\r\n name: t('terminal_none', 'no terminal'),\r\n });\r\n }\r\n return retval;\r\n }, [t, editEppData?.eppDiameterID, eppTerminalTypes, eppTerminals]);\r\n\r\n const screenDamperTypes = React.useMemo(() => {\r\n if (!editEppData?.eppDiameterID) return [];\r\n const retval = eppDamperTypes.filter((a) =>\r\n eppDampers.find((c) => c.eppDiameterID === editEppData?.eppDiameterID && c.eppDamperTypeID === a.eppDamperTypeID)\r\n );\r\n if (retval.length > 0) {\r\n retval.splice(0, 0, {\r\n eppDamperTypeID: 0,\r\n name: t('damper_none', 'no damper'),\r\n });\r\n }\r\n return retval;\r\n }, [t, editEppData?.eppDiameterID, eppDamperTypes, eppDampers]);\r\n\r\n const screenColors = React.useMemo(() => {\r\n if (!editEppData?.eppDiameterID || !editEppData.eppTerminalTypeID) return [];\r\n return eppColors.filter((a) =>\r\n eppTerminals.find(\r\n (c) =>\r\n c.eppDiameterID === editEppData?.eppDiameterID &&\r\n c.eppTerminalTypeID === editEppData?.eppTerminalTypeID &&\r\n c.eppColorID === a.eppColorID\r\n )\r\n );\r\n }, [editEppData?.eppDiameterID, editEppData?.eppTerminalTypeID, eppColors, eppTerminals]);\r\n\r\n const screenComponents = React.useMemo(() => {\r\n if (!editEppData?.eppDiameterID || !editEppData.eppMaterialID) return [];\r\n return eppComponents\r\n .filter((a) => a.eppMaterialID === editEppData?.eppMaterialID && a.eppDiameterID === editEppData?.eppDiameterID)\r\n .map((component) => {\r\n return {\r\n component: component,\r\n eppDataComponent: eppDataComponents.find((a) => a.eppComponentID === component.eppComponentID),\r\n };\r\n });\r\n }, [editEppData?.eppDiameterID, editEppData?.eppMaterialID, eppComponents, eppDataComponents]);\r\n\r\n const onChange = React.useCallback(\r\n (value: string | number | undefined | boolean, field: string, error: string) => {\r\n setEditEppData((prevValue) => {\r\n var newValue: IEppData = {\r\n ...prevValue,\r\n [field]: value,\r\n };\r\n //do we have a valid terminal (combination)?\r\n //\r\n if (inside === PlenumDataInside.outside) {\r\n if (\r\n !eppTerminals.find(\r\n (a) => a.eppDiameterID === newValue.eppDiameterID && a.eppTerminalTypeID === newValue.eppTerminalTypeID\r\n )\r\n ) {\r\n newValue.eppTerminalID = undefined;\r\n newValue.eppTerminalTypeID = undefined;\r\n newValue.eppColorID = undefined;\r\n } else if (\r\n !eppTerminals.find(\r\n (a) =>\r\n a.eppDiameterID === newValue.eppDiameterID &&\r\n a.eppTerminalTypeID === newValue.eppTerminalTypeID &&\r\n a.eppColorID === newValue.eppColorID\r\n )\r\n ) {\r\n newValue.eppColorID = undefined;\r\n }\r\n } else if (inside === PlenumDataInside.inside) {\r\n if (\r\n !eppDampers.find(\r\n (a) => a.eppDiameterID === newValue.eppDiameterID && a.eppDamperTypeID === newValue.eppDamperTypeID\r\n )\r\n ) {\r\n newValue.eppDamperID = undefined;\r\n newValue.eppDamperTypeID = undefined;\r\n }\r\n }\r\n\r\n if (isEppDataValid(newValue)) {\r\n dispatch(updateAsyncEppData(newValue));\r\n }\r\n console.log('setEppData', { newValue, prevValue, value, field });\r\n return newValue;\r\n });\r\n },\r\n [dispatch, inside, eppTerminals]\r\n );\r\n\r\n const title = React.useMemo(\r\n () =>\r\n t(\r\n 'title_' +\r\n (supply === PlenumDataSupply.supply ? 'supply' : 'extraction') +\r\n ' ' +\r\n (inside === PlenumDataInside.inside ? 'inside' : 'outside'),\r\n 'Duct components ' +\r\n (supply === PlenumDataSupply.supply ? 'supply' : 'extraction') +\r\n ' ' +\r\n (inside === PlenumDataInside.inside ? 'inside' : 'outside')\r\n ),\r\n [t, supply, inside]\r\n );\r\n\r\n return [\r\n title,\r\n editEppData,\r\n screenMaterial,\r\n screenDiameter,\r\n screenTerminalTypes,\r\n screenDamperTypes,\r\n screenColors,\r\n screenComponents,\r\n onChange,\r\n ];\r\n};\r\n","import { IEppData } from 'application/project/api/EppData';\r\nimport NumberInputField from 'components/controls/NumberInputField';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport nameof from 'ts-nameof.macro';\r\n\r\nexport const ExtraResistant = (props: {\r\n eppData: IEppData;\r\n onChange: (value: string | number | undefined | boolean, field: string, error: string) => any;\r\n}) => {\r\n const { t } = useTranslation(['eppedit']);\r\n const helperText = React.useMemo(\r\n () => t('additionalpressurelosshelper', 'Additional pressure loss (external sound damper, fire damper)'),\r\n [t]\r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default ExtraResistant;\r\n","import * as React from 'react';\r\nimport { IEppColor } from 'application/components/api/EppColor';\r\nimport { IEppDiameter } from 'application/components/api/EppDiameter';\r\nimport { IEppMaterial } from 'application/components/api/EppMaterial';\r\nimport { IEppTerminalType } from 'application/components/api/EppTerminalType';\r\nimport { IEppData } from 'application/project/api/EppData';\r\nimport { PlenumDataInside, PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport EditorPage from 'components/controls/EditorPage';\r\nimport { RadioSelector } from 'components/controls/RadioSelector';\r\nimport nameof from 'ts-nameof.macro';\r\nimport EppComponent from './EppComponent';\r\nimport { useEppData } from './useEppData';\r\nimport ExtraResistant from './ExtraResistant';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IEppDamperType } from 'application/components/api/EppDamperTerminal';\r\n\r\nexport const EppDataEdit = (props: { supply: PlenumDataSupply; inside: PlenumDataInside; onNext: () => any }) => {\r\n const [\r\n title,\r\n editEppData,\r\n screenMaterial,\r\n screenDiameter,\r\n screenTerminalTypes,\r\n screenDamperTypes,\r\n screenColors,\r\n screenComponents,\r\n onChange,\r\n ] = useEppData(props.supply, props.inside);\r\n const { t } = useTranslation(['eppedit']);\r\n\r\n if (!editEppData) return
;\r\n return (\r\n \r\n ((o) => o.eppMaterialID)}\r\n value={editEppData.eppMaterialID}\r\n onChange={onChange}\r\n valueFieldName={nameof((o) => o.eppMaterialID)}\r\n displayFieldName={nameof((o) => o.name)}\r\n options={screenMaterial}\r\n />\r\n ((o) => o.eppDiameterID)}\r\n value={editEppData.eppDiameterID}\r\n onChange={onChange}\r\n valueFieldName={nameof((o) => o.eppDiameterID)}\r\n displayFieldName={nameof((o) => o.name)}\r\n options={screenDiameter}\r\n />\r\n {props.inside === PlenumDataInside.outside ? (\r\n \r\n ((o) => o.eppTerminalTypeID)}\r\n value={editEppData?.eppTerminalTypeID ? editEppData.eppTerminalTypeID : 0}\r\n onChange={onChange}\r\n valueFieldName={nameof((o) => o.eppTerminalTypeID)}\r\n displayFieldName={nameof((o) => o.name)}\r\n options={screenTerminalTypes}\r\n />\r\n ((o) => o.eppColorID)}\r\n value={editEppData.eppColorID}\r\n onChange={onChange}\r\n valueFieldName={nameof((o) => o.eppColorID)}\r\n displayFieldName={nameof((o) => o.name)}\r\n options={screenColors}\r\n />\r\n \r\n ) : (\r\n ((o) => o.eppDamperTypeID)}\r\n value={editEppData?.eppDamperTypeID ? editEppData.eppDamperTypeID : 0}\r\n onChange={onChange}\r\n valueFieldName={nameof((o) => o.eppDamperTypeID)}\r\n displayFieldName={nameof((o) => o.name)}\r\n options={screenDamperTypes}\r\n />\r\n )}\r\n
\r\n {screenComponents.map((screenComponent) => (\r\n
\r\n \r\n
\r\n ))}\r\n
\r\n {props.inside === PlenumDataInside.inside ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n
\r\n );\r\n};\r\n\r\nexport default EppDataEdit;\r\n","import * as React from 'react';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport { Theme, createStyles, withStyles, makeStyles } from '@material-ui/core/styles';\r\nimport DialogTitle, { DialogTitleProps } from '@material-ui/core/DialogTitle';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport Button from '@material-ui/core/Button';\r\n\r\nconst styles = (theme: Theme) =>\r\n createStyles({\r\n root: {\r\n margin: 0,\r\n padding: theme.spacing(2),\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n });\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n dialogTitle: {\r\n marginRight: theme.spacing(3),\r\n },\r\n })\r\n);\r\n\r\ninterface BaseDialogTitleProps extends DialogTitleProps {\r\n onClose: any;\r\n onApply?: any;\r\n classes: {\r\n root: string;\r\n closeButton: string;\r\n };\r\n closeTitle?: string;\r\n}\r\n\r\nconst BaseDialogTitle = withStyles(styles)((props: BaseDialogTitleProps) => {\r\n const { children, classes, onClose, ...other } = props;\r\n const myclses = useStyles();\r\n return (\r\n \r\n {children}\r\n {onClose ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n );\r\n});\r\n\r\nexport enum BaseButtonType {\r\n close,\r\n submit,\r\n custom,\r\n}\r\n\r\nexport interface IBaseButtonProps {\r\n OnClick?: any;\r\n name?: string;\r\n label: string;\r\n disabled?: any;\r\n color?: string;\r\n type: BaseButtonType;\r\n}\r\n\r\nexport interface IBaseDialogProps {\r\n IsOpen: boolean;\r\n onClose?: any;\r\n onApply?: any;\r\n title: string;\r\n children?: any;\r\n buttons: IBaseButtonProps[];\r\n fullWidth?: boolean;\r\n fullScreen?: boolean;\r\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false;\r\n}\r\n\r\nexport interface IBaseDialogState {\r\n IsOpen: boolean;\r\n}\r\n\r\nexport interface ButtonPropertiesType {\r\n onClick: any;\r\n disabled: boolean;\r\n color: any;\r\n}\r\n\r\nexport default class BaseDialog extends React.Component {\r\n constructor(props: any) {\r\n super(props);\r\n this.state = {\r\n IsOpen: false,\r\n };\r\n }\r\n\r\n static getDerivedStateFromProps(nextProps: IBaseDialogProps, prevState: IBaseDialogState) {\r\n if (nextProps.IsOpen !== prevState.IsOpen) {\r\n return { IsOpen: nextProps.IsOpen };\r\n }\r\n return {};\r\n }\r\n\r\n handleClose = () => {\r\n this.setState({ IsOpen: false });\r\n if (this.props.onClose) {\r\n this.props.onClose();\r\n }\r\n };\r\n handleApply = (e: any) => {\r\n e.preventDefault();\r\n this.setState({ IsOpen: false });\r\n if (this.props.onApply) {\r\n this.props.onApply();\r\n }\r\n };\r\n\r\n getButtonProperties = (but: IBaseButtonProps): ButtonPropertiesType => {\r\n let retval: ButtonPropertiesType = {\r\n onClick: but.type === BaseButtonType.close && this.props.onClose ? this.props.onClose : but.OnClick,\r\n disabled: typeof but.disabled === 'function' ? but.disabled() : but.disabled,\r\n color: 'primary',\r\n };\r\n switch (but.type) {\r\n case BaseButtonType.close:\r\n retval.color = 'secondary';\r\n retval.onClick = this.handleClose;\r\n break;\r\n case BaseButtonType.submit:\r\n break;\r\n }\r\n return retval;\r\n };\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n
\r\n \r\n {this.props.title}\r\n \r\n {this.props.children}\r\n \r\n {this.props.buttons.map((but, index) => {\r\n let butProp = this.getButtonProperties(but);\r\n return (\r\n \r\n {but.label}\r\n \r\n );\r\n })}\r\n \r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n","import { IExtraComponent } from 'application/components/api/ExtraComponent';\r\nimport { IProjectExtraComponent } from 'application/project/api/ProjectExtraComponent';\r\nimport { updateProjectExtraComponentThunk } from 'application/project/redux/thunks/AsyncProjectExtraComponent';\r\nimport React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\r\nimport AmountInputField from 'components/controls/AmountInputField';\r\n\r\nexport const useProjectExtraComponentStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n image: {\r\n height: 120,\r\n },\r\n\r\n imageContainer: {\r\n position: 'absolute',\r\n top: 0,\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n textAlign: 'center',\r\n },\r\n centered: {\r\n display: 'inline-block',\r\n verticalAlign: 'middle',\r\n height: '100%',\r\n textAlign: 'center',\r\n },\r\n\r\n preImageContainer: {\r\n display: 'table-cell',\r\n verticalAlign: 'middle',\r\n textAlign: 'center',\r\n position: 'relative',\r\n width: 400,\r\n minHeight: 120,\r\n },\r\n\r\n editor: {\r\n width: 400,\r\n },\r\n\r\n group: {\r\n marginTop: 32,\r\n marginBottom: 32,\r\n display: 'flex',\r\n },\r\n ComponentContainer: {\r\n display: 'inline-block',\r\n },\r\n })\r\n);\r\n\r\nconst newProjectExtraComponent = (extraComponent: IExtraComponent): IProjectExtraComponent => {\r\n return {\r\n projectExtraComponentID: 0,\r\n extraComponentID: extraComponent.extraComponentID,\r\n amount: undefined,\r\n };\r\n};\r\n\r\nexport const ProjectExtraComponent = (props: {\r\n extraComponent: IExtraComponent;\r\n projectExtraComponent: IProjectExtraComponent | undefined;\r\n}) => {\r\n const classes = useProjectExtraComponentStyles();\r\n const dispatch = useDispatch();\r\n\r\n const onChange = React.useCallback(\r\n (value: number | undefined, name: string, error: string) => {\r\n const newValue = props.projectExtraComponent\r\n ? { ...props.projectExtraComponent }\r\n : newProjectExtraComponent(props.extraComponent);\r\n newValue.amount = value;\r\n dispatch(updateProjectExtraComponentThunk(newValue));\r\n },\r\n [dispatch, props.extraComponent, props.projectExtraComponent]\r\n );\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default ProjectExtraComponent;\r\n","import { selectComponentState } from 'redux/store';\r\nimport { extraComponentAdapter } from '../adapters/extraComponentAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllExtraComponents,\r\n selectById: selectExtraComponentById,\r\n selectEntities: selectExtraComponentEntities,\r\n} = extraComponentAdapter.getSelectors((state) => selectComponentState(state).extraComponents);\r\n","import { selectProjectState } from 'redux/store';\r\nimport { projectExtraComponentAdapter } from '../adapters/projectExtraComponentAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllProjectExtraComponents,\r\n selectById: selectProjectExtraComponentById,\r\n selectEntities: selectProjectExtraComponentEntities,\r\n} = projectExtraComponentAdapter.getSelectors((state) => selectProjectState(state).projectExtraComponents);\r\n","import { getExtraComponentImage } from 'application/components/api/Image';\r\nimport EditorPage from 'components/controls/EditorPage';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport ProjectExtraComponent, { useProjectExtraComponentStyles } from './ProjectExtraComponent';\r\nimport { useExtraComponents } from './useExtraComponents';\r\n\r\nconst ExtraComponents = (props: { onNext: () => any }) => {\r\n const classes = useProjectExtraComponentStyles();\r\n const [extraComponentsGroups] = useExtraComponents();\r\n const { t } = useTranslation();\r\n\r\n return (\r\n \r\n {extraComponentsGroups.map((extraComponentsGroup) => (\r\n
\r\n
\r\n {extraComponentsGroup.items.map((screenComponent) => (\r\n \r\n ))}\r\n
\r\n
\r\n
\r\n
\r\n \"\"\r\n
\r\n
\r\n
\r\n ))}\r\n
\r\n );\r\n};\r\n\r\nexport default ExtraComponents;\r\n","import { IExtraComponent } from 'application/components/api/ExtraComponent';\r\nimport { selectAllExtraComponents } from 'application/components/redux/selectors/extraComponentSelector';\r\nimport { IProjectExtraComponent } from 'application/project/api/ProjectExtraComponent';\r\nimport { selectAllProjectExtraComponents } from 'application/project/redux/selectors/projectExtraComponentSelectors';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nexport interface IProjectExtraComponentRefVal {\r\n extraComponent: IExtraComponent;\r\n projectExtraComponent: IProjectExtraComponent | undefined;\r\n}\r\n\r\nexport interface IProjectExtraComponentGroupRefVal {\r\n key: number;\r\n imageID: number;\r\n extraComponentGroupID?: number;\r\n sort: number;\r\n items: IProjectExtraComponentRefVal[];\r\n}\r\n\r\nexport const useExtraComponents = (): [IProjectExtraComponentGroupRefVal[]] => {\r\n const extraComponents = useSelector((state) => selectAllExtraComponents(state));\r\n const projectExtraComponents = useSelector((state) => selectAllProjectExtraComponents(state));\r\n\r\n const screenExtraComponents = React.useMemo(() => {\r\n const items: IProjectExtraComponentGroupRefVal[] = new Array();\r\n\r\n extraComponents.forEach((extraComponent) => {\r\n const componentItem: IProjectExtraComponentRefVal = {\r\n extraComponent: extraComponent,\r\n projectExtraComponent: projectExtraComponents.find(\r\n (a) => a.extraComponentID === extraComponent.extraComponentID\r\n ),\r\n };\r\n\r\n if (extraComponent.extraComponentGroupID) {\r\n const item = items.find((a) => a.extraComponentGroupID === extraComponent.extraComponentGroupID);\r\n if (item) {\r\n item.items.push(componentItem);\r\n item.items.sort(\r\n (a, b) => (a.extraComponent.extraComponentOrder || 0) - (b.extraComponent.extraComponentOrder || 0)\r\n );\r\n } else {\r\n items.push({\r\n key: extraComponent.extraComponentID,\r\n extraComponentGroupID: extraComponent.extraComponentGroupID,\r\n sort: extraComponent.extraComponentGroupOrder || 0,\r\n imageID: extraComponent.imageID,\r\n items: [componentItem],\r\n });\r\n }\r\n } else {\r\n items.push({\r\n key: extraComponent.extraComponentID,\r\n imageID: extraComponent.imageID,\r\n sort: -1,\r\n items: [componentItem],\r\n });\r\n }\r\n });\r\n\r\n items.sort((a, b) => {\r\n if (a.sort === b.sort) return 0;\r\n if (a.sort === -1) return 1;\r\n if (b.sort === -1) return -1;\r\n return a.sort - b.sort;\r\n });\r\n return items;\r\n }, [extraComponents, projectExtraComponents]);\r\n\r\n return [screenExtraComponents];\r\n};\r\n","import { Button } from '@material-ui/core';\r\nimport {\r\n getInstallationCalcultionHtml,\r\n getInstallationPlanHtml,\r\n getInstallationPlanPdf,\r\n} from 'application/project/api/InstallationPlan';\r\nimport { selectActiveProject } from 'application/project/redux/selectors/projectSelector';\r\nimport EditorPage from 'components/controls/EditorPage';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\n\r\nconst InstallationPlan = (props: { calculation?: boolean; onNext: () => any }) => {\r\n const project = useSelector(selectActiveProject);\r\n\r\n const [htmlString, setHtmlString] = React.useState('');\r\n const [downLoading, setDownLoading] = React.useState(false);\r\n const { t } = useTranslation(['installationplan']);\r\n\r\n React.useEffect(() => {\r\n if (project) {\r\n if (props.calculation === true) {\r\n getInstallationCalcultionHtml(project.guid).then((result) => {\r\n setHtmlString(result);\r\n });\r\n } else {\r\n getInstallationPlanHtml(project.guid).then((result) => {\r\n setHtmlString(result);\r\n });\r\n }\r\n }\r\n }, [project, props.calculation]);\r\n\r\n return (\r\n \r\n
\r\n {\r\n if (project) {\r\n setDownLoading(true);\r\n getInstallationPlanPdf(project.guid).then((result) => {\r\n setDownLoading(false);\r\n });\r\n }\r\n }, [project])}>\r\n {downLoading ? t('downloading', 'downloading ...') : t('downloadpdf', 'download pdf')}\r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default InstallationPlan;\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { selectComponentState } from 'redux/store';\r\nimport { plenumAdapter } from '../adapters/plenumAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllPlenums,\r\n selectById: selectPlenumById,\r\n selectEntities: selectPlenumEntities,\r\n} = plenumAdapter.getSelectors((state) => selectComponentState(state).plenums);\r\n\r\nexport const makeSelectPlenums = () => {\r\n return createSelector(\r\n // First, pass one or more \"input selector\" functions:\r\n (state: any, supply: PlenumDataSupply, ductID: number | undefined) => supply,\r\n (state: any, supply: PlenumDataSupply, ductID: number | undefined) => ductID,\r\n selectAllPlenums,\r\n // Then, an \"output selector\" that receives all the input results as arguments\r\n // and returns a final result value\r\n (supply, ductID, plenums) =>\r\n plenums.filter(\r\n (a) =>\r\n a.ductID === ductID &&\r\n ((supply === PlenumDataSupply.supply && a.canSupply) ||\r\n (supply === PlenumDataSupply.extraction && a.canExtraction))\r\n )\r\n );\r\n};\r\n","import { selectProjectState } from 'redux/store';\r\nimport { plenumDataAdapter } from '../adapters/plenumDataAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllPlenumdatas,\r\n selectById: selectPlenumdataByPlenumDataSupply,\r\n selectEntities: selectPlenumdataEntities,\r\n} = plenumDataAdapter.getSelectors((state) => selectProjectState(state).plenumdatas);\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport BaseDialog, { BaseButtonType } from './BaseDialog';\r\nimport { InfoDialogState } from './useInfoDialog';\r\n\r\nexport interface IInfoDialogProps {\r\n IsOpen: boolean;\r\n onClose?: () => void;\r\n title: string;\r\n children?: any;\r\n fullWidth?: boolean;\r\n fullScreen?: boolean;\r\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false;\r\n}\r\n\r\nexport function InfoDialog(props: IInfoDialogProps) {\r\n const { t } = useTranslation(['translation']);\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport const InfoDialogEx = (props: InfoDialogState) => {\r\n const { t } = useTranslation(['translation']);\r\n return (\r\n \r\n {props.content}\r\n \r\n );\r\n};\r\n\r\nexport default InfoDialog;\r\n","import { selectComponentState } from 'redux/store';\r\nimport { ductAdapter } from '../adapters/ductAdapter';\r\n\r\nexport enum enDuctType {\r\n round92 = 1,\r\n round75 = 2,\r\n oval = 3,\r\n}\r\n\r\nexport const {\r\n selectAll: selectAllDucts,\r\n selectById: selectDuctById,\r\n selectEntities: selectDuctEntities,\r\n} = ductAdapter.getSelectors((state) => selectComponentState(state).ducts);\r\n","import * as React from 'react';\r\n\r\nexport interface InfoDialogState {\r\n title: string;\r\n isOpen: boolean;\r\n content: React.ReactNode;\r\n onClose: () => any;\r\n fullWidth?: boolean;\r\n fullScreen?: boolean;\r\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false | undefined;\r\n}\r\n\r\nexport interface OpenInfoDialogProps {\r\n title: string;\r\n content: React.ReactNode;\r\n fullWidth?: boolean;\r\n fullScreen?: boolean;\r\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false | undefined;\r\n}\r\n\r\nconst useInfoDialog = (): [\r\n InfoDialogState,\r\n (props: OpenInfoDialogProps) => void\r\n] => {\r\n const [data, setData] = React.useState<{\r\n isOpen: boolean;\r\n title: string;\r\n content: React.ReactNode;\r\n fullWidth: boolean | undefined;\r\n fullScreen: boolean | undefined;\r\n maxWidth: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false | undefined;\r\n }>({\r\n isOpen: false,\r\n title: '',\r\n content: undefined,\r\n fullWidth: undefined,\r\n fullScreen: undefined,\r\n maxWidth: undefined,\r\n });\r\n\r\n function SetOpen(newstate: OpenInfoDialogProps): void {\r\n setData({\r\n isOpen: true,\r\n title: newstate.title,\r\n content: newstate.content,\r\n fullWidth: newstate.fullWidth,\r\n fullScreen: newstate.fullScreen,\r\n maxWidth: newstate.maxWidth,\r\n });\r\n }\r\n function SetClose(): void {\r\n setData((prev) => {\r\n return {\r\n ...prev,\r\n isOpen: false,\r\n };\r\n });\r\n }\r\n\r\n let retVal: InfoDialogState = {\r\n title: data.title,\r\n isOpen: data.isOpen,\r\n content: data.content,\r\n fullWidth: data.fullWidth,\r\n fullScreen: data.fullScreen,\r\n maxWidth: data.maxWidth,\r\n onClose: SetClose,\r\n };\r\n\r\n return [retVal, SetOpen];\r\n};\r\n\r\nexport default useInfoDialog;\r\n","import * as React from 'react';\r\nimport { FormatDecimal } from 'application/shared/format';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectFlowUnitID } from 'application/project/redux/selectors/projectSelector';\r\nimport { enFlowUnit } from 'application/project/api/Project';\r\n\r\nexport const useFlowRate = () => {\r\n const { t } = useTranslation();\r\n const flowUnitID = useSelector(selectFlowUnitID);\r\n\r\n const FormatAirFlowRate = React.useCallback(\r\n (value: number | undefined): string => {\r\n return FormatDecimal(flowUnitID === enFlowUnit.m3_h && value ? value * 3.6 : value, 1);\r\n },\r\n [flowUnitID]\r\n );\r\n\r\n const airFlowRateUnit = React.useCallback((): string => {\r\n return flowUnitID === enFlowUnit.m3_h ? t('flowunit_m3h', 'm3/h') : t('flowunit_ls', 'dm3/s');\r\n }, [flowUnitID, t]);\r\n\r\n const FormatAirFlowRateUnit = React.useCallback(\r\n (value: number | undefined): string => {\r\n return FormatAirFlowRate(value) + ' ' + airFlowRateUnit();\r\n },\r\n [FormatAirFlowRate, airFlowRateUnit]\r\n );\r\n return { FormatAirFlowRate, FormatAirFlowRateUnit, airFlowRateUnit };\r\n};\r\n","import { Paper } from '@material-ui/core';\r\nimport * as React from 'react';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Radio from '@material-ui/core/Radio';\r\nimport { IPlenum } from 'application/components/api/Plenum';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport { getPlenumImage } from 'application/components/api/Image';\r\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useFlowRate } from 'components/controls/useFlowRate';\r\n\r\n//https://stackoverflow.com/questions/35079287/break-elements-onto-new-line-with-flex-grow-and-flex-wrap\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {},\r\n paper: {\r\n padding: theme.spacing(2),\r\n width: '100%',\r\n marginTop: theme.spacing(2),\r\n },\r\n button: {\r\n float: 'right',\r\n },\r\n plenumImage: {\r\n maxHeight: 120,\r\n },\r\n plenumImageHost: {\r\n textAlign: 'right',\r\n },\r\n\r\n flexContainer: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n flexGrowHor: {\r\n flexGrow: 1,\r\n },\r\n })\r\n);\r\n\r\nexport const PlenumItem = (props: {\r\n plenum: IPlenum;\r\n plenumSelect: (plenum: IPlenum) => any;\r\n plenumdata: IPlenumData;\r\n}) => {\r\n const classes = useStyles();\r\n const { t } = useTranslation();\r\n const { FormatAirFlowRateUnit } = useFlowRate();\r\n\r\n return (\r\n
props.plenumSelect(props.plenum)}>\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n {props.plenum?.name}\r\n \r\n {t('plenum_maxflowrate', 'Max {{flowrate}}', {\r\n flowrate: FormatAirFlowRateUnit(props.plenum?.maxFlowRate),\r\n })}\r\n \r\n \r\n {t('plenum_numberofconnections', '{{numberConnections}} connections', {\r\n numberConnections: props.plenum?.numberConnections,\r\n })}\r\n \r\n
\r\n
\r\n \"\"\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default PlenumItem;\r\n","import RadioGroup from '@material-ui/core/RadioGroup';\r\nimport { IPlenum } from 'application/components/api/Plenum';\r\nimport { makeSelectPlenums } from 'application/components/redux/selectors/plenumSelector';\r\nimport { valveConnectionAdapter } from 'application/project/redux/adapters/valveConnectionAdapter';\r\nimport { plenumConnectionAdapter } from 'application/project/redux/adapters/plenumConnectionAdapter';\r\nimport { selectPlenumdataByPlenumDataSupply } from 'application/project/redux/selectors/plenumdataSelectors';\r\nimport { selectActiveProject } from 'application/project/redux/selectors/projectSelector';\r\nimport { updateAsyncPlenumData } from 'application/project/redux/thunks/AsyncPlenumData';\r\nimport { PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { useGlobalStyles } from 'application/shared/styles';\r\nimport PageTitle from 'components/controls/PageTitle';\r\nimport { InfoDialogEx } from 'components/dialog/InfoDialog';\r\nimport useInfoDialog from 'components/dialog/useInfoDialog';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { selectProjectState } from 'redux/store';\r\nimport { PlenumItem } from './PlenumItem';\r\n\r\nexport const PlenumSelector = (props: { supply: PlenumDataSupply; onNext: () => any }) => {\r\n const dispatch = useDispatch();\r\n const projectConnections = useSelector((state) => selectProjectState(state).valveConnections);\r\n const projectPlenumConnections = useSelector((state) => selectProjectState(state).plenumConnections);\r\n const project = useSelector(selectActiveProject);\r\n const selectPlenums = React.useMemo(makeSelectPlenums, []);\r\n const plenums = useSelector((state) => selectPlenums(state, props.supply, project?.ductTypeID));\r\n const plenumdata = useSelector((state) => selectPlenumdataByPlenumDataSupply(state, props.supply));\r\n const classes = useGlobalStyles();\r\n const [infoDialog, setInfoDialogOpen] = useInfoDialog();\r\n const { t } = useTranslation();\r\n\r\n const plenumSelect = React.useCallback(\r\n (plenum: IPlenum) => {\r\n if (plenumdata && plenumdata?.plenumID !== plenum.plenumID) {\r\n const valid = plenumConnectionAdapter\r\n .getSelectors()\r\n .selectAll(projectPlenumConnections)\r\n .reduce((isValid, plenumConnection) => {\r\n if (!isValid) return isValid;\r\n\r\n const valveConnection = projectConnections.entities[plenumConnection.valveConnectionKey];\r\n if (valveConnection?.supply === props.supply) {\r\n return (\r\n plenumConnection.connectionIndex === undefined ||\r\n plenumConnection.connectionIndex <= plenum.numberConnections\r\n );\r\n }\r\n\r\n return isValid;\r\n }, true);\r\n\r\n if (!valid) {\r\n setInfoDialogOpen({\r\n content: t(\r\n 'plenum_connectionsnumberserror',\r\n 'change plenum not possible, connections numbers will be invalid'\r\n ),\r\n title: t('plenum_connectionsnumberserrortitle', 'change plenum'),\r\n });\r\n return;\r\n }\r\n if (plenumdata && (plenumdata?.airflowRate || 0) > plenum.maxFlowRate + 0.1) {\r\n setInfoDialogOpen({\r\n content: t(\r\n 'plenum_maxflowrateerror',\r\n 'change plenum not possible, the total flow rate exceeds the maximum plenum flow rate'\r\n ),\r\n title: t('plenum_maxflowrateerrortitle', 'change plenum'),\r\n });\r\n return;\r\n }\r\n dispatch(\r\n updateAsyncPlenumData({\r\n ...plenumdata,\r\n plenumID: plenum.plenumID,\r\n })\r\n );\r\n }\r\n },\r\n [plenumdata, dispatch, projectConnections, props.supply, setInfoDialogOpen, t]\r\n );\r\n\r\n const title = React.useMemo(\r\n () =>\r\n t(\r\n 'plenum_title' + (props.supply === PlenumDataSupply.supply ? 'supply' : 'extraction'),\r\n 'Select plenum type for air ' + (props.supply === PlenumDataSupply.supply ? 'supply' : 'extraction')\r\n ),\r\n [t, props.supply]\r\n );\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {plenumdata\r\n ? plenums.map((plenum) => (\r\n \r\n ))\r\n : null}\r\n \r\n {/* */}\r\n
\r\n );\r\n};\r\n","import { enDuctType } from 'application/components/redux/selectors/ductSelector';\r\nimport { RadioSelector } from 'components/controls/RadioSelector';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const DuctTypeSelector = (props: {\r\n value: number | undefined;\r\n name: string;\r\n onChange: (value: number | undefined, name: string, error: string) => any;\r\n}) => {\r\n const { t } = useTranslation(['project']);\r\n const options = React.useMemo(\r\n () => [\r\n { ductID: enDuctType.round92 as number, name: t('ducttype_round', 'round') },\r\n { ductID: enDuctType.oval as number, name: t('ducttype_oval', 'oval') },\r\n ],\r\n [t]\r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { RadioSelector } from 'components/controls/RadioSelector';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const VentilationSystemSelector = (props: {\r\n value: number | undefined;\r\n name: string;\r\n onChange: (value: number | undefined, name: string, error: string) => any;\r\n}) => {\r\n const { t } = useTranslation(['project']);\r\n const options = React.useMemo(\r\n () => [\r\n { id: 1, name: t('balancedVentilation', 'balanced ventilation') },\r\n { id: 2, name: t('extractVentilation', 'extract ventilation') },\r\n ],\r\n [t]\r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\n","export default __webpack_public_path__ + \"static/media/rond.46131de5.png\";","export default __webpack_public_path__ + \"static/media/ovaal.7f784644.png\";","export default __webpack_public_path__ + \"static/media/balans.2c2db99e.png\";","export default __webpack_public_path__ + \"static/media/extract.16705283.png\";","import { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\n\r\nexport const editorStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n image: {\r\n height: 100,\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n objectFit: 'contain',\r\n },\r\n\r\n imageContainer: {\r\n padding: theme.spacing(1),\r\n },\r\n\r\n TextBlockHost: {\r\n //paddingBottom: theme.spacing(1),\r\n },\r\n })\r\n);\r\n","import * as React from 'react';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport AwesomeDebouncePromise from 'awesome-debounce-promise';\r\nimport useConstant from 'use-constant';\r\nimport { IValidateResult, validateNoError } from './TextInputField';\r\n\r\nexport default function DateInputField(props: {\r\n value: string | undefined;\r\n name?: string;\r\n label?: string;\r\n helperText?: string;\r\n onChange: (value: string | undefined, name: string, error: string) => void;\r\n validate?: (value: string | undefined) => IValidateResult;\r\n onBlur?: (value: string | undefined) => string;\r\n required?: boolean;\r\n debounce?: boolean;\r\n disabled?: boolean;\r\n style?: any;\r\n readOnly?: boolean;\r\n fullWidth?: boolean;\r\n className?: string;\r\n error?: boolean;\r\n}) {\r\n //const classes = useStyles();\r\n\r\n const { onChange, validate } = props;\r\n\r\n const valueRef = React.useRef('');\r\n\r\n const date2string = (date: string | undefined) =>\r\n date && date.length > 0 ? new Date(date.substr(0, 10)).toISOString().substr(0, 10) : '';\r\n const valuestring = date2string(props.value);\r\n if (valueRef.current !== valuestring) {\r\n valueRef.current = valuestring;\r\n }\r\n\r\n const [TextValue, setTextValue] = React.useState(valuestring);\r\n //const [Error, setError] = React.useState(\r\n // props.validate ? props.validate(props.value ? props.value.toString() : '') : validateNoError()\r\n //);\r\n\r\n const onChangeCallBack = React.useCallback(\r\n (value: string | undefined, name: string, error: string) => {\r\n if (valueRef.current !== value) {\r\n onChange(value, name, error);\r\n }\r\n },\r\n [onChange]\r\n );\r\n\r\n // Debounce the original search async function\r\n const searchAPIDebounced = useConstant(() => AwesomeDebouncePromise(onChangeCallBack, 1000));\r\n\r\n React.useEffect(() => {\r\n setTextValue(date2string(props.value));\r\n }, [props.value]);\r\n\r\n const handleTextChange = React.useCallback(\r\n async (value: string | undefined, name: string) => {\r\n setTextValue(value || '');\r\n let error = validate ? validate(value) : validateNoError();\r\n if (props.debounce) {\r\n await searchAPIDebounced(value, name, error.error);\r\n } else {\r\n if (props.value !== value) {\r\n onChangeCallBack(value, name, error.error);\r\n }\r\n }\r\n },\r\n [onChangeCallBack, validate, props.debounce, searchAPIDebounced, props.value]\r\n );\r\n\r\n return (\r\n ) => {\r\n handleTextChange(event.target.value, event.target.name);\r\n },\r\n [handleTextChange]\r\n )}\r\n />\r\n );\r\n}\r\n","import { RadioSelector } from 'components/controls/RadioSelector';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const ValveDiameterSelector = (props: {\r\n value: number | undefined;\r\n name: string;\r\n onChange: (value: number | undefined, name: string, error: string) => any;\r\n}) => {\r\n const { t } = useTranslation(['project']);\r\n const options = React.useMemo(\r\n () => [\r\n { id: 1, name: t('valvediameter117', '117 mm') },\r\n { id: 2, name: t('valvediameter125', '125 mm') },\r\n ],\r\n [t]\r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { selectComponentState } from 'redux/store';\r\nimport { bendAdapter } from '../adapters/bendAdapter';\r\n\r\nexport enum enBendType {\r\n bend90 = 1,\r\n bend90supportfoot,\r\n bendHorizontal,\r\n bendVertical,\r\n}\r\n\r\nexport const {\r\n selectAll: selectAllBends,\r\n selectById: selectBendById,\r\n selectEntities: selectBendEntities,\r\n} = bendAdapter.getSelectors((state) => selectComponentState(state).bends);\r\n\r\nexport const makeSelectBends = () => {\r\n return createSelector(\r\n // First, pass one or more \"input selector\" functions:\r\n (state: any, ductTypeID: number | undefined) => ductTypeID,\r\n (state: any) => selectAllBends(state),\r\n // Then, an \"output selector\" that receives all the input results as arguments\r\n // and returns a final result value\r\n (ductTypeID, bends) => bends.filter((a) => a.ductID === ductTypeID)\r\n );\r\n};\r\n","import { enFlowUnit } from 'application/project/api/Project';\r\nimport { RadioSelector } from 'components/controls/RadioSelector';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const FlowUnitSelector = (props: {\r\n value: number | undefined;\r\n name: string;\r\n onChange: (value: number | undefined, name: string, error: string) => any;\r\n}) => {\r\n const { t } = useTranslation(['project']);\r\n const options = React.useMemo(\r\n () => [\r\n { id: enFlowUnit.m3_h, name: t('flowunit_m3h', 'm3/h') },\r\n { id: enFlowUnit.dm3_s, name: t('flowunit_ls', 'dm3/s') },\r\n ],\r\n [t]\r\n );\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import * as React from 'react';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport clsx from 'clsx';\r\nimport { Theme, createStyles, makeStyles } from '@material-ui/core/styles';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport FormHelperText from '@material-ui/core/FormHelperText';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n checkbox: {\r\n marginTop: 16,\r\n },\r\n })\r\n);\r\n\r\nexport const CheckBoxer = (props: {\r\n value: boolean | undefined;\r\n name: string;\r\n label?: string;\r\n helperText?: string;\r\n className?: string;\r\n onChange: (value: boolean, name: string, error: string) => any;\r\n}) => {\r\n const { onChange } = props;\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n {props.label}\r\n \r\n ) => onChange(event.target.checked, props.name, ''),\r\n [onChange, props.name]\r\n )}\r\n name={props.name}\r\n />\r\n {props.helperText}\r\n \r\n );\r\n};\r\n","import Grid from '@material-ui/core/Grid';\r\nimport { IProject, updateProject } from 'application/project/api/Project';\r\nimport { projectSlice } from 'application/project/redux/projectSlice';\r\nimport { selectActiveProject } from 'application/project/redux/selectors/projectSelector';\r\nimport EditorPage from 'components/controls/EditorPage';\r\nimport TextInputField from 'components/controls/TextInputField';\r\nimport * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { DuctTypeSelector } from './DuctTypeSelector';\r\nimport { VentilationSystemSelector } from './VentilationSystemSelector';\r\nimport afbeelding_round from 'image/settings/rond.png';\r\nimport afbeelding_oval from 'image/settings/ovaal.png';\r\nimport afbeelding_balans from 'image/settings/balans.png';\r\nimport afbeelding_extract from 'image/settings/extract.png';\r\nimport { editorStyles } from '../editorStyles';\r\nimport useInfoDialog from 'components/dialog/useInfoDialog';\r\nimport { InfoDialogEx } from 'components/dialog/InfoDialog';\r\nimport nameof from 'ts-nameof.macro';\r\nimport { valveConnectionAdapter } from 'application/project/redux/adapters/valveConnectionAdapter';\r\nimport { selectCommonState, selectProjectState } from 'redux/store';\r\nimport { PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { eppDataComponentAdapter } from 'application/project/redux/adapters/eppDataComponentAdapter';\r\nimport { useTranslation } from 'react-i18next';\r\nimport DateInputField from 'components/controls/DateInputField';\r\nimport { ValveDiameterSelector } from './ValveDiameterSelector';\r\nimport { FlowUnitSelector } from './FlowUnitSelector';\r\nimport { CheckBoxer } from 'components/controls/CheckBoxer';\r\nimport { RoleName } from 'application/common/redux/commonState';\r\n\r\nconst ProjectSettings = (props: { onNext: () => any }) => {\r\n const dispatch = useDispatch();\r\n const projectState = useSelector((state) => selectProjectState(state));\r\n const roles = useSelector((state) => selectCommonState(state).user?.roles) || ([] as string[]);\r\n const project = useSelector(selectActiveProject);\r\n\r\n const projectRef = React.useRef(project);\r\n projectRef.current = project;\r\n\r\n const [infoDialog, setInfoDialogOpen] = useInfoDialog();\r\n const classes = editorStyles();\r\n const { t } = useTranslation(['project']);\r\n\r\n const changeField = React.useCallback(\r\n (value: string | number | boolean | undefined, field: string, error: string) => {\r\n if (\r\n (field === nameof((o) => o.ventilationTypeID) && value === 2) ||\r\n field === nameof((o) => o.ductTypeID)\r\n ) {\r\n const connectors = valveConnectionAdapter.getSelectors().selectAll(projectState.valveConnections);\r\n const eppdatas = eppDataComponentAdapter.getSelectors().selectAll(projectState.eppdatacomponents);\r\n\r\n if (field === nameof((o) => o.ventilationTypeID) && value === 2) {\r\n //we want change to extraction only\r\n //is is only allowed when there is no supply plenum\r\n const supplyConnections = connectors.reduce(\r\n (val, a) => (a.supply === PlenumDataSupply.supply ? val + 1 : val),\r\n 0\r\n );\r\n const supplyeppdata = eppdatas.reduce(\r\n (val, a) => (a.supply === PlenumDataSupply.supply && a.amount && a.amount > 0 ? val + a.amount : val),\r\n 0\r\n );\r\n\r\n if (supplyConnections > 0 || supplyeppdata > 0) {\r\n setInfoDialogOpen({\r\n content:\r\n t('errorChangeVentilationType', 'change to extraction not possible') +\r\n (supplyConnections > 0\r\n ? t('errorChangeVentilationTypeSupplyConnections', ', there are supply connections')\r\n : '') +\r\n (supplyeppdata > 0\r\n ? t('errorChangeVentilationTypeSupplyEppData', ', there are supply connectionmaterials')\r\n : ''),\r\n title: t('errorChangeVentilationTypeTitle', 'change ventilation type'),\r\n });\r\n return;\r\n }\r\n }\r\n if (field === nameof((o) => o.ductTypeID) && connectors.length > 0) {\r\n setInfoDialogOpen({\r\n content: t('errorChangeDuctType', 'change duct type not possible, there are supply connections'),\r\n title: t('errorChangeDuctTypeTitle', 'change duct type'),\r\n });\r\n return;\r\n }\r\n }\r\n if (projectRef.current) {\r\n const newProject = {\r\n ...projectRef.current,\r\n [field]: value,\r\n };\r\n projectRef.current = newProject;\r\n\r\n updateProject(newProject).then((result) => {\r\n dispatch(projectSlice.actions.activeProjectChanged(result as IProject));\r\n });\r\n }\r\n },\r\n [dispatch, projectState, setInfoDialogOpen, t]\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n ((o) => o.title)}\r\n fullWidth\r\n required\r\n debounce={true}\r\n value={project?.title}\r\n onChange={changeField}\r\n helperText=\" \"\r\n />\r\n \r\n \r\n ((o) => o.date)}\r\n fullWidth\r\n required\r\n debounce={false}\r\n value={project?.date}\r\n onChange={changeField}\r\n helperText=\" \"\r\n />\r\n \r\n \r\n
\r\n ((o) => o.address)}\r\n fullWidth\r\n multiline\r\n rows={4}\r\n debounce={true}\r\n value={project?.address}\r\n onChange={changeField}\r\n helperText=\" \"\r\n />\r\n
\r\n
\r\n ((o) => o.advizer)}\r\n fullWidth\r\n multiline\r\n rows={4}\r\n debounce={true}\r\n value={project?.advizer}\r\n onChange={changeField}\r\n helperText=\" \"\r\n />\r\n
\r\n
\r\n ((o) => o.description)}\r\n fullWidth\r\n multiline\r\n rows={4}\r\n debounce={true}\r\n value={project?.description}\r\n onChange={changeField}\r\n helperText=\" \"\r\n />\r\n
\r\n \r\n \r\n
\r\n ((o) => o.ductTypeID)}\r\n value={project?.ductTypeID}\r\n onChange={changeField}\r\n />\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n ((o) => o.ventilationTypeID)}\r\n value={project?.ventilationTypeID}\r\n onChange={changeField}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n ((o) => o.valveDiameterID)}\r\n value={project?.valveDiameterID}\r\n onChange={changeField}\r\n />\r\n \r\n \r\n ((o) => o.flowUnitID)}\r\n value={project?.flowUnitID}\r\n onChange={changeField}\r\n />\r\n \r\n
\r\n\r\n {roles.includes(RoleName[RoleName.Experimental]) ? (\r\n \r\n \r\n
\r\n ((o) => o.experimental)}\r\n value={project?.experimental}\r\n onChange={changeField}\r\n label={t('experimental', 'experimental')}\r\n />\r\n
\r\n
\r\n
\r\n ) : null}\r\n
\r\n );\r\n};\r\n\r\n//const commonState = useSelector(selectCommonState);\r\n\r\nexport default ProjectSettings;\r\n","import { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\r\n\r\nconst connectionStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {},\r\n\r\n part: {\r\n margin: 5,\r\n borderColor: '#aa0000',\r\n borderStyle: 'solid',\r\n borderWidth: 1,\r\n },\r\n\r\n checkbox: {\r\n marginTop: 16,\r\n },\r\n\r\n flexContainer: {\r\n display: 'flex',\r\n },\r\n\r\n flexGrowHor: {\r\n flexGrow: 1,\r\n },\r\n\r\n floatRight: {\r\n float: 'right',\r\n },\r\n\r\n halfLeft: {\r\n width: 'calc(50% - 4px)',\r\n float: 'left',\r\n },\r\n halfRight: {\r\n width: 'calc(50% - 4px)',\r\n float: 'right',\r\n },\r\n\r\n partBlock: {\r\n overflow: 'auto',\r\n paddingLeft: 4,\r\n paddingRight: 4,\r\n },\r\n partComplexBlock: {\r\n overflow: 'auto',\r\n },\r\n\r\n valveImage: {\r\n maxWidth: 100,\r\n },\r\n\r\n connectionRoot: {\r\n position: 'relative',\r\n '& .restrictor': {\r\n '& .MuiInputBase-formControl': {\r\n backgroundColor: theme.palette.grey[300],\r\n Color: theme.palette.text.primary,\r\n fontWeight: 600,\r\n },\r\n },\r\n borderStyle: 'solid',\r\n borderColor: '#fff',\r\n borderWidth: 1,\r\n '&.actief': {\r\n '&.connectionError': { borderColor: theme.palette.error.main },\r\n '&.ConnectionDirtydirty': { borderColor: theme.palette.secondary.main },\r\n '&.ConnectionDirtysaving': { borderColor: theme.palette.success.main },\r\n borderColor: theme.palette.primary.main,\r\n backgroundColor: theme.palette.primary.main,\r\n '& .MuiInputBase-formControl': {\r\n backgroundColor: 'white',\r\n },\r\n '& .MuiFilledInput-underline::after': {\r\n borderColor: theme.palette.secondary.main,\r\n },\r\n '& .CheckBoxerLabel': {\r\n color: 'white',\r\n },\r\n '& .MuiCheckbox-root': {\r\n color: 'white',\r\n },\r\n '& .MuiCheckbox-root.Mui-checked': {\r\n color: theme.palette.secondary.main,\r\n },\r\n '& .MuiFormHelperText-root': {\r\n color: 'white',\r\n },\r\n '& .MuiSvgIcon-root': {\r\n color: 'white',\r\n },\r\n '& .valvewarn': {\r\n color: 'white',\r\n },\r\n },\r\n },\r\n deleteButton: {\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n width: 60,\r\n height: 60,\r\n },\r\n deleteIcon: {\r\n width: 40,\r\n height: 40,\r\n },\r\n\r\n elbow: {\r\n minWidth: 60,\r\n },\r\n\r\n inputClassName: {},\r\n\r\n tableStyle: { width: '100%', tableLayout: 'fixed' },\r\n tableCell3: { paddingLeft: 0, paddingRight: 0, width: '33%', verticalAlign: 'top' },\r\n tableCell2: { paddingLeft: 0, paddingRight: 0, width: '50%', verticalAlign: 'top' },\r\n })\r\n);\r\n\r\nexport default connectionStyles;\r\n","import { IValveConnection } from 'application/project/api/Connection';\r\nimport TextInputField from 'components/controls/TextInputField';\r\nimport * as React from 'react';\r\nimport nameof from 'ts-nameof.macro';\r\nimport connectionStyles from './controls/connectionStyles';\r\nimport clsx from 'clsx';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst PartDescription = (props: {\r\n connection: IValveConnection;\r\n onChange: (value: string, field: string, error: string) => any;\r\n}) => {\r\n const classes = connectionStyles();\r\n const { onChange, connection } = props;\r\n const { t } = useTranslation(['roomeditor']);\r\n\r\n return (\r\n
\r\n {\r\n onChange(value, name, error);\r\n },\r\n [onChange]\r\n )}\r\n />\r\n
\r\n );\r\n};\r\n\r\nexport default PartDescription;\r\n","import NumberInputField from 'components/controls/NumberInputField';\r\nimport { validateNoError } from 'components/controls/TextInputField';\r\nimport { useFlowRate } from 'components/controls/useFlowRate';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectProjectState } from 'redux/store';\r\nimport connectionStyles from './connectionStyles';\r\n\r\nconst normalizeAirFlowRate = (value: number | undefined, convertM3H: boolean) => {\r\n if (value && convertM3H) return value / 3.6;\r\n return value;\r\n};\r\n\r\nconst prettierAirFlowRate = (value: number | undefined) => {\r\n if (value) return Math.round(value * 1000) / 1000;\r\n return value;\r\n};\r\n\r\nconst DebietInputField = (props: {\r\n value: number | undefined;\r\n minAirflowRate: number;\r\n maxAirflowRate: number;\r\n warnAirflowRate: number;\r\n plenumMaxAirflowRate: number;\r\n plenumAirflowRate: number;\r\n convertM3H: boolean;\r\n name: string;\r\n label: string;\r\n onChange: (value: number, name: string, error: string) => void;\r\n required: boolean;\r\n debounce?: boolean;\r\n disabled?: boolean;\r\n style?: any;\r\n readOnly?: boolean;\r\n fullWidth?: boolean;\r\n className?: string;\r\n}) => {\r\n const { onChange } = props;\r\n const { t } = useTranslation(['roomeditor']);\r\n const { FormatAirFlowRateUnit } = useFlowRate();\r\n const classes = connectionStyles();\r\n const experimental = useSelector(selectProjectState)?.activeProject?.experimental || false;\r\n\r\n const helperText = React.useMemo(\r\n () =>\r\n t('airflowrate_helper', 'between {{minAirflowRate}} and {{maxAirflowRate}}', {\r\n minAirflowRate: FormatAirFlowRateUnit(props.minAirflowRate),\r\n maxAirflowRate: FormatAirFlowRateUnit(props.maxAirflowRate),\r\n }),\r\n [props.minAirflowRate, props.maxAirflowRate, t, FormatAirFlowRateUnit]\r\n );\r\n\r\n const helperWarnText = React.useMemo(\r\n () =>\r\n t(\r\n 'airflowrate_helperwarn',\r\n 'N.B.: extraction/supply of air more than {{warnAirflowRate}} can have a negative effect on noise levels',\r\n {\r\n warnAirflowRate: FormatAirFlowRateUnit(props.warnAirflowRate),\r\n }\r\n ),\r\n [props.warnAirflowRate, t, FormatAirFlowRateUnit]\r\n );\r\n const validate = React.useCallback(\r\n (value: number) => {\r\n const val = normalizeAirFlowRate(value, props.convertM3H);\r\n if (!val) return validateNoError();\r\n if (val < props.minAirflowRate || val > props.maxAirflowRate) {\r\n if (experimental) {\r\n return {\r\n warn: helperText,\r\n error: '',\r\n };\r\n } else {\r\n return {\r\n warn: '',\r\n error: helperText,\r\n };\r\n }\r\n }\r\n if (props.plenumAirflowRate + val > props.plenumMaxAirflowRate + 0.1) {\r\n if (experimental) {\r\n return {\r\n error: '',\r\n warn: t(\r\n 'airflowrate_maxplenum',\r\n 'Total flow rate {{currentAirflowRate}} above maximum flow rate plenum {{maxAirflowRate}}',\r\n {\r\n currentAirflowRate: FormatAirFlowRateUnit(props.plenumAirflowRate + val),\r\n maxAirflowRate: FormatAirFlowRateUnit(props.plenumMaxAirflowRate),\r\n }\r\n ),\r\n };\r\n } else {\r\n return {\r\n warn: '',\r\n error: t(\r\n 'airflowrate_maxplenum',\r\n 'Total flow rate {{currentAirflowRate}} above maximum flow rate plenum {{maxAirflowRate}}',\r\n {\r\n currentAirflowRate: FormatAirFlowRateUnit(props.plenumAirflowRate + val),\r\n maxAirflowRate: FormatAirFlowRateUnit(props.plenumMaxAirflowRate),\r\n }\r\n ),\r\n };\r\n }\r\n }\r\n if (props.warnAirflowRate !== 0 && val > props.warnAirflowRate + 0.1) {\r\n return {\r\n warn: helperWarnText,\r\n error: '',\r\n };\r\n }\r\n return validateNoError();\r\n },\r\n [\r\n props.minAirflowRate,\r\n props.maxAirflowRate,\r\n props.warnAirflowRate,\r\n props.convertM3H,\r\n props.plenumAirflowRate,\r\n props.plenumMaxAirflowRate,\r\n t,\r\n helperText,\r\n helperWarnText,\r\n FormatAirFlowRateUnit,\r\n experimental,\r\n ]\r\n );\r\n\r\n return (\r\n {\r\n return props.value && props.convertM3H ? prettierAirFlowRate(props.value * 3.6) : props.value;\r\n }, [props.convertM3H, props.value])}\r\n name={props.name}\r\n validate={validate}\r\n label={props.label}\r\n helperText={helperText}\r\n onChange={React.useCallback(\r\n (value: number | undefined, name: string, error: string) => {\r\n if (!value) return '';\r\n const val = normalizeAirFlowRate(value, props.convertM3H);\r\n if (val && !error) {\r\n onChange(val, name, error);\r\n }\r\n },\r\n [onChange, props.convertM3H]\r\n )}\r\n required={props.required}\r\n disabled={props.disabled}\r\n debounce\r\n style={props.style}\r\n readOnly={props.readOnly}\r\n inputClassName={classes.inputClassName}\r\n type=\"decimal\"\r\n fullWidth={props.fullWidth}\r\n className={props.className}\r\n />\r\n );\r\n};\r\n\r\nexport default DebietInputField;\r\n","import { IValveConnection } from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport { enFlowUnit } from 'application/project/api/Project';\r\nimport { selectFlowUnitID } from 'application/project/redux/selectors/projectSelector';\r\nimport clsx from 'clsx';\r\nimport { useFlowRate } from 'components/controls/useFlowRate';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectProjectState } from 'redux/store';\r\nimport nameof from 'ts-nameof.macro';\r\nimport connectionStyles from './controls/connectionStyles';\r\nimport DebietInputField from './controls/DebietInputField';\r\n\r\nconst PartDebiet = (props: {\r\n plenumdata: IPlenumData;\r\n connection: IValveConnection;\r\n minAirflowRate: number;\r\n maxAirflowRate: number;\r\n warnAirflowRate: number;\r\n plenumMaxAirflowRate: number;\r\n plenumAirflowRate: number;\r\n onChange: (value: number, field: string, error: string) => any;\r\n}) => {\r\n const classes = connectionStyles();\r\n const { airFlowRateUnit } = useFlowRate();\r\n const flowUnitID = useSelector(selectFlowUnitID);\r\n\r\n const { t } = useTranslation(['roomeditor']);\r\n\r\n const { onChange } = props;\r\n const onMyChange = React.useCallback(\r\n (value: number, name: string, error: string) => {\r\n onChange(value, name, error);\r\n },\r\n [onChange]\r\n );\r\n\r\n console.log('PartDebiet', props);\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default PartDebiet;\r\n","import { DUCT_WARN_LENGTH } from 'application/project/api/Connection';\r\nimport NumberInputField from 'components/controls/NumberInputField';\r\nimport { validateNoError } from 'components/controls/TextInputField';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectProjectState } from 'redux/store';\r\n\r\nconst LengthInputField = (props: {\r\n value: number | undefined;\r\n name: string;\r\n label: string;\r\n maxLength: number;\r\n onChange: (value: number, name: string, error: string) => void;\r\n required: boolean;\r\n disabled?: boolean;\r\n style?: any;\r\n readOnly?: boolean;\r\n className?: string;\r\n}) => {\r\n const { onChange } = props;\r\n const { t } = useTranslation(['roomeditor']);\r\n const experimental = useSelector(selectProjectState)?.activeProject?.experimental || false;\r\n\r\n const helperText = React.useMemo(\r\n () => t('lenghtInputHelper', 'max {{maxLength}} m', { maxLength: props.maxLength }),\r\n [props.maxLength, t]\r\n );\r\n const helperWarnText = React.useMemo(\r\n () =>\r\n t(\r\n 'lenghtInputWarn',\r\n 'N.B.: a duct length greater than {{maxLength}} m can have a negative effect on noise levels',\r\n {\r\n maxLength: DUCT_WARN_LENGTH,\r\n }\r\n ),\r\n [t]\r\n );\r\n const validate = React.useCallback(\r\n (val: number) => {\r\n if (val <= 0 || (val > props.maxLength && !experimental)) return { error: helperText, warn: '' };\r\n if (val > DUCT_WARN_LENGTH + 0.1) {\r\n return {\r\n warn: helperWarnText,\r\n error: '',\r\n };\r\n }\r\n return validateNoError();\r\n },\r\n [props.maxLength, helperText, helperWarnText]\r\n );\r\n\r\n return (\r\n {\r\n if (value) {\r\n onChange(value, name, error);\r\n }\r\n },\r\n [onChange]\r\n )}\r\n required={props.required}\r\n disabled={props.disabled}\r\n style={props.style}\r\n readOnly={props.readOnly}\r\n type=\"decimal\"\r\n fullWidth\r\n className={props.className}\r\n />\r\n );\r\n};\r\n\r\nexport default LengthInputField;\r\n","import { selectComponentState } from 'redux/store';\r\nimport { ductAdapterAdapter } from '../adapters/ductAdapterAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllDuctAdapters,\r\n selectById: selectDuctAdapterById,\r\n selectEntities: selectDuctAdapterEntities,\r\n} = ductAdapterAdapter.getSelectors((state) => selectComponentState(state).ductadapters);\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { ISection } from 'application/project/api/Connection';\r\nimport { selectProjectState } from 'redux/store';\r\nimport { sectionAdapter } from '../adapters/sectionAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllSections,\r\n selectById: selectSectionByKey,\r\n selectEntities: selectSectionEntities,\r\n} = sectionAdapter.getSelectors((state) => selectProjectState(state).sections);\r\n\r\nexport const makeSelectSectionsByConnection = () => {\r\n return createSelector(\r\n // First, pass one or more \"input selector\" functions:\r\n (state: any, valveConnectionKey: string, plenumConnectionIndex: number) => selectAllSections(state),\r\n (state: any, valveConnectionKey: string, plenumConnectionIndex: number) => valveConnectionKey,\r\n (state: any, valveConnectionKey: string, plenumConnectionIndex: number) => plenumConnectionIndex,\r\n // Then, an \"output selector\" that receives all the input results as arguments\r\n // and returns a final result value\r\n (sections, valveConnectionKey, plenumConnectionIndex) => {\r\n return sections.filter(\r\n (section) =>\r\n section.valveConnectionKey === valveConnectionKey && section.plenumConnectionIndex === plenumConnectionIndex\r\n ) as ISection[];\r\n }\r\n );\r\n};\r\n","import FormControl from '@material-ui/core/FormControl';\r\nimport FormHelperText from '@material-ui/core/FormHelperText';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport Select from '@material-ui/core/Select';\r\nimport React from 'react';\r\n\r\nconst Selector = (props: {\r\n value: string | number | undefined;\r\n name: string;\r\n label?: string;\r\n helperText?: string;\r\n onChange: (value: number | undefined, name: string, error: string) => any;\r\n onBlur?: (value: string) => string;\r\n required?: boolean;\r\n displayEmpty?: boolean;\r\n style?: any;\r\n readOnly?: boolean;\r\n fullWidth?: boolean;\r\n className?: string;\r\n items: any[];\r\n}) => {\r\n const { onChange, onBlur } = props;\r\n\r\n const handleChange = React.useCallback(\r\n (event: React.ChangeEvent<{ value: unknown }>) => {\r\n const val = event.target.value as string;\r\n onChange(val ? parseInt(val) : undefined, props.name, '');\r\n },\r\n [onChange, props.name]\r\n );\r\n return (\r\n props.required && (props.value === undefined || props.value === 0),\r\n [props.value, props.required]\r\n )}>\r\n {props.label}\r\n ) => {\r\n if (onBlur) {\r\n onBlur(event.target.value);\r\n }\r\n },\r\n [onBlur]\r\n )}>\r\n {props.items}\r\n \r\n {props.helperText}\r\n \r\n );\r\n};\r\n\r\nexport default Selector;\r\n","import MenuItem from '@material-ui/core/MenuItem';\r\nimport { selectDuctAdapterEntities } from 'application/components/redux/selectors/ductAdapterSelector';\r\nimport { enDuctType, selectAllDucts } from 'application/components/redux/selectors/ductSelector';\r\nimport { selectPlenumById } from 'application/components/redux/selectors/plenumSelector';\r\nimport { ISection, IValveConnection, SECTIONS_AS_PLENUMCONNECTION_0 } from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport { makeSelectSectionsByConnection } from 'application/project/redux/selectors/sectionSelectors';\r\nimport Selector from 'components/controls/Selector';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport nameof from 'ts-nameof.macro';\r\n\r\nconst DuctSelect = (props: {\r\n plenumdata: IPlenumData;\r\n connection: IValveConnection;\r\n section: ISection;\r\n onChange: (value: number | undefined, field: string, error: string) => any;\r\n}) => {\r\n const { onChange, section } = props;\r\n const { ductID, indexNumber } = section;\r\n const { t } = useTranslation(['roomeditor']);\r\n\r\n const plenumDuctID = useSelector(\r\n (state) => selectPlenumById(state, props.plenumdata.plenumID ? props.plenumdata.plenumID : 0)?.ductID\r\n );\r\n const allDucts = useSelector(selectAllDucts);\r\n const ductAdapterEntities = useSelector(selectDuctAdapterEntities);\r\n const selectSectionsByConnection = React.useMemo(makeSelectSectionsByConnection, []);\r\n const sections = useSelector((state) =>\r\n selectSectionsByConnection(state, props.connection.valveConnectionKey, SECTIONS_AS_PLENUMCONNECTION_0)\r\n );\r\n const prevAdapterDuctID = React.useMemo(() => {\r\n if (indexNumber !== 0) {\r\n const prevSection = sections.find((a) => a.indexNumber === indexNumber - 1);\r\n const adapter = ductAdapterEntities[prevSection?.ductAdapterID || 0];\r\n if (adapter) {\r\n return adapter.ductID1 === prevSection?.ductID ? adapter.ductID2 : adapter.ductID1;\r\n }\r\n }\r\n return 0;\r\n }, [sections, section, ductAdapterEntities]);\r\n\r\n const ducts = React.useMemo(\r\n () =>\r\n allDucts.filter(\r\n (duct) =>\r\n (indexNumber === 0 &&\r\n plenumDuctID === enDuctType.round92 &&\r\n (duct.ductID === enDuctType.round92 || duct.ductID === enDuctType.round75)) ||\r\n (indexNumber === 0 && plenumDuctID === enDuctType.oval && duct.ductID === enDuctType.oval) ||\r\n duct.ductID === prevAdapterDuctID\r\n ),\r\n [plenumDuctID, allDucts, indexNumber, prevAdapterDuctID]\r\n );\r\n\r\n React.useEffect(() => {\r\n if (ducts.length > 0) {\r\n if (!ductID || !ducts.find((a) => a.ductID === ductID)) {\r\n onChange(ducts[0].ductID, nameof(ductID), '');\r\n }\r\n } else {\r\n onChange(undefined, nameof(ductID), '');\r\n }\r\n }, [onChange, ductID, ducts]);\r\n\r\n return (\r\n (\r\n \r\n {duct.name}\r\n \r\n ))}\r\n />\r\n );\r\n};\r\n\r\nexport default DuctSelect;\r\n","import { projectSlice } from '../projectSlice';\r\nimport { updateConnectionThunk } from './AsyncConnectionUpdate';\r\n\r\nexport const SetSectionValue = (valveConnectionKey: string, id: string, name: string, value: any) => {\r\n return async (dispatch: any, getState: any) => {\r\n await dispatch(projectSlice.actions.updateSection({ id: id, name: name, value: value }));\r\n await dispatch(updateConnectionThunk(valveConnectionKey));\r\n };\r\n};\r\n","import * as React from 'react';\r\nimport {\r\n DUCT_MAX_LENGTH,\r\n ISection,\r\n IValveConnection,\r\n SECTIONS_AS_PLENUMCONNECTION_0,\r\n} from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport connectionStyles from './controls/connectionStyles';\r\nimport clsx from 'clsx';\r\nimport nameof from 'ts-nameof.macro';\r\nimport LengthInputField from './controls/LengthInputField';\r\nimport DuctSelect from './controls/DuctSelect';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SetSectionValue } from 'application/project/redux/thunks/SetSectionValue';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { sectionKey } from 'application/project/redux/adapters/sectionAdapter';\r\nimport { makeSelectSectionsByConnection } from 'application/project/redux/selectors/sectionSelectors';\r\n\r\nconst PartDuctAndLength = (props: { plenumdata: IPlenumData; connection: IValveConnection; section: ISection }) => {\r\n const classes = connectionStyles();\r\n const dispatch = useDispatch();\r\n const { section } = props;\r\n const { t } = useTranslation(['roomeditor']);\r\n\r\n const onChange = React.useCallback(\r\n (value: number | undefined, field: string, error: string) =>\r\n dispatch(SetSectionValue(section.valveConnectionKey, sectionKey(section), field, value)),\r\n [dispatch, section]\r\n );\r\n const selectSectionsByConnection = React.useMemo(makeSelectSectionsByConnection, []);\r\n const sections = useSelector((state) =>\r\n selectSectionsByConnection(state, props.connection.valveConnectionKey, SECTIONS_AS_PLENUMCONNECTION_0)\r\n );\r\n const maxLength = React.useMemo(() => {\r\n const totalLengte = sections\r\n .filter((a) => a.indexNumber !== section.indexNumber)\r\n .reduce((val, sec) => val + (sec.ductLenght || 0), 0);\r\n return Math.max(DUCT_MAX_LENGTH - totalLengte, 0);\r\n }, [sections, section]);\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default PartDuctAndLength;\r\n","import { selectProjectState } from 'redux/store';\r\nimport { sectionBendAdapter } from '../adapters/sectionBendAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllSectionBends,\r\n selectById: selectSectionBendByKey,\r\n selectEntities: selectSectionBendEntities,\r\n} = sectionBendAdapter.getSelectors((state) => selectProjectState(state).sectionbends);\r\n","import * as React from 'react';\r\nimport { ISection, ISectionBend } from 'application/project/api/Connection';\r\nimport nameof from 'ts-nameof.macro';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { IBend } from 'application/components/api/Bend';\r\nimport AmountInputField from 'components/controls/AmountInputField';\r\nimport { SetSectionBendValue } from 'application/project/redux/thunks/SetBendBendValue';\r\nimport { selectSectionBendByKey } from 'application/project/redux/selectors/sectionBendSelectors';\r\nimport { sectionBendKeyIntern } from 'application/project/redux/adapters/sectionBendAdapter';\r\n\r\nconst PartDuctElbow = (props: { bend: IBend; section: ISection }) => {\r\n const dispatch = useDispatch();\r\n const { section, bend } = props;\r\n\r\n const sectionBend = useSelector((state) =>\r\n selectSectionBendByKey(\r\n state,\r\n sectionBendKeyIntern(section.valveConnectionKey, section.plenumConnectionIndex, section.indexNumber, bend.bendID)\r\n )\r\n );\r\n\r\n const onChange = React.useCallback(\r\n (value: number | undefined, field: string, error: string) =>\r\n dispatch(SetSectionBendValue(section.valveConnectionKey, section, bend.bendID, value)),\r\n [dispatch, section]\r\n );\r\n\r\n return (\r\n ((a) => a.amount)}\r\n value={sectionBend?.amount}\r\n onChange={onChange}\r\n fullWidth\r\n />\r\n );\r\n};\r\n\r\nexport default PartDuctElbow;\r\n","import { ISection, ISectionBend } from 'application/project/api/Connection';\r\nimport { projectSlice } from '../projectSlice';\r\nimport { updateConnectionThunk } from './AsyncConnectionUpdate';\r\n\r\nexport const SetSectionBendValue = (\r\n valveConnectionKey: string,\r\n section: ISection,\r\n bendID: number,\r\n amount: number | undefined\r\n) => {\r\n return async (dispatch: any, getState: any) => {\r\n await dispatch(projectSlice.actions.updateSectionBend({ section: section, bendID: bendID, amount: amount }));\r\n await dispatch(updateConnectionThunk(valveConnectionKey));\r\n };\r\n};\r\n","import * as React from 'react';\r\nimport { ISection, IValveConnection } from 'application/project/api/Connection';\r\nimport clsx from 'clsx';\r\nimport { useSelector } from 'react-redux';\r\nimport { makeSelectBends } from 'application/components/redux/selectors/bendSelector';\r\nimport connectionStyles from './controls/connectionStyles';\r\nimport PartDuctElbow from './PartDuctElbow';\r\n\r\nconst PartDuctElbows = (props: { connection: IValveConnection; section: ISection }) => {\r\n const classes = connectionStyles();\r\n const { section } = props;\r\n const selectBends = React.useMemo(makeSelectBends, []);\r\n const bends = useSelector((state) => selectBends(state, section.ductID));\r\n return (\r\n
\r\n {bends.map((bend, index) => (\r\n
\r\n \r\n
\r\n ))}\r\n
\r\n );\r\n};\r\n\r\nexport default PartDuctElbows;\r\n","import * as React from 'react';\r\nimport { ISection, IValveConnection } from 'application/project/api/Connection';\r\nimport nameof from 'ts-nameof.macro';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport { selectAllDuctAdapters } from 'application/components/redux/selectors/ductAdapterSelector';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useTranslation } from 'react-i18next';\r\nimport Selector from 'components/controls/Selector';\r\nimport { SetSectionValue } from 'application/project/redux/thunks/SetSectionValue';\r\nimport { sectionKey } from 'application/project/redux/adapters/sectionAdapter';\r\n\r\nconst PartAdapter = (props: { connection: IValveConnection; section: ISection }) => {\r\n const { section } = props;\r\n const dispatch = useDispatch();\r\n const allAdapters = useSelector(selectAllDuctAdapters);\r\n const { t } = useTranslation(['roomeditor']);\r\n\r\n const onChange = React.useCallback(\r\n (value: number | undefined, field: string, error: string) =>\r\n dispatch(\r\n SetSectionValue(section.valveConnectionKey, sectionKey(section), field, value === 0 ? undefined : value)\r\n ),\r\n [dispatch, section]\r\n );\r\n\r\n const adapters = React.useMemo(\r\n () => [\r\n { ductAdapterID: 0, name: 'no adapter' },\r\n ...allAdapters.filter((a) => a.ductID1 === props.section.ductID || a.ductID2 === props.section.ductID),\r\n ],\r\n [allAdapters, props.section.ductID, t]\r\n );\r\n\r\n return props.section.indexNumber <= 1 || props.section.ductAdapterID ? (\r\n (\r\n \r\n {adapter.name}\r\n \r\n ))}\r\n />\r\n ) : null;\r\n};\r\n\r\nexport default PartAdapter;\r\n","import { selectComponentState } from 'redux/store';\r\nimport { valveConnectorGridAdapter } from '../adapters/valveConnectorGridAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllValveConnectorGrids,\r\n selectById: selectValveConnectorGridById,\r\n selectEntities: selectValveConnectorGridEntities,\r\n} = valveConnectorGridAdapter.getSelectors((state) => selectComponentState(state).valveConnectorGrids);\r\n","import * as React from 'react';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport clsx from 'clsx';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n checkbox: {\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n },\r\n })\r\n);\r\nconst CheckBoxSelect = (props: {\r\n onChange: (value: number | boolean, field: string, error: string) => any;\r\n name: string;\r\n label: string;\r\n value: boolean;\r\n helperText?: string;\r\n}) => {\r\n const { onChange } = props;\r\n const classes = useStyles();\r\n return (\r\n ) => onChange(event.target.checked, props.name, ''),\r\n [onChange, props.name]\r\n )}\r\n name={props.name}\r\n />\r\n }\r\n label={props.label}\r\n />\r\n /*\r\n \r\n */\r\n );\r\n};\r\n\r\nexport default CheckBoxSelect;\r\n","import { Typography } from '@material-ui/core';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport { getValveConnectorGridImage } from 'application/components/api/ValveConnectorGrid';\r\nimport {\r\n selectAllValveConnectorGrids,\r\n selectValveConnectorGridById,\r\n} from 'application/components/redux/selectors/valveConnectorGridSelector';\r\nimport { IValveConnection, SECTIONS_AS_PLENUMCONNECTION_0 } from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport { selectActiveProject } from 'application/project/redux/selectors/projectSelector';\r\nimport { makeSelectSectionsByConnection } from 'application/project/redux/selectors/sectionSelectors';\r\nimport { PlenumDataSupply, enValveConnectorConnection } from 'application/shared/PlenumDataSupply';\r\nimport clsx from 'clsx';\r\nimport NumberInputField from 'components/controls/NumberInputField';\r\nimport Selector from 'components/controls/Selector';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport nameof from 'ts-nameof.macro';\r\nimport CheckBoxSelect from './controls/CheckBoxSelect';\r\nimport connectionStyles from './controls/connectionStyles';\r\n\r\nconst valveConnectorIDToRightAngled = (valveConnectorID: number | undefined) =>\r\n valveConnectorID === undefined || valveConnectorID === enValveConnectorConnection.rightAngled;\r\nconst rightAngledToValveConnectorID = (rightAngled: boolean | undefined) =>\r\n rightAngled === false ? enValveConnectorConnection.straight : enValveConnectorConnection.rightAngled;\r\n\r\nconst PartValve = (props: {\r\n plenumdata: IPlenumData;\r\n connection: IValveConnection;\r\n onChange: (value: number | boolean | undefined, field: string, error: string) => any;\r\n}) => {\r\n const classes = connectionStyles();\r\n const { onChange, plenumdata, connection } = props;\r\n const { valveConnectorGridID } = connection;\r\n\r\n const project = useSelector(selectActiveProject);\r\n const allValveConnectorGrids = useSelector(selectAllValveConnectorGrids);\r\n const valveConnectorGrid = useSelector((state) => selectValveConnectorGridById(state, valveConnectorGridID || 0));\r\n const [rightAngled, setRightAngled] = React.useState(\r\n valveConnectorIDToRightAngled(valveConnectorGrid?.valveConnectionID)\r\n );\r\n const [valveGridID, setValveGridID] = React.useState(valveConnectorGrid?.valveGridID);\r\n const selectSectionsByConnection = React.useMemo(makeSelectSectionsByConnection, []);\r\n const sections = useSelector((state) =>\r\n selectSectionsByConnection(state, props.connection.valveConnectionKey, SECTIONS_AS_PLENUMCONNECTION_0)\r\n );\r\n const ductID = sections[sections.length - 1]?.ductID ?? 0;\r\n\r\n const valveConnectorGrids = React.useMemo(() => {\r\n const res = allValveConnectorGrids.filter(\r\n (a) =>\r\n a.ductID === ductID &&\r\n (a.plenumConnector || a.valveDiameterID === project?.valveDiameterID) &&\r\n (a.plenumConnector || a.valveConnectionID === rightAngledToValveConnectorID(rightAngled)) &&\r\n ((plenumdata.supply === PlenumDataSupply.supply && a.canSupply) ||\r\n (plenumdata.supply === PlenumDataSupply.extraction && a.canExtraction))\r\n );\r\n res.sort((a, b) => {\r\n let valCompResult = (a.isCustom ? 1 : 0) - (b.isCustom ? 1 : 0);\r\n if (valCompResult === 0) valCompResult = (a.plenumConnector ? 1 : 0) - (b.plenumConnector ? 1 : 0);\r\n if (valCompResult === 0) valCompResult = a.name.localeCompare(b.name);\r\n if (valCompResult === 0) valCompResult = (a.canDuplex ? 1 : 0) - (b.canDuplex ? 1 : 0);\r\n return valCompResult;\r\n });\r\n return res;\r\n }, [project, rightAngled, plenumdata.supply, ductID, allValveConnectorGrids]);\r\n\r\n const findRelevantValveConnectorGrid = React.useCallback(\r\n (rightAngled: boolean, valveGridID: number | undefined, ductID: number | undefined) =>\r\n allValveConnectorGrids.find(\r\n (a) =>\r\n a.valveDiameterID === (project === undefined ? 0 : project.valveDiameterID) &&\r\n a.valveConnectionID === rightAngledToValveConnectorID(rightAngled) &&\r\n a.valveGridID === valveGridID &&\r\n a.ductID === ductID &&\r\n ((plenumdata.supply === PlenumDataSupply.supply && a.canSupply === true) ||\r\n (plenumdata.supply === PlenumDataSupply.extraction && a.canExtraction === true))\r\n ),\r\n [allValveConnectorGrids, plenumdata.supply, project]\r\n );\r\n\r\n const rightAngledChanged = (rightAngledValue: boolean) => {\r\n setRightAngled(rightAngledValue);\r\n //recht - haaks is gewisseld, we willen het valveConnectorGrid selecteren dat hetzelfde we hadden\r\n const newValveConnectorGrid = findRelevantValveConnectorGrid(rightAngledValue, valveGridID, ductID);\r\n if (newValveConnectorGrid?.valveConnectorGridID !== valveConnectorGridID) {\r\n onChange(newValveConnectorGrid?.valveConnectorGridID, nameof(valveConnectorGridID), '');\r\n }\r\n };\r\n\r\n //find item voor rightAngled, valveGridID, ductID\r\n //deze is nodig om wissel tussen duct goed te laten verlopen en geen vervelende waarschuwingen te tonen\r\n const newValue = React.useMemo(() => {\r\n const newValue = findRelevantValveConnectorGrid(rightAngled, valveGridID, ductID)?.valveConnectorGridID;\r\n const valueValid = valveConnectorGrids.find((a) => a.valveConnectorGridID === valveConnectorGridID) !== undefined;\r\n return valueValid ? valveConnectorGridID : newValue;\r\n }, [findRelevantValveConnectorGrid, rightAngled, valveGridID, ductID, valveConnectorGrids, valveConnectorGridID]);\r\n\r\n const valveConnectorGridChanged = React.useCallback(\r\n (value: number | boolean | undefined, field: string, error: string) => {\r\n const newValveConnectorGrid = allValveConnectorGrids.find((a) => a.valveConnectorGridID === value);\r\n\r\n setValveGridID(newValveConnectorGrid?.valveGridID);\r\n if (newValveConnectorGrid?.valveConnectionID) {\r\n setRightAngled(valveConnectorIDToRightAngled(newValveConnectorGrid?.valveConnectionID));\r\n }\r\n onChange(value, field, error);\r\n },\r\n [onChange, allValveConnectorGrids, setValveGridID, setRightAngled]\r\n );\r\n\r\n const { t } = useTranslation(['roomeditor']);\r\n const { valveImage } = classes;\r\n\r\n const selectorItems = React.useMemo(\r\n () =>\r\n valveConnectorGrids.map((valve) => (\r\n \r\n
\r\n {valve.imageID ? (\r\n \r\n ) : null}\r\n
\r\n
{valve.name}
\r\n
\r\n )),\r\n [valveConnectorGrids, valveImage]\r\n );\r\n\r\n const ductIDref = React.useRef(ductID);\r\n React.useEffect(() => {\r\n if (ductIDref.current !== ductID) {\r\n //hebben we een ander kanaal, dan een andere valveConnectorGrid zoeken voor hetzelfde rightAngled, valveGridID\r\n ductIDref.current = ductID;\r\n if (newValue !== valveConnectorGridID) {\r\n onChange(newValue, nameof(valveConnectorGridID), '');\r\n }\r\n }\r\n }, [onChange, newValue, ductID, valveConnectorGridID]);\r\n\r\n return (\r\n
\r\n {valveConnectorGrid?.onlyWall && plenumdata.supply === PlenumDataSupply.supply ? (\r\n {t('warnOnlyWall', 'note: only through the wall')}\r\n ) : null}\r\n
\r\n \r\n
\r\n
\r\n {plenumdata.supply === PlenumDataSupply.supply ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n
\r\n rightAngledChanged(valve === true)}\r\n label={t('valveElbow', 'elbow')}\r\n />\r\n
\r\n {valveConnectorGrid?.canDuplex ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n\r\n {valveConnectorGrid?.isCustom ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default PartValve;\r\n","import React from 'react';\r\n\r\ntype windowSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\n\r\nconst width2text = (width: number): windowSize => {\r\n if (width < 576) return 'xs';\r\n if (width < 768) return 'sm';\r\n if (width < 992) return 'md';\r\n if (width < 1200) return 'lg';\r\n if (width < 1400) return 'xl';\r\n return 'xxl';\r\n};\r\n\r\nexport const useWindowSize = () => {\r\n const isSSR = typeof window !== 'undefined';\r\n const [windowSize, setWindowSize] = React.useState(isSSR ? 'xl' : width2text(window.innerWidth));\r\n const windowSizeRef = React.useRef(windowSize);\r\n\r\n const changeWindowSize = React.useCallback(() => {\r\n const newVal = width2text(window.innerWidth);\r\n if (windowSizeRef.current !== newVal) {\r\n windowSizeRef.current = newVal;\r\n setWindowSize(newVal);\r\n }\r\n }, [setWindowSize]);\r\n\r\n React.useEffect(() => {\r\n window.addEventListener('resize', changeWindowSize);\r\n return () => {\r\n window.removeEventListener('resize', changeWindowSize);\r\n };\r\n }, [changeWindowSize]);\r\n\r\n return windowSize;\r\n};\r\n","import * as React from 'react';\r\nimport { useWindowSize } from 'application/shared/useWindowSize';\r\nimport connectionStyles from './parts/controls/connectionStyles';\r\n\r\nconst RenderParts = (props: {\r\n partPlenumConnections: JSX.Element;\r\n partDescription: JSX.Element;\r\n partDebiet: JSX.Element;\r\n partSections: JSX.Element[][];\r\n partValve: JSX.Element;\r\n}) => {\r\n const classes = connectionStyles();\r\n const windowSize = useWindowSize();\r\n\r\n const { partPlenumConnections, partDescription, partDebiet, partSections, partValve } = props;\r\n\r\n switch (windowSize) {\r\n case 'xs':\r\n case 'sm':\r\n return (\r\n \r\n {partPlenumConnections}\r\n {partDescription}\r\n {partDebiet}\r\n {partSections.map((row) => (\r\n {row.map((cell) => cell)}\r\n ))}\r\n {partValve}\r\n \r\n );\r\n case 'md':\r\n case 'lg':\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {partSections.map((row, index) => (\r\n \r\n {row.map((cell, index2) => (\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n
{partPlenumConnections}\r\n {partValve}\r\n
{partDescription}
{partDebiet}
\r\n {cell}\r\n
\r\n );\r\n case 'xl':\r\n case 'xxl':\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {partSections.map((row, index) => (\r\n \r\n {row.map((cell, index2) => (\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n
{partPlenumConnections}\r\n {partValve}\r\n
{partDescription}{partDebiet}
\r\n {cell}\r\n
\r\n );\r\n }\r\n};\r\n\r\nexport default RenderParts;\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { selectProjectState } from 'redux/store';\r\nimport { plenumConnectionAdapter } from '../adapters/plenumConnectionAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllPlenumConnections,\r\n selectById: selectPlenumConnectionByKey,\r\n selectEntities: selectPlenumConnectionEntities,\r\n} = plenumConnectionAdapter.getSelectors((state) => selectProjectState(state).plenumConnections);\r\n\r\nexport const makeSelectPlenumConnectionsByConnection = () => {\r\n return createSelector(\r\n (state: any, valveConnectionKey: string) => valveConnectionKey,\r\n selectAllPlenumConnections,\r\n // Then, an \"output selector\" that receives all the input results as arguments\r\n // and returns a final result value\r\n (valveConnectionKey, connections) =>\r\n connections.filter((connection) => connection.valveConnectionKey === valveConnectionKey)\r\n );\r\n};\r\n\r\nexport const makeSelectPlenumConnectionsByDirection = () => {\r\n return createSelector(\r\n (state: any, supply: PlenumDataSupply) => supply,\r\n (state: any) => selectProjectState(state).valveConnections,\r\n selectAllPlenumConnections,\r\n // Then, an \"output selector\" that receives all the input results as arguments\r\n // and returns a final result value\r\n (supply, valveConnections, plenumConnections) =>\r\n plenumConnections.filter(\r\n (plenumConnection) => valveConnections.entities[plenumConnection.valveConnectionKey]?.supply === supply\r\n )\r\n );\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { selectProjectState } from 'redux/store';\r\nimport { valveConnectionAdapter } from '../adapters/valveConnectionAdapter';\r\n\r\nexport const {\r\n selectAll: selectAllValveConnections,\r\n selectById: selectValveConnectionByKey,\r\n selectIds: selectValveConnectionIds,\r\n selectEntities: selectValveConnectionEntities,\r\n} = valveConnectionAdapter.getSelectors((state) => selectProjectState(state).valveConnections);\r\n\r\nexport const makeSelectConnectionsByDirection = () => {\r\n return createSelector(\r\n (state: any, supply: PlenumDataSupply) => supply,\r\n // First, pass one or more \"input selector\" functions:\r\n selectAllValveConnections,\r\n // Then, an \"output selector\" that receives all the input results as arguments\r\n // and returns a final result value\r\n (supply, connections) => connections.filter((connection) => connection.supply === supply)\r\n );\r\n};\r\n","import MenuItem from '@material-ui/core/MenuItem';\r\nimport { ductAdapter } from 'application/components/redux/adapters/ductAdapter';\r\nimport { selectAllDucts } from 'application/components/redux/selectors/ductSelector';\r\nimport { selectPlenumById } from 'application/components/redux/selectors/plenumSelector';\r\nimport {\r\n IValveConnection,\r\n IPlenumConnection,\r\n SECTIONS_AS_PLENUMCONNECTION_0,\r\n} from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport { sectionKeyIntern } from 'application/project/redux/adapters/sectionAdapter';\r\nimport { selectValveConnectionEntities } from 'application/project/redux/selectors/connectionSelectors';\r\nimport { makeSelectPlenumConnectionsByDirection } from 'application/project/redux/selectors/plenumConnectionSelectors';\r\nimport { selectSectionByKey } from 'application/project/redux/selectors/sectionSelectors';\r\nimport clsx from 'clsx';\r\nimport { CheckBoxer } from 'components/controls/CheckBoxer';\r\nimport Selector from 'components/controls/Selector';\r\nimport TextInputField from 'components/controls/TextInputField';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectComponentState } from 'redux/store';\r\nimport nameof from 'ts-nameof.macro';\r\nimport connectionStyles from './connectionStyles';\r\n\r\nconst NumberSelectRestrictor = (props: {\r\n plenumdata: IPlenumData;\r\n valveConnection: IValveConnection;\r\n plenumConnection: IPlenumConnection;\r\n onChange: (value: number | boolean | undefined, field: string, error: string, plenumConnectionIndex: number) => any;\r\n}) => {\r\n const classes = connectionStyles();\r\n const { onChange } = props;\r\n const { t } = useTranslation(['roomeditor']);\r\n\r\n const reduxDucts = useSelector((state) => selectComponentState(state).ducts);\r\n /*\r\n wat hebben we nodig?\r\n - aantal aansluitingen (plenum)\r\n - welke aansluitingen zijn bezet\r\n - welke aansluiting is van ons\r\n */\r\n const firstSection = useSelector((state) =>\r\n selectSectionByKey(\r\n state,\r\n sectionKeyIntern(props.plenumConnection.valveConnectionKey, SECTIONS_AS_PLENUMCONNECTION_0, 0)\r\n )\r\n );\r\n\r\n const plenum = useSelector((state) =>\r\n selectPlenumById(state, props.plenumdata.plenumID ? props.plenumdata.plenumID : 0)\r\n );\r\n\r\n const selectPlenumConnectionsByDirection = React.useMemo(makeSelectPlenumConnectionsByDirection, []);\r\n const plenumConnections = useSelector((state) => selectPlenumConnectionsByDirection(state, props.plenumdata.supply));\r\n\r\n const valveConnectionEntities = useSelector(selectValveConnectionEntities);\r\n\r\n const canRightAngled = React.useMemo(\r\n () => ductAdapter.getSelectors().selectById(reduxDucts, firstSection?.ductID || 0)?.canRightAngled || false,\r\n [firstSection, reduxDucts]\r\n );\r\n\r\n const onThisChanged = React.useCallback(\r\n (value: number | boolean | undefined, field: string, error: string) => {\r\n onChange(value, field, error, props.plenumConnection.indexNumber);\r\n },\r\n [onChange, props.plenumConnection.indexNumber]\r\n );\r\n\r\n const options = React.useMemo(() => {\r\n const optionsResult: {\r\n index: number;\r\n description: string;\r\n disabled: boolean;\r\n }[] = [];\r\n if (plenum) {\r\n for (let i = 1; i <= plenum?.numberConnections; i++) {\r\n const connection = plenumConnections.find((a) => a.connectionIndex === i);\r\n\r\n let used = connection !== undefined;\r\n\r\n if (\r\n used &&\r\n connection?.valveConnectionKey === props.valveConnection.valveConnectionKey &&\r\n props.plenumConnection.connectionIndex === i\r\n ) {\r\n //is deze door onszelf in gebruikt\r\n used = false;\r\n }\r\n\r\n optionsResult.push({\r\n index: i,\r\n description:\r\n i.toString() +\r\n ' ' +\r\n (connection !== undefined ? valveConnectionEntities[connection?.valveConnectionKey]?.description : ''),\r\n disabled: used,\r\n });\r\n }\r\n }\r\n return optionsResult;\r\n }, [\r\n plenumConnections,\r\n valveConnectionEntities,\r\n plenum,\r\n props.valveConnection.valveConnectionKey,\r\n props.plenumConnection?.connectionIndex,\r\n ]);\r\n\r\n return (\r\n
\r\n
\r\n ((o) => o.connectionIndex)}\r\n value={props.plenumConnection.connectionIndex}\r\n onChange={onThisChanged}\r\n items={options.map((option) => (\r\n \r\n {option.description}\r\n \r\n ))}\r\n />\r\n
\r\n
\r\n
\r\n {canRightAngled ? (\r\n ((o) => o.connectorRightAngled)}\r\n label={t('plenumElbow', 'elbow')}\r\n onChange={onThisChanged}\r\n className={classes.elbow}\r\n />\r\n ) : null}\r\n\r\n {}, [])}\r\n />\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default NumberSelectRestrictor;\r\n","import { IPlenumConnection, IValveConnection } from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport * as React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport NumberSelectRestrictor from './controls/NumberSelectRestrictor';\r\nimport { SetPlenumConnectionValue } from 'application/project/redux/thunks/SetPlenumConnectionValue';\r\nimport { plenumConnectionKey } from 'application/project/redux/adapters/plenumConnectionAdapter';\r\n\r\nconst PartPlenumConnection = (props: {\r\n plenumdata: IPlenumData;\r\n valveConnection: IValveConnection;\r\n plenumConnection: IPlenumConnection;\r\n}) => {\r\n const { plenumConnection } = props;\r\n const dispatch = useDispatch();\r\n\r\n const onChange = React.useCallback(\r\n (value: number | string | boolean | undefined, field: string, error: string) =>\r\n dispatch(\r\n SetPlenumConnectionValue(plenumConnection.valveConnectionKey, plenumConnectionKey(plenumConnection), {\r\n [field]: value,\r\n })\r\n ),\r\n [dispatch, plenumConnection]\r\n );\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default PartPlenumConnection;\r\n","import { IPlenumConnection } from 'application/project/api/Connection';\r\nimport { projectSlice } from '../projectSlice';\r\nimport { updateConnectionThunk } from './AsyncConnectionUpdate';\r\n\r\nexport const SetPlenumConnectionValue = (\r\n valveConnectionKey: string,\r\n id: string,\r\n plenumConnection: Partial\r\n) => {\r\n return async (dispatch: any, getState: any) => {\r\n await dispatch(projectSlice.actions.updatePlenumConnection({ id: id, plenumConnection: plenumConnection }));\r\n await dispatch(updateConnectionThunk(valveConnectionKey));\r\n };\r\n};\r\n","import { IValveConnection } from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport * as React from 'react';\r\nimport NumberSelectRestrictor from './controls/NumberSelectRestrictor';\r\nimport connectionStyles from './controls/connectionStyles';\r\nimport clsx from 'clsx';\r\nimport { useSelector } from 'react-redux';\r\nimport { makeSelectPlenumConnectionsByConnection } from 'application/project/redux/selectors/plenumConnectionSelectors';\r\nimport PartPlenumConnection from './PartPlenumConnection';\r\n\r\nconst PartPlenumConnections = (props: { plenumdata: IPlenumData; valveConnection: IValveConnection }) => {\r\n const classes = connectionStyles();\r\n const selectPlenumConnectionsByConnection = React.useMemo(makeSelectPlenumConnectionsByConnection, []);\r\n const plenumConnections = useSelector((state) =>\r\n selectPlenumConnectionsByConnection(state, props.valveConnection.valveConnectionKey)\r\n );\r\n\r\n return (\r\n
\r\n {plenumConnections.map((plenumConnection) => (\r\n \r\n ))}\r\n
\r\n );\r\n};\r\n\r\nexport default PartPlenumConnections;\r\n","import * as React from 'react';\r\nimport { IValveConnection, SECTIONS_AS_PLENUMCONNECTION_0 } from 'application/project/api/Connection';\r\nimport { PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { useSelector } from 'react-redux';\r\nimport { makeSelectSectionsByConnection } from 'application/project/redux/selectors/sectionSelectors';\r\nimport { selectValveConnectionByKey } from 'application/project/redux/selectors/connectionSelectors';\r\nimport getDebietBorders from 'application/project/validate/bordersDebiet';\r\nimport { selectValveConnectorGridById } from 'application/components/redux/selectors/valveConnectorGridSelector';\r\nimport { selectAllDucts } from 'application/components/redux/selectors/ductSelector';\r\n\r\nconst useConnectionFlowLimits = (valveConnectionKey: string) => {\r\n const valveConnection =\r\n useSelector((state) => selectValveConnectionByKey(state, valveConnectionKey)) ||\r\n ({ supply: PlenumDataSupply.supply, dual: false } as IValveConnection);\r\n\r\n const { supply, dual } = valveConnection;\r\n const selectSectionsByConnection = React.useMemo(makeSelectSectionsByConnection, []);\r\n const sections = useSelector((state) =>\r\n selectSectionsByConnection(state, valveConnectionKey, SECTIONS_AS_PLENUMCONNECTION_0)\r\n );\r\n const allDucts = useSelector(selectAllDucts);\r\n const ducts = React.useMemo(\r\n () => allDucts.filter((duct) => sections.find((a) => a.ductID === duct.ductID)),\r\n [sections, allDucts]\r\n );\r\n const valveConnectorGrid = useSelector((state) =>\r\n selectValveConnectorGridById(state, valveConnection?.valveConnectorGridID || 0)\r\n );\r\n const { ductMin, ductWarn, ductMax } = React.useMemo(\r\n () => getDebietBorders(dual, supply, ducts, valveConnectorGrid),\r\n [supply, dual, ducts, valveConnectorGrid]\r\n );\r\n\r\n return { ductMin, ductWarn, ductMax };\r\n};\r\n\r\nexport default useConnectionFlowLimits;\r\n","import * as React from 'react';\r\nimport { IconButton, Paper } from '@material-ui/core';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { ConnectionDirty, IValveConnection, SECTIONS_AS_PLENUMCONNECTION_0 } from 'application/project/api/Connection';\r\nimport connectionStyles from './parts/controls/connectionStyles';\r\nimport PartDescription from './parts/PartDescription';\r\nimport PartDebiet from './parts/PartDebiet';\r\nimport PartDuctAndLength from './parts/PartDuctAndLength';\r\nimport PartDuctElbows from './parts/PartDuctElbows';\r\nimport PartAdapter from './parts/PartAdapter';\r\nimport PartValve from './parts/PartValve';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport { useGlobalStyles } from 'application/shared/styles';\r\nimport clsx from 'clsx';\r\nimport HighlightOff from '@material-ui/icons/HighlightOff';\r\nimport { selectPlenumById } from 'application/components/redux/selectors/plenumSelector';\r\nimport RenderParts from './RenderParts';\r\nimport { makeSelectSectionsByConnection } from 'application/project/redux/selectors/sectionSelectors';\r\nimport PartPlenumConnections from './parts/PartPlenumConnections';\r\nimport nameof from 'ts-nameof.macro';\r\nimport { ValveConnectionSetValue } from 'application/project/redux/thunks/ValveConnectionSetValue';\r\nimport { ValveConnectionDelete } from 'application/project/redux/thunks/ValveConnectionDelete';\r\nimport useConnectionFlowLimits from './useConnectionFlowLimits';\r\nimport { projectState } from 'application/project/redux/projectState';\r\nimport { selectProjectState } from 'redux/store';\r\n\r\nexport const ConnectionEdit = (props: {\r\n connection: IValveConnection;\r\n plenumdata: IPlenumData;\r\n setActive: (key: string) => any;\r\n setValid: (key: string, valid: boolean) => any;\r\n isActive: boolean;\r\n isValid: boolean;\r\n getConnectionError: (connection: IValveConnection, projectState: projectState) => string;\r\n}) => {\r\n const classes = connectionStyles();\r\n const globalClasses = useGlobalStyles();\r\n const dispatch = useDispatch();\r\n const { connection } = props;\r\n const { valveConnectionKey } = connection;\r\n const plenum = useSelector((state) => selectPlenumById(state, props.plenumdata?.plenumID || 0));\r\n const { ductMin, ductWarn, ductMax } = useConnectionFlowLimits(props.connection.valveConnectionKey);\r\n const selectSectionsByConnection = React.useMemo(makeSelectSectionsByConnection, []);\r\n const projectState = useSelector(selectProjectState);\r\n const sections = useSelector((state) =>\r\n selectSectionsByConnection(state, valveConnectionKey, SECTIONS_AS_PLENUMCONNECTION_0)\r\n );\r\n const { setActive, getConnectionError } = props;\r\n\r\n const onValveConnectionChange = React.useCallback(\r\n (value: number | string | boolean | undefined, field: string, error: string) =>\r\n dispatch(ValveConnectionSetValue(valveConnectionKey, field, value)),\r\n [dispatch, valveConnectionKey]\r\n );\r\n\r\n const onDelete = React.useCallback(\r\n (event: any) => {\r\n dispatch(ValveConnectionDelete(valveConnectionKey));\r\n },\r\n [dispatch, valveConnectionKey]\r\n );\r\n\r\n const partPlenumConnections = ;\r\n const partDescription = ;\r\n const partDebiet = (\r\n \r\n );\r\n\r\n const partSections = sections.map((section) => [\r\n ,\r\n ,\r\n ,\r\n ]);\r\n\r\n const partValve = (\r\n \r\n );\r\n\r\n return (\r\n
\r\n setActive(valveConnectionKey), [valveConnectionKey, setActive])}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default ConnectionEdit;\r\n","import { projectSlice } from '../projectSlice';\r\nimport { updateConnectionThunk } from './AsyncConnectionUpdate';\r\n\r\nexport const ValveConnectionSetValue = (\r\n valveConnectionKey: string,\r\n name: string,\r\n value: string | number | boolean | undefined\r\n) => {\r\n return async (dispatch: any, getState: any) => {\r\n await dispatch(projectSlice.actions.updateValveConnection({ id: valveConnectionKey, name: name, value: value }));\r\n await dispatch(updateConnectionThunk(valveConnectionKey));\r\n };\r\n};\r\n","import { IApiValveConnection } from 'application/project/api/Connection';\r\nimport { selectProjectState } from 'redux/store';\r\nimport { valveConnectionAdapter } from '../adapters/valveConnectionAdapter';\r\nimport { projectSlice } from '../projectSlice';\r\nimport { updateAsyncConnection } from './AsyncConnectionUpdate';\r\n\r\nexport const ValveConnectionDelete = (valveConnectionKey: string) => {\r\n return async (dispatch: any, getState: any) => {\r\n const projectState = selectProjectState(getState());\r\n const connection = valveConnectionAdapter\r\n .getSelectors()\r\n .selectById(projectState.valveConnections, valveConnectionKey);\r\n if (!projectState.activeProject) return;\r\n if (!connection) return;\r\n\r\n const apiConnection: IApiValveConnection = {\r\n ...connection,\r\n remove: true,\r\n plenumConnections: [],\r\n };\r\n\r\n await dispatch(projectSlice.actions.deleteValveConnection({ id: valveConnectionKey }));\r\n await dispatch(\r\n updateAsyncConnection({\r\n guid: projectState.activeProject?.guid,\r\n apiConnection: apiConnection,\r\n })\r\n );\r\n };\r\n};\r\n","import { IValveConnection } from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport { componentState } from 'application/components/redux/componentState';\r\nimport { projectState } from 'application/project/redux/projectState';\r\nimport GetApiConnection from '../redux/thunks/helper/GetApiConnection';\r\nimport getApiValveConnectionError from './getApiValveConnectionError';\r\n\r\nconst getValveConnectionError = (\r\n valveConnection: IValveConnection,\r\n plenumData: IPlenumData,\r\n projectState: projectState,\r\n componentState: componentState\r\n) => {\r\n return getApiValveConnectionError(\r\n GetApiConnection(valveConnection, projectState, componentState),\r\n plenumData,\r\n projectState.activeProject?.experimental || false,\r\n projectState,\r\n componentState\r\n );\r\n};\r\n\r\nexport default getValveConnectionError;\r\n","import * as React from 'react';\r\nimport { IValveConnection } from 'application/project/api/Connection';\r\nimport { IPlenumData } from 'application/project/api/PlenumData';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectComponentState } from 'redux/store';\r\nimport { projectState } from 'application/project/redux/projectState';\r\nimport getValveConnectionError from 'application/project/validate/getValveConnectionError';\r\n\r\nconst useIsConnectionValid = (plenumData: IPlenumData) => {\r\n const componentState = useSelector(selectComponentState);\r\n\r\n const getConnectionError = React.useCallback(\r\n (connection: IValveConnection, projectState: projectState) => {\r\n return getValveConnectionError(connection, plenumData, projectState, componentState);\r\n },\r\n [plenumData, componentState]\r\n );\r\n\r\n return getConnectionError;\r\n};\r\n\r\nexport default useIsConnectionValid;\r\n","import * as React from 'react';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport ConnectionEdit from './ConnectionEditor/ConnectionEdit';\r\nimport AddCircleIcon from '@material-ui/icons/AddCircle';\r\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\r\nimport Button from '@material-ui/core/Button';\r\nimport { PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { makeSelectConnectionsByDirection } from 'application/project/redux/selectors/connectionSelectors';\r\nimport { selectPlenumdataByPlenumDataSupply } from 'application/project/redux/selectors/plenumdataSelectors';\r\nimport { projectSlice } from 'application/project/redux/projectSlice';\r\nimport { FormatDecimal } from 'application/shared/format';\r\nimport PageTitle from 'components/controls/PageTitle';\r\nimport { useGlobalStyles } from 'application/shared/styles';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\nimport clsx from 'clsx';\r\nimport { Redirect } from 'react-router-dom';\r\nimport { pages_project_extractionplenum, pages_project_supplyplenum } from '../EditorGrid/useRoutes';\r\nimport { useFlowRate } from 'components/controls/useFlowRate';\r\nimport { selectPlenumById } from 'application/components/redux/selectors/plenumSelector';\r\nimport { ValveConnectionAdd } from 'application/project/redux/thunks/ValveConnectionAdd';\r\nimport useIsConnectionValid from './ConnectionEditor/useConnectionValid';\r\nimport { selectProjectState } from 'redux/store';\r\n\r\nconst useRoomEditStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n buttonGrid: {\r\n marginTop: theme.spacing(2),\r\n },\r\n button: {\r\n marginRight: theme.spacing(2),\r\n },\r\n })\r\n);\r\n\r\nexport const RoomEditor = (props: { supply: PlenumDataSupply; onNext: () => any }) => {\r\n const dispatch = useDispatch();\r\n const selectConnectionsByDirection = React.useMemo(makeSelectConnectionsByDirection, []);\r\n const connections = useSelector((state) => selectConnectionsByDirection(state, props.supply));\r\n const projectState = useSelector(selectProjectState);\r\n const [connectionValid, setConnectionValid] = React.useState({});\r\n const plenumdata = useSelector((state) => selectPlenumdataByPlenumDataSupply(state, props.supply));\r\n const plenum = useSelector((state) => selectPlenumById(state, plenumdata?.plenumID ?? 0));\r\n\r\n const classes = useGlobalStyles();\r\n const editstyle = useRoomEditStyles();\r\n const { FormatAirFlowRateUnit } = useFlowRate();\r\n const activeValid = plenumdata?.activeConnectionKey\r\n ? (connectionValid as any)[plenumdata.activeConnectionKey]\r\n : undefined;\r\n\r\n const getConnectionError = useIsConnectionValid(plenumdata || { supply: props.supply });\r\n\r\n const canAddNew = React.useMemo(() => {\r\n if (connections.length === 0) return true;\r\n const hasConnectionError = connections.reduce((hasError, connection) => {\r\n const error = getConnectionError(connection, projectState);\r\n return activeValid !== false && (hasError ? hasError : !!error);\r\n }, false);\r\n return !hasConnectionError;\r\n }, [activeValid, projectState, connections, getConnectionError]);\r\n\r\n const canSetActiveNone = React.useMemo(() => {\r\n if (!plenumdata?.activeConnectionKey) return false;\r\n const activeConnection = connections.find((a) => a.valveConnectionKey === plenumdata?.activeConnectionKey);\r\n return activeValid !== false && activeConnection && !!getConnectionError(activeConnection, projectState) === false;\r\n }, [activeValid, projectState, connections, plenumdata, getConnectionError]);\r\n\r\n const { t } = useTranslation(['roomeditor']);\r\n\r\n const title = React.useMemo(\r\n () =>\r\n t(\r\n 'title_roomedit_' + (props.supply === PlenumDataSupply.supply ? 'supply' : 'extraction'),\r\n 'Edit rooms ' + (props.supply === PlenumDataSupply.supply ? 'supply' : 'extraction')\r\n ),\r\n [props.supply, t]\r\n );\r\n\r\n const setActive = (key: string) => {\r\n const active = connections.find((a) => a.valveConnectionKey === plenumdata?.activeConnectionKey);\r\n if (activeValid !== false && (active === undefined || !!getConnectionError(active, projectState) === false)) {\r\n if (connections)\r\n dispatch(projectSlice.actions.setActiveConnection({ supply: props.supply, valveConnectionKey: key }));\r\n }\r\n };\r\n\r\n const setValid = (key: string, valid: boolean) => {\r\n setConnectionValid((prev: any) => ({ ...prev, [key]: valid }));\r\n };\r\n\r\n const clearActiveConnection = React.useCallback(\r\n () => dispatch(projectSlice.actions.setActiveConnection({ supply: props.supply, valveConnectionKey: undefined })),\r\n [dispatch, props.supply]\r\n );\r\n const connectionAdded = React.useCallback(() => dispatch(ValveConnectionAdd(props.supply)), [dispatch, props.supply]);\r\n\r\n if (plenumdata && !plenumdata?.plenumID) {\r\n const location = props.supply ? pages_project_supplyplenum : pages_project_extractionplenum;\r\n return ;\r\n } else\r\n return (\r\n
\r\n \r\n
\r\n {plenumdata\r\n ? connections.map((connection) => (\r\n \r\n ))\r\n : null}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n {t('working pressure', 'working pressure {{workPresure}} Pa', {\r\n workPresure: FormatDecimal(plenumdata?.workPresure, 1),\r\n })}\r\n
\r\n {t('totalairflowrate', 'Total airflowrate {{airFlowRate}}, max {{maxFlowrate}}', {\r\n airFlowRate: FormatAirFlowRateUnit(plenumdata?.airflowRate),\r\n maxFlowrate: FormatAirFlowRateUnit(plenum?.maxFlowRate),\r\n })}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default RoomEditor;\r\n","import { valveConnectorGridAdapter } from 'application/components/redux/adapters/valveConnectorGridAdapter';\r\nimport { enValveConnectorConnection, PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport { selectComponentState, selectProjectState } from 'redux/store';\r\nimport { valveConnectionAdapter } from '../adapters/valveConnectionAdapter';\r\nimport { projectSlice } from '../projectSlice';\r\n\r\nexport const ValveConnectionAdd = (supply: PlenumDataSupply) => {\r\n return async (dispatch: any, getState: any) => {\r\n const componentState = selectComponentState(getState());\r\n const projectState = selectProjectState(getState());\r\n //get last add connection\r\n const connections = valveConnectionAdapter\r\n .getSelectors()\r\n .selectAll(projectState.valveConnections)\r\n .filter((a) => a.supply === supply)\r\n .sort((a, b) => (b.valveConnectionID || 0) - (a.valveConnectionID || 0));\r\n const lastConnection = connections[0];\r\n const lastValveConnectorGrid = valveConnectorGridAdapter\r\n .getSelectors()\r\n .selectById(componentState.valveConnectorGrids, lastConnection?.valveConnectorGridID || 0);\r\n const newValveConnectorGrid = valveConnectorGridAdapter\r\n .getSelectors()\r\n .selectAll(componentState.valveConnectorGrids)\r\n .find(\r\n (a) =>\r\n a.ductID === projectState.activeProject?.ductTypeID &&\r\n a.valveGridID === lastValveConnectorGrid?.valveGridID &&\r\n a.valveConnectionID === enValveConnectorConnection.rightAngled &&\r\n a.valveDiameterID === projectState.activeProject?.valveDiameterID\r\n );\r\n await dispatch(\r\n projectSlice.actions.addValveConnection({\r\n supply: supply,\r\n valveConnectorGridID: newValveConnectorGrid?.valveConnectorGridID,\r\n ductID: projectState.activeProject?.ductTypeID,\r\n })\r\n );\r\n };\r\n};\r\n\r\n/*\r\nexport const addConnectionThunk = (supply: PlenumDataSupply) => {\r\n return async (dispatch: any, getState: any) => {\r\n const componentState = selectComponentState(getState());\r\n const projectState = selectProjectState(getState());\r\n if (projectState.activeProject) {\r\n //get last add connection\r\n const connections = connectionAdapter\r\n .getSelectors()\r\n .selectAll(projectState.valveConnections)\r\n .filter((a) => a.supply === supply)\r\n .sort((a, b) => (b.valveConnectionID || 0) - (a.valveConnectionID || 0));\r\n const lastConnection = connections.length > 0 ? connections[0] : undefined;\r\n const lastValveConnectorGrid = valveConnectorGridAdapter\r\n .getSelectors()\r\n .selectById(componentState.valveConnectorGrids, lastConnection?.valveConnectorGridID || 0);\r\n\r\n const newValveConnectorGrid = valveConnectorGridAdapter\r\n .getSelectors()\r\n .selectAll(componentState.valveConnectorGrids)\r\n .find(\r\n (a) =>\r\n a.ductID === projectState.activeProject?.ductTypeID &&\r\n a.valveGridID === lastValveConnectorGrid?.valveGridID &&\r\n a.valveConnectionID === enValveConnectorConnection.rightAngled &&\r\n a.valveDiameterID === projectState.activeProject?.valveDiameterID\r\n );\r\n\r\n await dispatch(\r\n projectSlice.actions.connectionAdded({\r\n supply: supply,\r\n ductID: projectState.activeProject?.ductTypeID,\r\n valveConnectorGridID: newValveConnectorGrid?.valveConnectorGridID,\r\n })\r\n );\r\n }\r\n };\r\n};\r\n*/\r\n","export default __webpack_public_path__ + \"static/media/Icon-Additional components.cc4b1144.svg\";","export default __webpack_public_path__ + \"static/media/Icon-Air extraction.97a72770.svg\";","export default __webpack_public_path__ + \"static/media/Icon-Air supply.3e0d5bbb.svg\";","export default __webpack_public_path__ + \"static/media/Icon-Component list.e82ec30c.svg\";","export default __webpack_public_path__ + \"static/media/Icon-Installation list.da85563d.svg\";","export default __webpack_public_path__ + \"static/media/Icon-Project settings.e6d2b590.svg\";","export default __webpack_public_path__ + \"static/media/Icon-Start project.6168c605.svg\";","export default __webpack_public_path__ + \"static/media/A1.15a106c4.png\";","export default __webpack_public_path__ + \"static/media/A2.0db9e352.png\";","export default __webpack_public_path__ + \"static/media/A3.badf1fc5.png\";","export default __webpack_public_path__ + \"static/media/A4.f676a566.png\";","export default __webpack_public_path__ + \"static/media/A5.2b58742a.png\";","export default __webpack_public_path__ + \"static/media/A6.464b9ad2.png\";","export default __webpack_public_path__ + \"static/media/A7.1211335b.png\";","export default __webpack_public_path__ + \"static/media/A9.e9b26275.png\";","export default __webpack_public_path__ + \"static/media/B1.bb1e2623.png\";","export default __webpack_public_path__ + \"static/media/B2.5706e90e.png\";","export default __webpack_public_path__ + \"static/media/B3.812bc3b2.png\";","export default __webpack_public_path__ + \"static/media/B5.b448bb64.png\";","import { PlenumDataInside, PlenumDataSupply } from 'application/shared/PlenumDataSupply';\r\nimport * as React from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport ComponentList from '../ComponentList/ComponentList';\r\nimport EppDataEdit from '../EppDataEdit/EppDataEdit';\r\nimport ExtraComponents from '../ExtraComponents/ExtraComponents';\r\nimport InstallationPlan from '../InstallationPlan/InstallationPlan';\r\nimport { PlenumSelector } from '../PlenumSelector/PlenumSelector';\r\nimport ProjectSettings from '../ProjectSettings/ProjectSettings';\r\nimport RoomEditor from '../RoomEditor/RoomEditor';\r\n\r\nimport additionalComponents from 'image/menu/Icon-Additional components.svg';\r\nimport airExtraction from 'image/menu/Icon-Air extraction.svg';\r\nimport airSupply from 'image/menu/Icon-Air supply.svg';\r\nimport componentList from 'image/menu/Icon-Component list.svg';\r\nimport installationList from 'image/menu/Icon-Installation list.svg';\r\nimport projectSettings from 'image/menu/Icon-Project settings.svg';\r\nimport startProject from 'image/menu/Icon-Start project.svg';\r\n\r\nimport a1png from 'image/overview/A1.png';\r\nimport a2png from 'image/overview/A2.png';\r\nimport a3png from 'image/overview/A3.png';\r\nimport a4png from 'image/overview/A4.png';\r\nimport a5png from 'image/overview/A5.png';\r\nimport a6png from 'image/overview/A6.png';\r\nimport a7png from 'image/overview/A7.png';\r\n//import a8png from 'image/overview/A8.png'; //wtw unit nog niet\r\nimport a9png from 'image/overview/A9.png';\r\n\r\nimport b1png from 'image/overview/B1.png';\r\nimport b2png from 'image/overview/B2.png';\r\nimport b3png from 'image/overview/B3.png';\r\n//import b4png from 'image/overview/B4.png'; //wtw unit nog niet\r\nimport b5png from 'image/overview/B5.png';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IEditorTabs } from './IEditorTabs';\r\n\r\nexport const pages_project_list = '/project/list';\r\nexport const pages_project_setactive = '/project/setactive/';\r\nexport const pages_project_edit = '/project/edit';\r\nexport const pages_project_supplyplenum = '/project/edit/supply';\r\nexport const pages_project_supplyroom = '/project/edit/supply/room';\r\nexport const pages_project_supplymvhrplenum = '/project/edit/supply/mvhrplenum';\r\nexport const pages_project_supplyoutmvhr = '/project/edit/supply/outmvhr';\r\nexport const pages_project_extractionplenum = '/project/edit/extraction';\r\nexport const pages_project_extractionroom = '/project/edit/extraction/room';\r\nexport const pages_project_extractionplenummvhr = '/project/edit/extraction/plenummvhr';\r\nexport const pages_project_extractionmvhrout = '/project/edit/extraction/mvhrout';\r\nexport const pages_project_extracomponents = '/project/edit/extracomponents';\r\nexport const pages_project_componentlist = '/project/edit/componentlist';\r\nexport const pages_project_installationplan = '/project/edit/installationplan';\r\nexport const pages_project_calculation = '/project/edit/calculation';\r\n\r\nexport const useRoutes = (\r\n extraction: boolean,\r\n roles: string[]\r\n): [IEditorTabs[], IEditorTabs[][], number, string | undefined, () => any, boolean, () => any, boolean] => {\r\n const { t } = useTranslation(['editortabs']);\r\n const location = useLocation();\r\n const history = useHistory();\r\n\r\n const baseEditorTabs: IEditorTabs[] = React.useMemo(\r\n () => [\r\n {\r\n title: t('projectsettings', 'Project settings'),\r\n url: pages_project_edit,\r\n exact: true,\r\n component: undefined,\r\n icon: projectSettings,\r\n },\r\n {\r\n title: t('airsupply', 'Air supply'),\r\n url: pages_project_supplyplenum,\r\n exact: true,\r\n component: undefined,\r\n icon: airSupply,\r\n supply: true,\r\n balansimage: a2png,\r\n },\r\n {\r\n title: t('airsupplyrooms', 'Rooms for air supply'),\r\n url: pages_project_supplyroom,\r\n urlGroup: pages_project_supplyplenum,\r\n component: undefined,\r\n supply: true,\r\n balansimage: a3png,\r\n },\r\n {\r\n title: t('airsupplymvhrplenum', 'Duct component between plenum & MVHR for air supply'),\r\n url: pages_project_supplymvhrplenum,\r\n urlGroup: pages_project_supplyplenum,\r\n component: undefined,\r\n supply: true,\r\n balansimage: a4png,\r\n },\r\n {\r\n title: t('airsupplyoutmvhr', 'Duct component between MVHR & roof/wall terminal for air supply'),\r\n url: pages_project_supplyoutmvhr,\r\n urlGroup: pages_project_supplyplenum,\r\n component: undefined,\r\n supply: true,\r\n balansimage: a9png,\r\n },\r\n {\r\n title: t('airextraction', 'Air extraction'),\r\n url: pages_project_extractionplenum,\r\n exact: true,\r\n component: undefined,\r\n icon: airExtraction,\r\n balansimage: a6png,\r\n extractimage: b2png,\r\n },\r\n {\r\n title: t('airextractionrooms', 'Rooms for air extraction'),\r\n url: pages_project_extractionroom,\r\n urlGroup: pages_project_extractionplenum,\r\n component: undefined,\r\n balansimage: a5png,\r\n extractimage: b1png,\r\n },\r\n {\r\n title: t('airextractionplenummvhr', 'Duct component between plenum & MVHR for air extraction'),\r\n url: pages_project_extractionplenummvhr,\r\n urlGroup: pages_project_extractionplenum,\r\n component: undefined,\r\n balansimage: a7png,\r\n extractimage: b3png,\r\n },\r\n {\r\n title: t('airextractionmvhrout', 'Duct component between MVHR & roof/wall terminal for air extraction'),\r\n url: pages_project_extractionmvhrout,\r\n urlGroup: pages_project_extractionplenum,\r\n component: undefined,\r\n balansimage: a1png,\r\n extractimage: b5png,\r\n },\r\n {\r\n title: t('extracomponents', 'Additional components'),\r\n url: pages_project_extracomponents,\r\n component: undefined,\r\n icon: additionalComponents,\r\n },\r\n {\r\n title: t('componentlist', 'Components list'),\r\n url: pages_project_componentlist,\r\n component: undefined,\r\n icon: componentList,\r\n },\r\n {\r\n title: t('installationplan', 'Installation plan'),\r\n url: pages_project_installationplan,\r\n component: undefined,\r\n icon: installationList,\r\n },\r\n {\r\n title: 'Calculation report',\r\n url: pages_project_calculation,\r\n component: undefined,\r\n icon: installationList,\r\n role: 'Calculator',\r\n },\r\n ],\r\n [t]\r\n );\r\n\r\n const theEditorTabs: IEditorTabs[] = React.useMemo(\r\n () => baseEditorTabs.filter((a) => (!extraction || a.supply !== true) && (!a.role || roles.includes(a.role))),\r\n [baseEditorTabs, extraction, roles]\r\n );\r\n\r\n const listEditorTabs = React.useMemo(\r\n () => [{ title: t('projectlist', 'Project list'), url: pages_project_list, icon: startProject }] as IEditorTabs[],\r\n [t]\r\n );\r\n\r\n const editorTabs = React.useMemo(() => [listEditorTabs, theEditorTabs], [theEditorTabs, listEditorTabs]);\r\n\r\n const currentIndex = React.useMemo(\r\n () => theEditorTabs.findIndex((a) => a.url.toLowerCase() === location.pathname.toLowerCase()),\r\n [location.pathname, theEditorTabs]\r\n );\r\n\r\n const onPrev = React.useCallback(\r\n () => history.replace(theEditorTabs[currentIndex - 1].url),\r\n [currentIndex, theEditorTabs, history]\r\n );\r\n const onNext = React.useCallback(\r\n () => history.replace(theEditorTabs[currentIndex + 1].url),\r\n [currentIndex, theEditorTabs, history]\r\n );\r\n const canPrev = React.useMemo(() => currentIndex > 0, [currentIndex]);\r\n const canNext = React.useMemo(() => currentIndex < theEditorTabs.length - 1, [currentIndex, theEditorTabs]);\r\n\r\n const populatedEditorTabs = React.useMemo(() => {\r\n theEditorTabs.forEach((item) => {\r\n switch (item.url) {\r\n case pages_project_edit:\r\n item.component = ;\r\n break;\r\n case pages_project_supplyplenum:\r\n item.component = ;\r\n break;\r\n case pages_project_supplyroom:\r\n item.component = ;\r\n break;\r\n case pages_project_supplymvhrplenum:\r\n item.component = (\r\n \r\n );\r\n break;\r\n case pages_project_supplyoutmvhr:\r\n item.component = (\r\n \r\n );\r\n break;\r\n case pages_project_extractionplenum:\r\n item.component = ;\r\n break;\r\n case pages_project_extractionroom:\r\n item.component = ;\r\n break;\r\n case pages_project_extractionplenummvhr:\r\n item.component = (\r\n \r\n );\r\n break;\r\n case pages_project_extractionmvhrout:\r\n item.component = (\r\n \r\n );\r\n break;\r\n case pages_project_extracomponents:\r\n item.component = ;\r\n break;\r\n case pages_project_componentlist:\r\n item.component = ;\r\n break;\r\n case pages_project_installationplan:\r\n item.component = ;\r\n break;\r\n case pages_project_calculation:\r\n item.component = ;\r\n break;\r\n default:\r\n item.component =
??
;\r\n break;\r\n }\r\n });\r\n return theEditorTabs;\r\n }, [theEditorTabs, onNext]);\r\n\r\n return [\r\n populatedEditorTabs,\r\n editorTabs,\r\n currentIndex,\r\n currentIndex >= 0\r\n ? extraction\r\n ? populatedEditorTabs[currentIndex].extractimage\r\n : populatedEditorTabs[currentIndex].balansimage\r\n : undefined,\r\n onPrev,\r\n canPrev,\r\n onNext,\r\n canNext,\r\n ];\r\n};\r\n","import React from 'react';\r\nimport { NavMenu } from './NavMenu';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { pages_project_list } from 'application/project/view/Edit/EditorGrid/useRoutes';\r\n\r\nexport const Layout = (props: {\r\n children: any;\r\n onChangeLanguage: (language: string) => any;\r\n languages: string[];\r\n currentLanguage: string;\r\n}) => {\r\n const location = useLocation();\r\n //static displayName = Layout.name;\r\n return (\r\n
\r\n {location.pathname.toLowerCase().startsWith('/project') &&\r\n !location.pathname.toLowerCase().startsWith(pages_project_list) ? null : (\r\n \r\n )}\r\n {props.children}\r\n
\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Component } from 'react';\r\nimport { Route, Redirect } from 'react-router-dom';\r\nimport { ApplicationPaths, QueryParameterNames } from './ApiAuthorizationConstants';\r\nimport authService from './AuthorizeService';\r\n\r\nexport default class AuthorizeRoute extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n //console.log('AuthorizeRoute.constructor', props);\r\n\r\n this.state = {\r\n ready: false,\r\n authenticated: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this._subscription = authService.subscribe(() => this.authenticationChanged());\r\n //console.log('AuthorizeRoute.componentDidMount', this._subscription);\r\n this.populateAuthenticationState();\r\n }\r\n\r\n componentWillUnmount() {\r\n authService.unsubscribe(this._subscription);\r\n }\r\n\r\n render() {\r\n const { ready, authenticated } = this.state;\r\n var link = document.createElement('a');\r\n link.href = this.props.path;\r\n const returnUrl = `${link.protocol}//${link.host}${link.pathname}${link.search}${link.hash}`;\r\n const redirectUrl = `${ApplicationPaths.Login}?${QueryParameterNames.ReturnUrl}=${encodeURIComponent(returnUrl)}`;\r\n\r\n //console.log('AuthorizeRoute.render', this._subscription, this.state, this.props);\r\n\r\n if (!ready) {\r\n return
;\r\n } else {\r\n const { component: Component, ...rest } = this.props;\r\n //console.log('AuthorizeRoute.component/rest', { component: Component, rest: rest });\r\n return (\r\n {\r\n if (authenticated) {\r\n return ;\r\n } else {\r\n return ;\r\n }\r\n }}\r\n />\r\n );\r\n }\r\n }\r\n\r\n async populateAuthenticationState() {\r\n const authenticated = await authService.isAuthenticated();\r\n this.setState({ ready: true, authenticated });\r\n }\r\n\r\n async authenticationChanged() {\r\n this.setState({ ready: false, authenticated: false });\r\n await this.populateAuthenticationState();\r\n }\r\n}\r\n","import React from 'react';\r\nimport { Component } from 'react';\r\nimport authService from './AuthorizeService';\r\nimport { AuthenticationResultStatus } from './AuthorizeService';\r\nimport { LoginActions, QueryParameterNames, ApplicationPaths } from './ApiAuthorizationConstants';\r\n\r\n// The main responsibility of this component is to handle the user's login process.\r\n// This is the starting point for the login process. Any component that needs to authenticate\r\n// a user can simply perform a redirect to this component with a returnUrl query parameter and\r\n// let the component perform the login and return back to the return url.\r\nexport class Login extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LoginActions.Login:\r\n this.login(this.getReturnUrl());\r\n break;\r\n case LoginActions.LoginCallback:\r\n this.processLoginCallback();\r\n break;\r\n case LoginActions.LoginFailed:\r\n const params = new URLSearchParams(window.location.search);\r\n const error = params.get(QueryParameterNames.Message);\r\n this.setState({ message: error });\r\n break;\r\n case LoginActions.Profile:\r\n this.redirectToProfile();\r\n break;\r\n case LoginActions.Register:\r\n this.redirectToRegister();\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n\r\n render() {\r\n const action = this.props.action;\r\n const { message } = this.state;\r\n\r\n if (!!message) {\r\n return
{message}
;\r\n } else {\r\n switch (action) {\r\n case LoginActions.Login:\r\n return
Processing login
;\r\n case LoginActions.LoginCallback:\r\n return
Processing login callback
;\r\n case LoginActions.Profile:\r\n case LoginActions.Register:\r\n return
;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n }\r\n\r\n async login(returnUrl) {\r\n const state = { returnUrl };\r\n const result = await authService.signIn(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(`Invalid status result ${result.status}.`);\r\n }\r\n }\r\n\r\n async processLoginCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignIn(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as the only time completeSignIn finishes\r\n // is when we are doing a redirect sign in flow.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(`Invalid authentication result status '${result.status}'.`);\r\n }\r\n }\r\n\r\n getReturnUrl(state) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error('Invalid return url. The return url needs to have the same origin as the current page.');\r\n }\r\n return (state && state.returnUrl) || fromQuery || `${window.location.origin}/`;\r\n }\r\n\r\n redirectToRegister() {\r\n this.redirectToApiAuthorizationPath(\r\n `${ApplicationPaths.IdentityRegisterPath}?${QueryParameterNames.ReturnUrl}=${encodeURI(ApplicationPaths.Login)}`\r\n );\r\n }\r\n\r\n redirectToProfile() {\r\n this.redirectToApiAuthorizationPath(ApplicationPaths.IdentityManagePath);\r\n }\r\n\r\n redirectToApiAuthorizationPath(apiAuthorizationPath) {\r\n const redirectUrl = `${window.location.origin}/${apiAuthorizationPath}`;\r\n // It's important that we do a replace here so that when the user hits the back arrow on the\r\n // browser they get sent back to where it was on the app instead of to an endpoint on this\r\n // component.\r\n window.location.replace(redirectUrl);\r\n }\r\n\r\n navigateToReturnUrl(returnUrl) {\r\n // It's important that we do a replace here so that we remove the callback uri with the\r\n // fragment containing the tokens from the browser history.\r\n window.location.replace(returnUrl);\r\n }\r\n}\r\n","import React from 'react'\r\nimport { Component } from 'react';\r\nimport authService from './AuthorizeService';\r\nimport { AuthenticationResultStatus } from './AuthorizeService';\r\nimport { QueryParameterNames, LogoutActions, ApplicationPaths } from './ApiAuthorizationConstants';\r\n\r\n// The main responsibility of this component is to handle the user's logout process.\r\n// This is the starting point for the logout process, which is usually initiated when a\r\n// user clicks on the logout button on the LoginMenu component.\r\nexport class Logout extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined,\r\n isReady: false,\r\n authenticated: false\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n if (!!window.history.state.state.local) {\r\n this.logout(this.getReturnUrl());\r\n } else {\r\n // This prevents regular links to /authentication/logout from triggering a logout\r\n this.setState({ isReady: true, message: \"The logout was not initiated from within the page.\" });\r\n }\r\n break;\r\n case LogoutActions.LogoutCallback:\r\n this.processLogoutCallback();\r\n break;\r\n case LogoutActions.LoggedOut:\r\n this.setState({ isReady: true, message: \"You successfully logged out!\" });\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n\r\n this.populateAuthenticationState();\r\n }\r\n\r\n render() {\r\n const { isReady, message } = this.state;\r\n if (!isReady) {\r\n return
\r\n }\r\n if (!!message) {\r\n return (
{message}
);\r\n } else {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n return (
Processing logout
);\r\n case LogoutActions.LogoutCallback:\r\n return (
Processing logout callback
);\r\n case LogoutActions.LoggedOut:\r\n return (
{message}
);\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n }\r\n\r\n async logout(returnUrl) {\r\n const state = { returnUrl };\r\n const isauthenticated = await authService.isAuthenticated();\r\n if (isauthenticated) {\r\n const result = await authService.signOut(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n } else {\r\n this.setState({ message: \"You successfully logged out!\" });\r\n }\r\n }\r\n\r\n async processLogoutCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignOut(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n // There should not be any redirects as the only time completeAuthentication finishes\r\n // is when we are doing a redirect sign in flow.\r\n throw new Error('Should not redirect.');\r\n case AuthenticationResultStatus.Success:\r\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n }\r\n\r\n async populateAuthenticationState() {\r\n const authenticated = await authService.isAuthenticated();\r\n this.setState({ isReady: true, authenticated });\r\n }\r\n\r\n getReturnUrl(state) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\")\r\n }\r\n return (state && state.returnUrl) ||\r\n fromQuery ||\r\n `${window.location.origin}${ApplicationPaths.LoggedOut}`;\r\n }\r\n\r\n navigateToReturnUrl(returnUrl) {\r\n return window.location.replace(returnUrl);\r\n }\r\n}\r\n","import React, { Component, Fragment } from 'react';\r\nimport { Route } from 'react-router';\r\nimport { Login } from './Login';\r\nimport { Logout } from './Logout';\r\nimport { ApplicationPaths, LoginActions, LogoutActions } from './ApiAuthorizationConstants';\r\nimport { Container } from 'reactstrap';\r\n\r\nexport default class ApiAuthorizationRoutes extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n loginAction(LoginActions.Login)} />\r\n loginAction(LoginActions.LoginFailed)} />\r\n loginAction(LoginActions.LoginCallback)} />\r\n loginAction(LoginActions.Profile)} />\r\n loginAction(LoginActions.Register)} />\r\n logoutAction(LogoutActions.Logout)} />\r\n logoutAction(LogoutActions.LogoutCallback)} />\r\n logoutAction(LogoutActions.LoggedOut)} />\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nfunction loginAction(name) {\r\n return ;\r\n}\r\n\r\nfunction logoutAction(name) {\r\n return ;\r\n}\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { getProject, getProjects, IProject } from 'application/project/api/Project';\r\nimport { projectSlice } from '../projectSlice';\r\nimport { fetchAsyncConnections } from './AsyncConnection';\r\nimport { fetchAsyncEppDatas } from './AsyncEppData';\r\nimport { fetchAsyncEppDataComponents } from './AsyncEppDataComponent';\r\nimport { fetchAsyncPlenumDatas } from './AsyncPlenumData';\r\nimport { fetchAsyncProjectExtraComponents } from './AsyncProjectExtraComponent';\r\n\r\nexport const fetchAsyncProject = createAsyncThunk(\r\n 'project/getAsyncProject',\r\n async (data: { guid: string }, thunkAPI) => {\r\n const response = await getProject(data.guid);\r\n return response;\r\n }\r\n);\r\n\r\nexport const fetchAsyncProjects = createAsyncThunk('project/fetchAsyncProjects', async (data: {}, thunkAPI) => {\r\n const response = await getProjects();\r\n return response;\r\n});\r\n\r\nexport const asyncSetActiveProject = (project: IProject) => {\r\n return (dispatch: any, getState: any) => {\r\n localStorage.activeProjectGuid = project.guid;\r\n dispatch(projectSlice.actions.activeProjectChanged(project));\r\n dispatch(fetchAsyncPlenumDatas({ guid: project.guid }));\r\n dispatch(fetchAsyncConnections({ guid: project.guid }));\r\n dispatch(fetchAsyncEppDatas({ guid: project.guid }));\r\n dispatch(fetchAsyncEppDataComponents({ guid: project.guid }));\r\n dispatch(fetchAsyncProjectExtraComponents({ guid: project.guid }));\r\n };\r\n};\r\n","import * as React from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { useParams, useHistory, useLocation } from 'react-router-dom';\r\nimport { getProject } from 'application/project/api/Project';\r\nimport { asyncSetActiveProject } from 'application/project/redux/thunks/AsyncProject';\r\nimport { pages_project_list } from '../Edit/EditorGrid/useRoutes';\r\n\r\ninterface ProjectParameter {\r\n guid: string | undefined;\r\n}\r\n\r\nconst queryString = require('query-string');\r\n\r\nconst SetActiveProject = () => {\r\n const dispatch = useDispatch();\r\n const urlParameter: ProjectParameter = useParams();\r\n const history = useHistory();\r\n const location = useLocation();\r\n\r\n React.useEffect(() => {\r\n //initieel het project laden\r\n if (urlParameter.guid) {\r\n getProject(urlParameter.guid)\r\n .then((result) => {\r\n dispatch(asyncSetActiveProject(result));\r\n const parsed = queryString.parse(location.search);\r\n if (parsed.url && parsed.url.length > 0) {\r\n history.replace(parsed.url);\r\n } else {\r\n history.replace('/project/edit');\r\n }\r\n })\r\n .catch(() => {\r\n history.replace(pages_project_list);\r\n });\r\n }\r\n }, [history, urlParameter.guid, dispatch, location.search]);\r\n\r\n return
set active project ...
;\r\n};\r\nexport default SetActiveProject;\r\n","import { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\n\r\nconst drawerWidth = 240;\r\n\r\nexport const useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n display: 'flex',\r\n },\r\n drawer: {\r\n [theme.breakpoints.up('sm')]: {\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n },\r\n },\r\n appBar: {\r\n [theme.breakpoints.up('sm')]: {\r\n width: `calc(100% - ${drawerWidth}px) !important`,\r\n marginLeft: drawerWidth,\r\n },\r\n boxShadow: 'unset',\r\n },\r\n menuButton: {\r\n marginRight: theme.spacing(2),\r\n [theme.breakpoints.up('sm')]: {\r\n display: 'none',\r\n },\r\n },\r\n menuToolbar: {\r\n borderBottomColor: theme.palette.secondary.main,\r\n borderBottomStyle: 'solid',\r\n borderBottomWidth: 4,\r\n },\r\n List: {\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n },\r\n // necessary for content to be below app bar\r\n toolbar: theme.mixins.toolbar,\r\n drawerPaper: {\r\n width: drawerWidth,\r\n },\r\n content: {\r\n flexGrow: 1,\r\n padding: theme.spacing(1),\r\n [theme.breakpoints.down('md')]: {\r\n padding: 0,\r\n },\r\n },\r\n\r\n menu: {\r\n '&:hover': {\r\n textDecoration: 'none',\r\n },\r\n },\r\n\r\n logo: {\r\n maxHeight: 64,\r\n },\r\n\r\n logoHost: {\r\n textAlign: 'center',\r\n },\r\n\r\n menuIcon: {\r\n minWidth: 40,\r\n marginRight: theme.spacing(1),\r\n display: 'inline',\r\n '&.active': {\r\n color: theme.palette.primary.contrastText,\r\n },\r\n textAlign: 'center',\r\n },\r\n menuItem: {\r\n paddingLeft: 2,\r\n paddingRight: theme.spacing(1),\r\n paddingTop: 2,\r\n borderBottomColor: '#ddd',\r\n borderBottomWidth: 2,\r\n borderBottomStyle: 'solid',\r\n color: theme.palette.primary.main,\r\n '&.active': {\r\n color: theme.palette.secondary.main,\r\n },\r\n },\r\n menuText: {\r\n '&.noIcon': {\r\n color: theme.palette.text.primary,\r\n marginLeft: theme.spacing(1),\r\n '&.active': {\r\n color: theme.palette.secondary.main,\r\n },\r\n },\r\n },\r\n })\r\n);\r\n","import AppBar from '@material-ui/core/AppBar';\r\nimport * as React from 'react';\r\nimport { useStyles } from './styles';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport MenuIcon from '@material-ui/icons/Menu';\r\nimport { IProject } from 'application/project/api/Project';\r\nimport { useSelector } from 'react-redux';\r\nimport { selectCommonState } from 'redux/store';\r\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\r\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst ApplicationBar = (props: {\r\n project?: IProject;\r\n handleDrawerToggle: () => any;\r\n onPrev: () => any;\r\n onNext: () => any;\r\n canPrev: boolean;\r\n canNext: boolean;\r\n}) => {\r\n const classes = useStyles();\r\n const commonState = useSelector((state) => selectCommonState(state));\r\n const { t } = useTranslation(['editortabs']);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {commonState.pageTitle || ''}\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ApplicationBar;\r\n","import * as React from 'react';\r\nimport { IEditorTabs } from './IEditorTabs';\r\nimport { Route, Switch } from 'react-router-dom';\r\nimport { useTheme } from '@material-ui/core/styles';\r\n\r\nconst EditorSwitch = (props: {\r\n theEditorTabs: IEditorTabs[];\r\n image: string | undefined;\r\n onPrev: () => any;\r\n onNext: () => any;\r\n canPrev: boolean;\r\n canNext: boolean;\r\n}) => {\r\n const theme = useTheme();\r\n return (\r\n
\r\n {props.image ? (\r\n \r\n ) : null}\r\n \r\n {props.theEditorTabs.map((tab) => (\r\n \r\n {tab.component}\r\n \r\n ))}\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default EditorSwitch;\r\n","import * as React from 'react';\r\nimport CssBaseline from '@material-ui/core/CssBaseline';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Drawer from '@material-ui/core/Drawer';\r\nimport Hidden from '@material-ui/core/Hidden';\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { useStyles } from './EditorGrid/styles';\r\nimport ApplicationBar from './EditorGrid/ApplicationBar';\r\nimport { Link, Redirect, useLocation } from 'react-router-dom';\r\nimport { pages_project_list, pages_project_setactive, useRoutes } from './EditorGrid/useRoutes';\r\nimport clsx from 'clsx';\r\nimport { asyncInitEditor } from 'application/project/redux/thunks/AsyncInitEditor';\r\nimport { selectActiveProject } from 'application/project/redux/selectors/projectSelector';\r\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\r\n\r\n//import mainLogo from 'image/mggroup.png';\r\nimport mainLogo from 'image/burgerhout.png';\r\n\r\nimport authService from 'components/api-authorization/AuthorizeService';\r\nimport EditorSwitch from './EditorGrid/EditorSwitch';\r\n\r\ninterface Props {\r\n /**\r\n * Injected by the documentation to work in an iframe.\r\n * You won't need it on your project.\r\n */\r\n window?: () => Window;\r\n}\r\n\r\n//https://material-ui.com/components/drawers/#drawer\r\n\r\nexport const Editor = (props: Props) => {\r\n const classes = useStyles();\r\n const dispatch = useDispatch();\r\n const theme = useTheme();\r\n const { window } = props;\r\n const [mobileOpen, setMobileOpen] = React.useState(false);\r\n const [roles, setRoles] = React.useState([]);\r\n const location = useLocation();\r\n\r\n React.useEffect(() => {\r\n authService.getRoles().then((resRoles) => {\r\n if (componentIsMounted.current) setRoles(resRoles);\r\n });\r\n }, []);\r\n\r\n const componentIsMounted = React.useRef(true);\r\n React.useEffect(() => {\r\n return () => {\r\n componentIsMounted.current = false;\r\n };\r\n }, []); // Using an empty dependency array ensures this only runs on unmount\r\n\r\n React.useEffect(() => {\r\n //initieren van de editor\r\n dispatch(asyncInitEditor());\r\n }, [dispatch]);\r\n\r\n const project = useSelector(selectActiveProject);\r\n\r\n const [theEditorTabs, editorTabs, , image, onPrev, canPrev, onNext, canNext] = useRoutes(\r\n project?.ventilationTypeID === 2,\r\n roles\r\n );\r\n\r\n const handleDrawerToggle = React.useCallback(() => {\r\n setMobileOpen(!mobileOpen);\r\n }, [mobileOpen]);\r\n\r\n if (!project) {\r\n if ((localStorage.activeProjectGuid || '').length > 0) {\r\n return (\r\n \r\n
\r\n \r\n {editorTabs.map((tabGroup, index2) => {\r\n return (\r\n \r\n {index2 === 0 ? : null}\r\n \r\n {tabGroup.map((item, index) => {\r\n const active = location.pathname.toLowerCase() === item.url.toLowerCase() ? 'active' : null;\r\n const visible =\r\n item.icon ||\r\n (item.urlGroup && location.pathname.toLowerCase().startsWith(item.urlGroup.toLowerCase()));\r\n\r\n const mainItem = (\r\n \r\n \r\n \r\n {''}\r\n \r\n \r\n {active ? : null}\r\n \r\n \r\n );\r\n\r\n return visible ? mainItem : null;\r\n })}\r\n \r\n \r\n );\r\n })}\r\n {image ? \"map\" : null}\r\n \r\n );\r\n\r\n const container = window !== undefined ? () => window().document.body : undefined;\r\n\r\n return (\r\n
\r\n \r\n \r\n\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Editor;\r\n","import { fetchAsyncBends } from 'application/components/redux/thunks/fetchAsyncBends';\r\nimport { fetchAsyncDuctAdapters } from 'application/components/redux/thunks/fetchAsyncDuctAdapters';\r\nimport { fetchAsyncDucts } from 'application/components/redux/thunks/fetchAsyncDucts';\r\nimport { fetchAsyncEppColors } from 'application/components/redux/thunks/fetchAsyncEppColors';\r\nimport { fetchAsyncEppComponents } from 'application/components/redux/thunks/fetchAsyncEppComponents';\r\nimport { fetchAsyncEppDampers } from 'application/components/redux/thunks/fetchAsyncEppDamper';\r\nimport { fetchAsyncEppDamperTypes } from 'application/components/redux/thunks/fetchAsyncEppDamperTypes';\r\nimport { fetchAsyncEppDiameters } from 'application/components/redux/thunks/fetchAsyncEppDiameters';\r\nimport { fetchAsyncEppMaterials } from 'application/components/redux/thunks/fetchAsyncEppMaterials';\r\nimport { fetchAsyncEppTerminals } from 'application/components/redux/thunks/fetchAsyncEppTerminals';\r\nimport { fetchAsyncEppTerminalTypes } from 'application/components/redux/thunks/fetchAsyncEppTerminalTypes';\r\nimport { fetchAsyncEppTypes } from 'application/components/redux/thunks/fetchAsyncEppTypes';\r\nimport { fetchAsyncExtraComponents } from 'application/components/redux/thunks/fetchAsyncExtraComponents';\r\nimport { fetchAsyncPlenums } from 'application/components/redux/thunks/fetchAsyncPlenums';\r\nimport { fetchAsyncValveConnectorGrids } from 'application/components/redux/thunks/fetchAsyncValveConnectorGrids';\r\n\r\nexport const asyncInitEditor = () => {\r\n return (dispatch: any, getState: any) => {\r\n //plenum selectie\r\n dispatch(fetchAsyncPlenums({}));\r\n\r\n //room editor\r\n dispatch(fetchAsyncDucts({}));\r\n dispatch(fetchAsyncBends({}));\r\n //dispatch(fetchAsyncValves({}));\r\n dispatch(fetchAsyncValveConnectorGrids({}));\r\n dispatch(fetchAsyncDuctAdapters({}));\r\n\r\n //epp materials\r\n dispatch(fetchAsyncEppColors({}));\r\n dispatch(fetchAsyncEppComponents({}));\r\n dispatch(fetchAsyncEppDiameters({}));\r\n dispatch(fetchAsyncEppMaterials({}));\r\n dispatch(fetchAsyncEppTerminals({}));\r\n dispatch(fetchAsyncEppTerminalTypes({}));\r\n dispatch(fetchAsyncEppDampers({}));\r\n dispatch(fetchAsyncEppDamperTypes({}));\r\n dispatch(fetchAsyncEppTypes({}));\r\n\r\n //extra components\r\n dispatch(fetchAsyncExtraComponents({}));\r\n };\r\n};\r\n","export default __webpack_public_path__ + \"static/media/packshot.8790f339.jpg\";","export default __webpack_public_path__ + \"static/media/headervision.656ad718.jpg\";","import * as React from 'react';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\n\r\nexport const useULStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root_ul: {\r\n paddingLeft: 0,\r\n color: theme.palette.text.primary,\r\n\r\n listStyle: 'none',\r\n marginTop: 0,\r\n marginBottom: '1rem',\r\n\r\n '& >li': {\r\n position: 'relative',\r\n marginBottom: 10,\r\n paddingLeft: 25,\r\n\r\n '&::before': {\r\n position: 'absolute',\r\n left: 0,\r\n content: '\"\"',\r\n top: 5,\r\n height: 10,\r\n width: 10,\r\n display: 'inline-block',\r\n background: theme.palette.secondary.main,\r\n marginRight: 15,\r\n },\r\n '&::marker': {\r\n fontFamily: 'Open Sans, sans-serif',\r\n fontWeight: 400,\r\n color: '#747373',\r\n fontSize: 14,\r\n lineHeight: 20,\r\n },\r\n },\r\n },\r\n root_li: {},\r\n arrow: {\r\n fontWeight: 400,\r\n fontSize: 16,\r\n height: 14,\r\n lineHeight: 14,\r\n top: 17,\r\n fontFamily: 'FontAwesome',\r\n position: 'absolute',\r\n right: 20,\r\n textAlign: 'center',\r\n },\r\n })\r\n);\r\n\r\nexport const HomeUL = (props: { children: any }) => {\r\n const classes = useULStyles();\r\n\r\n return
    {props.children}
;\r\n};\r\n","import i18n from 'i18next';\r\nimport { initReactI18next } from 'react-i18next';\r\n\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\nimport ChainedBackend from 'i18next-chained-backend';\r\nimport LocizeBackend from 'i18next-locize-backend';\r\nimport LocalStorageBackend from 'i18next-localstorage-backend';\r\n\r\nimport { format as formatDate, isDate } from 'date-fns';\r\nimport { nl, de, fr, it } from 'date-fns/locale'; // import all locales we need\r\n\r\n// don't want to use this?\r\n// have a look at the Quick start guide\r\n// for passing in lng and translations on init\r\nexport const locales = { nl, de, fr, it }; // used to look up the required locale\r\n\r\ni18n\r\n // connnection to Locize\r\n // load translation using http -> see /public/locales (i.e. https://github.com/i18next/react-i18next/tree/master/example/react/public/locales)\r\n // learn more: https://github.com/i18next/i18next-http-backend\r\n .use(ChainedBackend)\r\n // detect user language\r\n // learn more: https://github.com/i18next/i18next-browser-languageDetector\r\n .use(LanguageDetector)\r\n // pass the i18n instance to react-i18next.\r\n .use(initReactI18next)\r\n // init i18next\r\n // for all options read: https://www.i18next.com/overview/configuration-options\r\n .init({\r\n ns: ['home', 'translation', 'projectlist', 'IdentitySystem', 'project', 'common'],\r\n //defaultNS: 'home',\r\n fallbackLng: 'en',\r\n debug: false,\r\n saveMissing: true,\r\n interpolation: {\r\n escapeValue: false, // not needed for react as it escapes by default\r\n format: (value, format, lng) => {\r\n if (isDate(value)) {\r\n try {\r\n const locale = locales[lng];\r\n if (format === 'shortdate') return formatDate(value, 'P', { locale });\r\n if (format === 'shorttime') return formatDate(value, 'p', { locale });\r\n return formatDate(value, format, { locale });\r\n } catch (e) {\r\n return e.message;\r\n }\r\n }\r\n },\r\n },\r\n react: {\r\n wait: true,\r\n useSuspense: false,\r\n },\r\n backend: {\r\n backends: [LocalStorageBackend, LocizeBackend],\r\n backendOptions: [\r\n {\r\n expirationTime: 0,\r\n //expirationTime: 7 * 24 * 60 * 60 * 1000, // 7 days\r\n },\r\n {\r\n // the id of your locize project\r\n projectId: '3e10c6be-ffb3-4a15-92a4-1f0820d18373',\r\n // add an api key if you want to send missing keys\r\n apiKey: process.env.REACT_APP_LOCIZE_API_KEY,\r\n // the reference language of your project\r\n referenceLng: 'en',\r\n // version - defaults to latest\r\n //NOG NIET version: '[VERSION]',\r\n // private - set to true if you version on locize is set to use private publish\r\n private: false,\r\n // hostnames that are allowed to create, update keys\r\n // please keep those to your local system, staging, test servers (not production)\r\n // can be array of allowed hosts or a function (hostname) => { return true; // or false if not allowed }\r\n allowedAddOrUpdateHosts: ['localhost', 'hybalanstest.burgerhout.com'],\r\n // optional event triggered on saved to backend\r\n //NOG NIET # onSaved: (lng, ns) => { ... },\r\n // can be used to reload resources in a specific interval (useful in server environments)\r\n //NOG NIET # reloadInterval: typeof window !== 'undefined' ? false : 60 * 60 * 1000};\r\n },\r\n ],\r\n },\r\n });\r\n\r\n//leuk testje\r\n/* \r\ni18n.on('missingKey', function (lngs, namespace, key, res) {\r\n console.log('Marcel', key);\r\n});\r\n*/\r\n\r\ni18n.on('initialized', (options) => {\r\n //console.log('initialized', options);\r\n i18n.loadNamespaces('editortabs', 'roomeditor', 'eppedit', 'componentlist', 'installationplan');\r\n});\r\n\r\nexport default i18n;\r\n","import React from 'react';\r\nimport packshot from 'image/packshot.jpg';\r\nimport headervision from 'image/headervision.jpg';\r\nimport ActionButton from 'components/controls/ActionButton';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { HomeUL } from './controls/HomeUL';\r\nimport preval from 'preval.macro';\r\nimport { format } from 'date-fns';\r\nimport { locales } from 'i18next/i18n';\r\n\r\nconst publishStyle: React.CSSProperties = { fontStyle: 'italic' };\r\n\r\nconst pubishDate = new Date(preval`module.exports = new Date().toISOString();`);\r\n\r\ninterface IRenderText {\r\n type: 'p' | 'li' | 'ul';\r\n content: string | IRenderText[];\r\n}\r\nconst Home = () => {\r\n const { t, i18n } = useTranslation(['home']);\r\n const [parts, setParts] = React.useState([]);\r\n React.useEffect(() => {\r\n //deze tekst moeten we splitsen in een aantal gedeeltes.\r\n //1 stuk voor tekst voor bullets\r\n //2 de bullets\r\n //3 de tekst erna.\r\n const parts = t('bodyHtml', 'stukje tekst').split('\\n');\r\n const newParts: IRenderText[] = [];\r\n let parent: IRenderText | undefined = undefined;\r\n parts.forEach((part) => {\r\n if (part.trim().startsWith('•')) {\r\n if (parent === undefined) {\r\n parent = {\r\n type: 'ul',\r\n content: [],\r\n };\r\n newParts.push(parent);\r\n }\r\n (parent.content as IRenderText[]).push({ type: 'li', content: part.trim().substr(1).trim() });\r\n } else {\r\n parent = undefined;\r\n newParts.push({ type: 'p', content: part.trim() });\r\n }\r\n });\r\n setParts(newParts);\r\n }, [t, i18n.language]);\r\n const locale: Locale | undefined = (locales as any)[i18n.language];\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n +\"\r\n ),\r\n }}\r\n />\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {parts.map((part, index) => {\r\n if (part.type === 'p') {\r\n return

{part.content}

;\r\n } else if (part.type === 'ul') {\r\n return (\r\n \r\n {(part.content as IRenderText[]).map((subpart, index2) => {\r\n return
  • {subpart.content}
  • ;\r\n })}\r\n
    \r\n );\r\n } else return null;\r\n })}\r\n

    \r\n {t('publishdate', 'published')}: {format(pubishDate, 'P', { locale })}{' '}\r\n {format(pubishDate, 'p', { locale })}\r\n

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n\r\n \r\n
    \r\n\r\n {/*\r\n

    Welcome to your new single-page application, built with:

    \r\n
      \r\n
    • \r\n ASP.NET Core and{' '}\r\n C# for cross-platform server-side code\r\n
    • \r\n
    • \r\n React for client-side code\r\n
    • \r\n
    • \r\n Bootstrap for layout and styling\r\n
    • \r\n
    \r\n

    To help you get started, we have also set up:

    \r\n
      \r\n
    • \r\n Client-side navigation. For example, click Counter then Back to return\r\n here.\r\n
    • \r\n
    • \r\n Development server integration. In development mode, the development server from{' '}\r\n create-react-app runs in the background automatically, so your client-side resources are\r\n dynamically built on demand and the page refreshes when you modify any file.\r\n
    • \r\n
    • \r\n Efficient production builds. In production mode, development-time features are disabled,\r\n and your dotnet publish configuration produces minified, efficiently bundled JavaScript files.\r\n
    • \r\n
    \r\n

    \r\n The ClientApp subdirectory is a standard React application based on the{' '}\r\n create-react-app template. If you open a command prompt in that directory, you can run{' '}\r\n npm commands such as npm test or npm install.\r\n

    \r\n */}\r\n
    \r\n \r\n );\r\n};\r\n\r\nexport default Home;\r\n","import React, { Component } from 'react';\r\nimport authService from 'components/api-authorization/AuthorizeService';\r\nimport Home from 'components/Home';\r\nimport { Redirect } from 'react-router-dom';\r\nimport { pages_project_list } from 'application/project/view/Edit/EditorGrid/useRoutes';\r\n\r\nexport class HomeWrapper extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.preFlightIsAuthenticated = localStorage.getItem('isAuthenticated') === 'true';\r\n if (window.location.search.substring(1) === 'preflight=true') this.preFlightIsAuthenticated = true;\r\n\r\n this.state = {\r\n isAuthenticated: false,\r\n preFlightIsAuthenticatedValid: true,\r\n userName: null,\r\n };\r\n }\r\n preFlightIsAuthenticated = false;\r\n\r\n componentDidMount() {\r\n this._subscription = authService.subscribe(() => this.populateState());\r\n this.populateState();\r\n }\r\n\r\n componentWillUnmount() {\r\n authService.unsubscribe(this._subscription);\r\n }\r\n\r\n async populateState() {\r\n const [isAuthenticated, user] = await Promise.all([authService.isAuthenticated(), authService.getUser()]);\r\n this.setState({\r\n isAuthenticated: isAuthenticated,\r\n preFlightIsAuthenticatedValid: false,\r\n userName: user && user.name,\r\n });\r\n localStorage.setItem('isAuthenticated', isAuthenticated);\r\n }\r\n\r\n render() {\r\n const { isAuthenticated, preFlightIsAuthenticatedValid } = this.state;\r\n const preFlight = preFlightIsAuthenticatedValid && this.preFlightIsAuthenticated;\r\n return (\r\n
    \r\n
    {isAuthenticated || preFlight ? : }
    \r\n
    \r\n );\r\n }\r\n}\r\n","import axios from 'axios';\r\n\r\nexport const supportedLanguages = ['en', 'nl', 'de', 'fr', 'it', 'pl' /*, 'hu'*/];\r\nfunction getCookie(cname: string) {\r\n let name = cname + '=';\r\n let decodedCookie = decodeURIComponent(document.cookie);\r\n let ca = decodedCookie.split(';');\r\n for (let i = 0; i < ca.length; i++) {\r\n let c = ca[i];\r\n while (c.charAt(0) === ' ') {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(name) === 0) {\r\n return c.substring(name.length, c.length);\r\n }\r\n }\r\n return '';\r\n}\r\n\r\nexport const getLanguage = () => {\r\n const value = getCookie('.AspNetCore.Culture');\r\n let language = '';\r\n if (value.length) {\r\n const parts = value.split('|');\r\n for (let i = 0; i < parts.length; i++) {\r\n if (parts[i].indexOf('c=') === 0) {\r\n language = parts[i].substring(2);\r\n break;\r\n }\r\n }\r\n }\r\n if (supportedLanguages.indexOf(language) === -1) {\r\n if (supportedLanguages.indexOf(navigator.language) !== -1) {\r\n language = navigator.language;\r\n } else {\r\n language = 'en';\r\n }\r\n }\r\n return language;\r\n};\r\n\r\nexport const setBackendLanguage = async (language: string) => {\r\n const response = await axios.post('api/Localisation/' + language);\r\n return response.data;\r\n};\r\n","import { Theme } from '@material-ui/core/styles';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { FormatDecimal, FormatInteger, FormatMin2HourMin, ParseDecimal } from 'application/shared/format';\r\nimport clsx from 'clsx';\r\nimport * as React from 'react';\r\n\r\nexport const gridInputStyles = makeStyles((theme: Theme) => ({\r\n margin: {\r\n marginLeft: theme.spacing(6),\r\n },\r\n cellright: {\r\n textAlign: 'right',\r\n },\r\n cellleft: {\r\n textAlign: 'left',\r\n },\r\n gridtd: {\r\n padding: 0,\r\n position: 'relative',\r\n },\r\n editmode: {\r\n background: '#FFCCD5',\r\n },\r\n inputcell: {\r\n paddingLeft: 3,\r\n paddingRight: 3,\r\n margin: 0,\r\n border: 0,\r\n width: '100%',\r\n },\r\n inputTdChild: {\r\n position: 'absolute',\r\n top: 0,\r\n height: '100%',\r\n },\r\n error: {\r\n fontWeight: 'bold',\r\n color: '#FF0000',\r\n },\r\n}));\r\n\r\nexport enum datatype {\r\n integer = 1,\r\n decimal1,\r\n decimal2,\r\n decimal3,\r\n decimal4,\r\n string,\r\n minInHourMin,\r\n}\r\n\r\nexport interface IGridInputProps {\r\n value: any;\r\n row: any;\r\n onCommit?: (row: any, name: string, value: any) => any;\r\n onKeyboardNavigation?: (name: string, event: any) => any;\r\n refCallBack?: (name: string, node: any) => void;\r\n focusElement?: () => any;\r\n datatype: datatype;\r\n className?: string;\r\n name: string;\r\n disabled?: boolean;\r\n readonly?: boolean;\r\n error?: boolean;\r\n unit?: string;\r\n tabIndex?: number;\r\n}\r\n\r\nexport const GridInput = (props: IGridInputProps) => {\r\n const textInput = React.useRef();\r\n const [value, setValue] = React.useState('');\r\n const orgRef = React.useRef('');\r\n const classes = gridInputStyles();\r\n\r\n const formatValue = React.useCallback(\r\n (val: any, format: boolean) => {\r\n switch (props.datatype) {\r\n case datatype.integer:\r\n case datatype.decimal1:\r\n case datatype.decimal2:\r\n case datatype.decimal3:\r\n case datatype.decimal4: {\r\n let szVal = '';\r\n if (!isNaN(val)) {\r\n if (format === true) {\r\n switch (props.datatype) {\r\n case datatype.integer:\r\n szVal = FormatInteger(val);\r\n break;\r\n case datatype.decimal1:\r\n szVal = FormatDecimal(val, 1);\r\n break;\r\n case datatype.decimal2:\r\n szVal = FormatDecimal(val, 2);\r\n break;\r\n case datatype.decimal3:\r\n szVal = FormatDecimal(val, 3);\r\n break;\r\n case datatype.decimal4:\r\n szVal = FormatDecimal(val, 4);\r\n break;\r\n default:\r\n szVal = val.toString();\r\n break;\r\n }\r\n } else {\r\n szVal = val !== undefined && val != null ? val.toString() : '';\r\n }\r\n }\r\n return szVal + (format === true && props.unit ? props.unit : '');\r\n }\r\n case datatype.minInHourMin: {\r\n let szVal = '';\r\n if (!isNaN(val)) {\r\n szVal = FormatMin2HourMin(val);\r\n return szVal;\r\n }\r\n return val || '';\r\n }\r\n\r\n default:\r\n return val || '';\r\n }\r\n },\r\n [props.datatype, props.unit]\r\n );\r\n\r\n const valueToValue = React.useCallback(\r\n (val: any, format: boolean) => {\r\n orgRef.current = formatValue(val, format);\r\n setValue(orgRef.current);\r\n },\r\n [setValue, formatValue]\r\n );\r\n\r\n const initStateValue = React.useCallback(\r\n (format: boolean) => {\r\n valueToValue(props.value, format);\r\n },\r\n [props.value, valueToValue]\r\n );\r\n\r\n React.useEffect(() => {\r\n initStateValue(true);\r\n }, [initStateValue]);\r\n\r\n const getClassName = React.useMemo(() => {\r\n return clsx(\r\n classes.inputcell,\r\n props.className,\r\n props.disabled ? null : classes.editmode,\r\n props.disabled ? null : classes.editmode,\r\n props.datatype === datatype.string ? classes.cellleft : classes.cellright,\r\n props.error ? classes.error : null\r\n );\r\n }, [props.disabled, props.error, classes, props.className, props.datatype]);\r\n\r\n const onChange = (evt: any) => {\r\n setValue(evt.target.value);\r\n };\r\n\r\n const onKeyDown = (evt: any) => {\r\n if (evt.key === 'Escape') {\r\n // ESCAPE key pressed\r\n initStateValue(false);\r\n } else if (evt.key === 'Enter') {\r\n // Enter key pressed\r\n acceptChanges();\r\n }\r\n //navination\r\n\r\n if (props.onKeyboardNavigation) {\r\n props.onKeyboardNavigation(props.name, evt);\r\n }\r\n };\r\n\r\n const acceptChanges = (): boolean => {\r\n if (props.onCommit !== undefined) {\r\n let editvalue: any = value;\r\n if (orgRef.current !== value) {\r\n switch (props.datatype) {\r\n case datatype.integer:\r\n if (value === '') {\r\n editvalue = null;\r\n } else {\r\n editvalue = parseInt(value);\r\n if (isNaN(editvalue)) {\r\n setValue(props.value);\r\n return true;\r\n }\r\n }\r\n break;\r\n case datatype.decimal1:\r\n case datatype.decimal2:\r\n case datatype.decimal3:\r\n case datatype.decimal4:\r\n if (value === '') {\r\n editvalue = null;\r\n } else {\r\n editvalue = ParseDecimal(value);\r\n if (isNaN(editvalue)) {\r\n if (value && value.length) {\r\n //de waarde was niet te wissen\r\n setValue(props.value);\r\n return true;\r\n } else {\r\n setValue('');\r\n return false;\r\n }\r\n }\r\n }\r\n break;\r\n case datatype.string:\r\n editvalue = editvalue.trim(' ');\r\n break;\r\n case datatype.minInHourMin:\r\n let parts = (editvalue as string).split(/[.,]/);\r\n if (parts.length >= 2) {\r\n const val = ParseDecimal(value);\r\n editvalue = val ? Math.round(val * 60) : '';\r\n } else {\r\n parts = (editvalue as string).split(/\\W/);\r\n const hours = parseInt(parts[0]);\r\n const min = parts.length > 1 ? parseInt(parts[1]) : 0;\r\n editvalue = hours * 60 + min;\r\n }\r\n break;\r\n }\r\n if (props.datatype === datatype.string || !isNaN(editvalue) || value === '') {\r\n props.onCommit(props.row, props.name, editvalue);\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n const getStep = React.useMemo(() => {\r\n switch (props.datatype) {\r\n case datatype.integer:\r\n return 1;\r\n case datatype.decimal1:\r\n return 0.1;\r\n case datatype.decimal2:\r\n return 0.01;\r\n case datatype.decimal3:\r\n return 0.001;\r\n case datatype.decimal4:\r\n return 0.0001;\r\n }\r\n }, [props.datatype]);\r\n\r\n return (\r\n {\r\n if (!acceptChanges()) {\r\n valueToValue(props.value, true);\r\n }\r\n }}\r\n onKeyDown={onKeyDown}\r\n onFocus={(e) => {\r\n orgRef.current = formatValue(props.value, false);\r\n e.target.value = orgRef.current;\r\n setValue(orgRef.current);\r\n e.target.select();\r\n }}\r\n ref={(node: any) => {\r\n textInput.current = node;\r\n if (props.refCallBack) {\r\n props.refCallBack(props.name, node);\r\n }\r\n }}\r\n disabled={props.disabled}\r\n />\r\n );\r\n};\r\n","import { componentSlice } from 'application/components/redux/componentSlice';\r\nimport { commonSlice } from '../commonSlice';\r\n\r\nexport const setLanguage = (language: string) => {\r\n return async (dispatch: any, getState: any) => {\r\n await dispatch(commonSlice.actions.LanguageChanged(language));\r\n await dispatch(componentSlice.actions.LanguageChanged({}));\r\n };\r\n};\r\n","import * as React from 'react';\r\nimport PageTitle from './PageTitle';\r\n\r\nconst RegularPage = (props: { children?: any; title: string }) => {\r\n return (\r\n \r\n \r\n
    {props.children}
    \r\n \r\n );\r\n};\r\n\r\nexport default RegularPage;\r\n","import * as React from 'react';\r\n\r\nexport interface IGridStatePlaceHolder {\r\n state: T;\r\n changeGridStateData: (field: string, value: boolean, index?: number | string) => any;\r\n}\r\n\r\nexport const useGridStateData = (defaultValue: T) => {\r\n const [gridStateData, setGridStateData] = React.useState(defaultValue);\r\n const changeGridStateData = React.useMemo(() => {\r\n return (field: string, value: boolean, index?: number | string) => {\r\n setGridStateData((prev) => {\r\n const retVal: any = { ...prev };\r\n if (index) {\r\n retVal[field][index] = value;\r\n } else {\r\n retVal[field] = value;\r\n }\r\n return retVal;\r\n });\r\n };\r\n }, []);\r\n\r\n const gridStatePlaceHolder: IGridStatePlaceHolder = React.useMemo(() => {\r\n return {\r\n state: gridStateData,\r\n changeGridStateData: changeGridStateData,\r\n };\r\n }, [gridStateData, changeGridStateData]);\r\n\r\n return gridStatePlaceHolder;\r\n};\r\n","import * as React from 'react';\r\nimport {\r\n copyProject,\r\n createProject,\r\n deleteProject,\r\n getProjectObject,\r\n IProject,\r\n updateProject,\r\n} from 'application/project/api/Project';\r\n\r\nenum saveStatusType {\r\n ready,\r\n error,\r\n saving,\r\n success,\r\n}\r\n\r\nexport interface IUseEditProjectProps {\r\n handleSubmitEdit: () => any;\r\n handleSubmitCopy: () => any;\r\n handleSubmitDelete: () => any;\r\n changeField: (value: string, field: string, error: string) => any;\r\n canSubmit: () => boolean;\r\n cancelEdit: () => any;\r\n setProject: (project?: IProject) => any;\r\n}\r\n\r\nexport const useEditProject = (\r\n saveCallback: (project: IProject) => any,\r\n deleteCallback: (project: IProject) => any\r\n): [IProject, IUseEditProjectProps] => {\r\n const [saveStatus, setSaveStatusIntern] = React.useState(saveStatusType.ready);\r\n const [project, setProject] = React.useState(getProjectObject());\r\n const projectRef = React.useRef(project);\r\n const saveStatusRef = React.useRef(saveStatus);\r\n\r\n const setSaveStatus = React.useCallback(\r\n (status: saveStatusType) => {\r\n setSaveStatusIntern(status);\r\n saveStatusRef.current = status;\r\n },\r\n [setSaveStatusIntern]\r\n );\r\n\r\n const handleSubmitEdit = React.useCallback(() => {\r\n if (projectRef.current) {\r\n setSaveStatus(saveStatusType.saving);\r\n\r\n if (projectRef.current.guid) {\r\n updateProject(projectRef.current).then((result) => {\r\n setSaveStatus(saveStatusType.ready);\r\n saveCallback(result);\r\n });\r\n } else {\r\n createProject(projectRef.current).then((result) => {\r\n setSaveStatus(saveStatusType.ready);\r\n saveCallback(result);\r\n });\r\n }\r\n }\r\n }, [setSaveStatus, saveCallback]);\r\n\r\n const handleSubmitCopy = React.useCallback(() => {\r\n if (projectRef.current) {\r\n setSaveStatus(saveStatusType.saving);\r\n\r\n copyProject(projectRef.current).then((result) => {\r\n setSaveStatus(saveStatusType.ready);\r\n saveCallback(result);\r\n });\r\n }\r\n }, [setSaveStatus, saveCallback]);\r\n\r\n const handleSubmitDelete = React.useCallback(() => {\r\n if (projectRef.current) {\r\n setSaveStatus(saveStatusType.saving);\r\n deleteProject(projectRef.current).then((result) => {\r\n setSaveStatus(saveStatusType.ready);\r\n deleteCallback(projectRef.current);\r\n });\r\n }\r\n }, [setSaveStatus, deleteCallback]);\r\n\r\n const changeField = React.useCallback((value: string, field: string, error: string) => {\r\n switch (field) {\r\n case 'title':\r\n case 'address':\r\n case 'description':\r\n setProject((prev: IProject) => {\r\n projectRef.current = {\r\n ...prev,\r\n [field]: value,\r\n };\r\n return projectRef.current;\r\n });\r\n break;\r\n }\r\n }, []);\r\n\r\n const canSubmit = React.useCallback(() => {\r\n return projectRef.current.title.length > 0 && saveStatusRef.current !== saveStatusType.saving;\r\n }, []);\r\n\r\n const cancelEdit = React.useCallback(() => {}, []);\r\n\r\n const setExternProject = React.useCallback(\r\n (project?: IProject) => {\r\n projectRef.current = getProjectObject(project);\r\n setProject(projectRef.current);\r\n },\r\n [setProject]\r\n );\r\n\r\n return [\r\n project,\r\n {\r\n changeField: changeField,\r\n handleSubmitEdit: handleSubmitEdit,\r\n handleSubmitCopy: handleSubmitCopy,\r\n handleSubmitDelete: handleSubmitDelete,\r\n canSubmit: canSubmit,\r\n cancelEdit: cancelEdit,\r\n setProject: setExternProject,\r\n },\r\n ];\r\n};\r\n\r\nexport default useEditProject;\r\n","import * as React from 'react';\r\n\r\nexport interface IKeyboardNavigation {\r\n data: any;\r\n name: string;\r\n event: any;\r\n}\r\n\r\nexport interface IRefCallBack {\r\n data: any;\r\n name: string;\r\n node: any;\r\n}\r\n\r\nexport interface IUsesKeyboardNavigation {\r\n refCallBack: (arg: IRefCallBack) => any;\r\n onKeyboardNavigation: (arg: IKeyboardNavigation) => any;\r\n}\r\n\r\nexport const useKeyboardNavigation = (props: {\r\n rowdatas: any[];\r\n getFieldID?: (item: any) => number | string;\r\n getNextFieldID?: (arg: IKeyboardNavigation, direction: number, refsNodeRefs: any) => number | string;\r\n}): IUsesKeyboardNavigation => {\r\n const refsNodeRefs = React.useRef({});\r\n\r\n const refData = React.useRef(props.rowdatas);\r\n if (refData.current !== props.rowdatas) {\r\n refData.current = props.rowdatas;\r\n refsNodeRefs.current = {};\r\n }\r\n\r\n const getFieldID = (data: any): number | string => {\r\n return props.getFieldID ? props.getFieldID(data) : data;\r\n };\r\n\r\n const refCallBack = (arg: IRefCallBack) => {\r\n if (!refsNodeRefs.current[arg.name]) {\r\n refsNodeRefs.current[arg.name] = {};\r\n }\r\n refsNodeRefs.current[arg.name][getFieldID(arg.data)] = arg.node;\r\n };\r\n\r\n const onKeyboardNavigation = (arg: IKeyboardNavigation) => {\r\n let nextFieldID: number | string | undefined = undefined;\r\n\r\n const direction = arg.event.key === 'ArrowUp' ? -1 : arg.event.key === 'ArrowDown' ? 1 : 0;\r\n if (direction === 0) return;\r\n arg.event.preventDefault();\r\n\r\n if (props.getNextFieldID) {\r\n nextFieldID = props.getNextFieldID(arg, direction, refsNodeRefs.current);\r\n } else {\r\n const fieldID = getFieldID(arg.data);\r\n const rowIndex = props.rowdatas.findIndex((a) => getFieldID(a) === fieldID);\r\n\r\n if (rowIndex + direction >= 0 && rowIndex + direction < props.rowdatas.length) {\r\n nextFieldID = getFieldID(props.rowdatas[rowIndex + direction]);\r\n }\r\n }\r\n if (nextFieldID) {\r\n if (refsNodeRefs.current[arg.name]) {\r\n const input = refsNodeRefs.current[arg.name][nextFieldID];\r\n if (input) {\r\n input.focus();\r\n }\r\n }\r\n }\r\n };\r\n return {\r\n onKeyboardNavigation: onKeyboardNavigation,\r\n refCallBack: refCallBack,\r\n };\r\n};\r\n","import { Theme, makeStyles } from '@material-ui/core/styles';\r\n\r\nexport const tableStyles = makeStyles((theme: Theme) => ({\r\n table: {\r\n backgroundColor: '#ffffff',\r\n fontFamily: theme.typography.body1.fontFamily,\r\n fontSize: theme.typography.body1.fontSize,\r\n },\r\n\r\n margin: {\r\n marginBottom: theme.spacing(2),\r\n },\r\n\r\n thead: {\r\n backgroundColor: '#3D8FBF',\r\n color: '#ffffff',\r\n },\r\n tr: {\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[100],\r\n },\r\n '&:focus-within': {\r\n backgroundColor: theme.palette.grey[200],\r\n },\r\n },\r\n cellPadding: {\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n paddingLeft: 3,\r\n paddingRight: 3,\r\n },\r\n cellIconPadding: {\r\n paddingRight: 0,\r\n },\r\n editCellPadding: {\r\n paddingTop: 0,\r\n paddingBottom: 0,\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n },\r\n tableBorder: {\r\n borderCollapse: 'separate',\r\n borderWidth: 0,\r\n borderStyle: 'solid',\r\n borderColor: '#A0A0A0',\r\n },\r\n textFilterCell: {\r\n paddingLeft: 0,\r\n paddingRight: 0,\r\n },\r\n BorderLeft: {\r\n borderLeftWidth: 1,\r\n },\r\n BorderRight: {\r\n borderRightWidth: 1,\r\n },\r\n BorderBottom: {\r\n borderBottomWidth: 1,\r\n },\r\n BorderTop: {\r\n borderTopWidth: 1,\r\n },\r\n BorderLeftBold: {\r\n borderLeftWidth: '2px !important',\r\n },\r\n BorderRightBold: {\r\n borderRightWidth: 2,\r\n },\r\n BorderBottomBold: {\r\n borderBottomWidth: 2,\r\n },\r\n BorderTopBold: {\r\n borderTopWidth: 2,\r\n },\r\n fit: {\r\n whiteSpace: 'nowrap',\r\n width: '1%',\r\n },\r\n\r\n splittHeadRow21: {\r\n paddingBottom: 0,\r\n },\r\n splittHeadRow22: {\r\n paddingTop: 0,\r\n paddingLeft: 1,\r\n paddingRight: 1,\r\n },\r\n\r\n stickyTable: {\r\n position: 'relative',\r\n },\r\n\r\n numberWidth: {\r\n minWidth: 70,\r\n },\r\n\r\n totalCell: {\r\n fontWeight: 'bold',\r\n },\r\n\r\n fullWith: {\r\n width: '100%',\r\n },\r\n\r\n clickable: {\r\n cursor: 'pointer',\r\n },\r\n\r\n stickyThead: {\r\n /*\r\n position: 'sticky',\r\n top: 50,\r\n zIndex: 5,\r\n Don't forget this, required for the stickiness */\r\n },\r\n stickyRowColor: {\r\n backgroundColor: '#ffffff',\r\n '&:hover': {\r\n backgroundColor: theme.palette.grey[100],\r\n /* nog niet helemaal goed, als de TR hover heeft, moet mijn kleur ook veranderen */\r\n },\r\n },\r\n\r\n stickyTester: {\r\n //backgroundColor: '#ff0000',\r\n },\r\n\r\n divTable: {\r\n display: 'table',\r\n },\r\n divTableRow: {\r\n display: 'table-row',\r\n },\r\n divTableHead: {\r\n /*\r\n border: '1px solid #999999',\r\n padding: '3px 10px',\r\n */\r\n display: 'table-cell',\r\n },\r\n divTableCell: {\r\n /*\r\n border: '1px solid #999999',\r\n padding: '3px 10px',\r\n */\r\n display: 'table-cell',\r\n },\r\n divTableHeading: {\r\n /*\r\n backgroundColor: '#EEE',\r\n fontWeight: 'bold',\r\n */\r\n display: 'table-header-group',\r\n },\r\n divTableFoot: {\r\n /*\r\n backgroundColor: '#EEE',\r\n fontWeight: 'bold',\r\n */\r\n display: 'table-footer-group',\r\n },\r\n divTableBody: {\r\n display: 'table-row-group',\r\n },\r\n}));\r\n","import * as React from 'react';\r\nimport { tableStyles } from './tableStyles';\r\nimport clsx from 'clsx';\r\n\r\ninterface ITdProps {\r\n className?: string;\r\n children?: any;\r\n colSpan?: number;\r\n rowSpan?: number;\r\n title?: string;\r\n onClick?: any;\r\n onMouseEnter?: any;\r\n firstRow?: boolean;\r\n firstCell?: boolean;\r\n style?: any;\r\n stickyRowTop?: number;\r\n stickyColumnLeft?: number;\r\n borderLeft?: string;\r\n borderRight?: string;\r\n borderBottom?: string;\r\n borderTop?: string;\r\n totalCell?: boolean;\r\n textAlign?: 'left' | 'center' | 'right';\r\n}\r\n\r\nconst Td = (props: ITdProps) => {\r\n const tableClasses = tableStyles();\r\n\r\n let borderLeft = props.borderLeft;\r\n let borderRight = props.borderRight;\r\n let borderBottom = props.borderBottom;\r\n let borderTop = props.borderTop;\r\n //standard borders ...\r\n //firstRow props.borderTop default no border ...\r\n if (borderLeft === undefined) {\r\n if (props.firstCell) {\r\n borderLeft = tableClasses.BorderLeft;\r\n }\r\n }\r\n if (borderRight === undefined) borderRight = tableClasses.BorderRight;\r\n if (borderBottom === undefined) borderBottom = tableClasses.BorderBottom;\r\n\r\n const style: any = { ...props.style };\r\n\r\n if (props.textAlign) {\r\n style.textAlign = props.textAlign;\r\n }\r\n\r\n if (props.totalCell === true) {\r\n style.fontWeight = 'bold';\r\n }\r\n\r\n if (props.stickyRowTop !== undefined) {\r\n style.top = props.stickyRowTop;\r\n style.position = 'sticky';\r\n style.zIndex = 5;\r\n }\r\n\r\n if (props.stickyColumnLeft !== undefined) {\r\n style.left = props.stickyColumnLeft;\r\n style.position = 'sticky';\r\n style.zIndex = 4;\r\n }\r\n\r\n if (props.stickyRowTop !== undefined && props.stickyColumnLeft !== undefined) {\r\n style.zIndex = 6;\r\n }\r\n\r\n let newProps: any = { ...props };\r\n delete newProps.borderTop;\r\n delete newProps.borderLeft;\r\n delete newProps.borderBottom;\r\n delete newProps.borderRight;\r\n delete newProps.stickyRowTop;\r\n delete newProps.stickyColumnLeft;\r\n delete newProps.firstRow;\r\n delete newProps.firstCell;\r\n delete newProps.textAlign;\r\n delete newProps.totalCell;\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\nexport default Td;\r\n","import * as React from 'react';\r\nimport clsx from 'clsx';\r\nimport { GridInput, gridInputStyles, IGridInputProps } from '../input/GridInput';\r\nimport { IUsesKeyboardNavigation } from '../hooks/useKeyboardNavigation';\r\nimport Td from './Td';\r\n\r\ninterface ITdGridInputProps extends IGridInputProps {\r\n tdClassName?: string;\r\n keyboardNavigation?: IUsesKeyboardNavigation;\r\n}\r\nexport const GridInputTd = (props: ITdGridInputProps) => {\r\n const classes = gridInputStyles();\r\n const newClassName = clsx(props.tdClassName, classes.gridtd, 'GridInputTd');\r\n const { keyboardNavigation, onKeyboardNavigation, row, refCallBack } = props;\r\n\r\n const onKeyboardNavigationMemo = React.useMemo(() => {\r\n return (name: string, event: any) => {\r\n if (onKeyboardNavigation) return onKeyboardNavigation(name, event);\r\n else if (keyboardNavigation?.onKeyboardNavigation) {\r\n keyboardNavigation?.onKeyboardNavigation({\r\n data: row,\r\n name: name,\r\n event: event,\r\n });\r\n }\r\n };\r\n }, [keyboardNavigation, onKeyboardNavigation, row]);\r\n\r\n const myRefCallBack = React.useMemo(() => {\r\n return (name: string, node: any) => {\r\n if (refCallBack) return refCallBack;\r\n else if (keyboardNavigation?.refCallBack)\r\n keyboardNavigation?.refCallBack({\r\n data: row,\r\n name: name,\r\n node: node,\r\n });\r\n };\r\n }, [refCallBack, keyboardNavigation, row]);\r\n\r\n const gridClassName = clsx(classes.inputcell, classes.inputTdChild);\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","import TableProp from './TableProp';\r\n\r\nexport default class RowProp {\r\n constructor(table: TableProp, index: number) {\r\n this._table = table;\r\n this._stickyHeight = 0;\r\n this._index = index;\r\n }\r\n\r\n private _table: TableProp;\r\n\r\n private _index: number;\r\n get index(): number {\r\n return this._index;\r\n }\r\n\r\n private _stickyHeight: number;\r\n get stickyHeight(): number {\r\n return this._stickyHeight;\r\n }\r\n set stickyHeight(newVal: number) {\r\n //if (newName && newName.length > fullNameMaxLength) {\r\n //throw new Error('fullName has a max length of ' + fullNameMaxLength);\r\n //}\r\n this._stickyHeight = newVal;\r\n }\r\n\r\n get stickyTop(): number {\r\n let top = 50;\r\n for (let i = 0; i < this.index; i++) {\r\n top += this._table.rows[i]._stickyHeight;\r\n }\r\n return top;\r\n }\r\n}\r\n","import TableProp from './TableProp';\r\n\r\nexport default class ColumnProp {\r\n constructor(table: TableProp, index: number) {\r\n this._table = table;\r\n this._stickWidth = 0;\r\n this._index = index;\r\n }\r\n private _table: TableProp;\r\n\r\n private _index: number;\r\n get index(): number {\r\n return this._index;\r\n }\r\n\r\n private _stickWidth: number;\r\n get stickyWidth(): number {\r\n return this._stickWidth;\r\n }\r\n set stickyWidth(newVal: number) {\r\n this._stickWidth = newVal;\r\n }\r\n\r\n get stickyLeft(): number {\r\n let top = 0;\r\n for (let i = 0; i < this.index; i++) {\r\n top += this._table.columns[i]._stickWidth;\r\n }\r\n return top;\r\n }\r\n}\r\n","import RowProp from './RowProp';\r\nimport ColumnProp from './ColumnProp';\r\n\r\nexport default class TableProp {\r\n constructor(\r\n rowCount: number,\r\n topOffset: number,\r\n columnCount: number,\r\n leftOffset: number\r\n ) {\r\n this._rowCount = rowCount;\r\n this._columnCount = columnCount;\r\n this._topOffset = topOffset;\r\n this._leftOffset = leftOffset;\r\n this._rows = [];\r\n for (let i = 0; i < this._rowCount; i++) {\r\n this._rows.push(new RowProp(this, i));\r\n }\r\n\r\n this._columns = [];\r\n for (let i = 0; i < this._columnCount; i++) {\r\n this._columns.push(new ColumnProp(this, i));\r\n }\r\n }\r\n\r\n private _topOffset: number;\r\n private _leftOffset: number;\r\n private _rowCount: number;\r\n private _columnCount: number;\r\n private _rows: RowProp[];\r\n private _columns: ColumnProp[];\r\n get rowCount(): number {\r\n return this._rowCount;\r\n }\r\n get columnCount(): number {\r\n return this._columnCount;\r\n }\r\n get rows(): RowProp[] {\r\n return this._rows;\r\n }\r\n get columns(): ColumnProp[] {\r\n return this._columns;\r\n }\r\n\r\n get StickyRowHeight(): number[] {\r\n let offset = this._topOffset;\r\n let values: number[] = [];\r\n for (let i = 0; i < this._rowCount; i++) {\r\n values.push(offset);\r\n offset += this.rows[i].stickyHeight;\r\n }\r\n return values;\r\n }\r\n get StickyColumnWidth(): number[] {\r\n let offset = this._leftOffset;\r\n let values: number[] = [];\r\n for (let i = 0; i < this._columnCount; i++) {\r\n values.push(offset);\r\n offset += this.columns[i].stickyWidth;\r\n }\r\n return values;\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport TableProp from './TableProp';\r\n\r\nconst useTableProps = (\r\n rowCount: number,\r\n topOffset: number,\r\n columnCount: number,\r\n leftOffset: number\r\n): [number[], (index: number, height: number) => void, number[], (index: number, width: number) => void] => {\r\n const tableProps = React.useRef(new TableProp(rowCount, topOffset, columnCount, leftOffset));\r\n const [StickyRowTop, setStickyRowHeight] = React.useState(tableProps.current.StickyRowHeight);\r\n const [StickyColumnWidth, setStickyColumnWidth] = React.useState(tableProps.current.StickyColumnWidth);\r\n\r\n const setRowHeight = (index: number, height: number) => {\r\n if (tableProps.current.rows[index].stickyHeight !== height) {\r\n tableProps.current.rows[index].stickyHeight = height;\r\n setStickyRowHeight(tableProps.current.StickyRowHeight);\r\n }\r\n };\r\n\r\n const setColumnWidth = (index: number, width: number) => {\r\n if (tableProps.current.columns[index].stickyWidth !== width) {\r\n tableProps.current.columns[index].stickyWidth = width;\r\n setStickyColumnWidth(tableProps.current.StickyColumnWidth);\r\n }\r\n };\r\n\r\n return [StickyRowTop, setRowHeight, StickyColumnWidth, setColumnWidth];\r\n};\r\n\r\nexport default useTableProps;\r\n","import React from 'react';\r\nimport { tableStyles } from './tableStyles';\r\nimport clsx from 'clsx';\r\n\r\ninterface ITableProps {\r\n className?: string;\r\n children?: any;\r\n title?: string;\r\n}\r\n\r\nconst Table = (props: ITableProps) => {\r\n const tableClasses = tableStyles();\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\nexport default Table;\r\n","import * as React from 'react';\r\nimport ResizeObserver from 'resize-observer-polyfill';\r\n\r\nconst useObserver = (props: {\r\n callback: (\r\n borderBox: { width: number; height: number },\r\n contentBox: { width: number; height: number },\r\n target: any,\r\n entry: any\r\n ) => any;\r\n element: React.MutableRefObject;\r\n}) => {\r\n const { callback, element } = props;\r\n const current = element && element.current;\r\n\r\n const observer = React.useRef();\r\n\r\n const myCallBack = React.useCallback(\r\n (entries: any[]) => {\r\n if (!entries?.length) return;\r\n let borderBox = {\r\n width: entries[0].borderBoxSize.inlineSize,\r\n height: entries[0].borderBoxSize.blockSize,\r\n };\r\n let contentBox = {\r\n width: entries[0].contentBoxSize.inlineSize,\r\n height: entries[0].contentBoxSize.blockSize,\r\n };\r\n // Checking for chrome as using a non-standard array\r\n if (entries[0].borderBoxSize[0]) {\r\n borderBox = {\r\n width: entries[0].borderBoxSize[0].inlineSize,\r\n height: entries[0].borderBoxSize[0].blockSize,\r\n };\r\n }\r\n // Checking for chrome as using a non-standard array\r\n if (entries[0].contentBoxSize[0]) {\r\n contentBox = {\r\n width: entries[0].contentBoxSize[0].inlineSize,\r\n height: entries[0].contentBoxSize[0].blockSize,\r\n };\r\n }\r\n callback(borderBox, contentBox, entries[0].target, entries[0]);\r\n },\r\n [callback]\r\n );\r\n\r\n React.useEffect(() => {\r\n let observedElement: any = undefined;\r\n const observe = () => {\r\n var obs: any = observer?.current;\r\n if (element && element.current && obs) {\r\n observedElement = element.current;\r\n obs.observe(element.current);\r\n }\r\n };\r\n\r\n // if we are already observing old element\r\n var obs: any = observer?.current;\r\n if (obs) {\r\n obs.unobserve(current);\r\n }\r\n observer.current = new ResizeObserver(myCallBack);\r\n observe();\r\n\r\n return () => {\r\n if (observedElement && obs) {\r\n obs.unobserve(observedElement);\r\n }\r\n };\r\n }, [current, element, myCallBack]);\r\n};\r\n\r\nexport default useObserver;\r\n","import * as React from 'react';\r\nimport { tableStyles } from './tableStyles';\r\nimport clsx from 'clsx';\r\nimport useObserver from '../hooks/useObserver';\r\n\r\nexport interface ISortingFields {\r\n onClick: (name: string) => any;\r\n currentOrderBy: string;\r\n}\r\nexport interface IThProps {\r\n className?: string;\r\n children?: any;\r\n colSpan?: number;\r\n rowSpan?: number;\r\n style?: any;\r\n title?: string;\r\n firstRow?: boolean;\r\n firstCell?: boolean;\r\n OnWidthChanged?: (width: number) => any;\r\n OnHeightChanged?: (height: number) => any;\r\n onClick?: (name: string) => any;\r\n dataField?: string;\r\n sortingFields?: ISortingFields;\r\n\r\n stickyRowTop?: number;\r\n stickyColumnLeft?: number;\r\n\r\n borderLeft?: string;\r\n borderRight?: string;\r\n borderBottom?: string;\r\n borderTop?: string;\r\n textAlign?: 'left' | 'center' | 'right';\r\n}\r\n\r\nconst Th = (props: IThProps) => {\r\n const tableClasses = tableStyles();\r\n const cell = React.useRef();\r\n const cellWidth = React.useRef();\r\n const cellHeight = React.useRef();\r\n const { onClick, sortingFields, dataField, OnWidthChanged, OnHeightChanged } = props;\r\n\r\n let borderLeft = props.borderLeft;\r\n let borderRight = props.borderRight;\r\n let borderBottom = props.borderBottom;\r\n let borderTop = props.borderTop;\r\n\r\n if (borderTop === undefined) {\r\n if (props.firstCell) {\r\n borderTop = tableClasses.BorderTopBold;\r\n }\r\n }\r\n if (borderLeft === undefined) {\r\n if (props.firstCell) {\r\n borderLeft = tableClasses.BorderLeftBold;\r\n }\r\n }\r\n if (borderRight === undefined) borderRight = tableClasses.BorderRightBold;\r\n if (borderBottom === undefined) borderBottom = tableClasses.BorderBottomBold;\r\n\r\n const onCllickRef = React.useRef(props.onClick);\r\n if (onCllickRef.current !== props.onClick) {\r\n onCllickRef.current = props.onClick;\r\n }\r\n\r\n const someCallback = React.useCallback(\r\n (\r\n borderBox: { width: number; height: number },\r\n contentBox: { width: number; height: number },\r\n target: any,\r\n entry: any\r\n ) => {\r\n if (!OnWidthChanged && !OnHeightChanged) return;\r\n // code to run after render goes here\r\n let item: any = cell?.current;\r\n if (item && OnWidthChanged) {\r\n if (borderBox.width !== cellWidth.current) {\r\n cellWidth.current = borderBox.width;\r\n OnWidthChanged(borderBox.width);\r\n }\r\n }\r\n if (item && OnHeightChanged) {\r\n if (borderBox.height !== cellHeight.current) {\r\n cellHeight.current = borderBox.height;\r\n OnHeightChanged(borderBox.height);\r\n }\r\n }\r\n },\r\n [OnWidthChanged, OnHeightChanged]\r\n );\r\n\r\n useObserver({ callback: someCallback, element: cell });\r\n\r\n React.useEffect(() => {});\r\n const style: any = { ...props.style };\r\n\r\n if (props.textAlign) {\r\n style.textAlign = props.textAlign;\r\n }\r\n\r\n if (props.stickyRowTop !== undefined) {\r\n style.top = props.stickyRowTop;\r\n style.position = 'sticky';\r\n style.zIndex = 5;\r\n }\r\n\r\n if (props.stickyColumnLeft !== undefined) {\r\n style.left = props.stickyColumnLeft;\r\n style.position = 'sticky';\r\n style.zIndex = 4;\r\n }\r\n\r\n if (props.stickyRowTop !== undefined && props.stickyColumnLeft !== undefined) {\r\n style.zIndex = 6;\r\n }\r\n\r\n let newProps: any = { ...props };\r\n delete newProps.borderTop;\r\n delete newProps.borderLeft;\r\n delete newProps.borderBottom;\r\n delete newProps.borderRight;\r\n delete newProps.stickyRowTop;\r\n delete newProps.stickyColumnLeft;\r\n delete newProps.OnHeightChanged;\r\n delete newProps.OnWidthChanged;\r\n delete newProps.textAlign;\r\n delete newProps.onClick;\r\n delete newProps.dataField;\r\n delete newProps.currentOrderBy;\r\n delete newProps.sortingFields;\r\n\r\n const orderBy = React.useMemo(() => {\r\n if (dataField && dataField === sortingFields?.currentOrderBy) {\r\n return ;\r\n } else if (dataField && sortingFields?.currentOrderBy && sortingFields?.currentOrderBy.startsWith(dataField)) {\r\n return ;\r\n } else {\r\n return undefined;\r\n }\r\n }, [dataField, sortingFields?.currentOrderBy]);\r\n\r\n const clickCallback = React.useCallback(\r\n () =>\r\n onClick ? onClick(dataField || '') : sortingFields?.onClick ? sortingFields.onClick(dataField || '') : undefined,\r\n [onClick, sortingFields, dataField]\r\n );\r\n\r\n return (\r\n \r\n {props.children}\r\n {orderBy}\r\n \r\n );\r\n};\r\n\r\nexport default Th;\r\n","import { ISettings } from 'application/editcomp/api/Settings';\r\nimport { IGridStatePlaceHolder } from '../../controls/hooks/useGridStateData';\r\nimport { IGridStateData } from '../Settings';\r\n\r\nexport interface IRenderRowCallBacks {\r\n name: (setting: ISettings) => any;\r\n value: (setting: ISettings) => any;\r\n encrypted: (setting: ISettings) => any;\r\n}\r\n\r\nexport const RenderRow = (\r\n state: IGridStatePlaceHolder,\r\n rowCount: number,\r\n callBacks: IRenderRowCallBacks,\r\n setting: ISettings | undefined\r\n) => {\r\n let result: any[] = [];\r\n result.push(callBacks.name(setting || ({} as ISettings)));\r\n result.push(callBacks.value(setting || ({} as ISettings)));\r\n result.push(callBacks.encrypted(setting || ({} as ISettings)));\r\n return result;\r\n};\r\n","import { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\nimport { ISettings, updateSettingsEdit } from 'application/editcomp/api/Settings';\r\nimport React from 'react';\r\nimport nameof from 'ts-nameof.macro';\r\nimport { IGridStatePlaceHolder } from '../../controls/hooks/useGridStateData';\r\nimport { IUsesKeyboardNavigation, useKeyboardNavigation } from '../../controls/hooks/useKeyboardNavigation';\r\nimport { datatype } from '../../controls/input/GridInput';\r\nimport { GridInputTd } from '../../controls/table/GridInputTd';\r\nimport useTableProps from '../../controls/table/properties/useTableProps';\r\nimport Table from '../../controls/table/Table';\r\nimport Td from '../../controls/table/Td';\r\nimport Th from '../../controls/table/Th';\r\nimport { IGridStateData } from '../Settings';\r\nimport { IRenderRowCallBacks, RenderRow } from './RenderRow';\r\n\r\nconst styles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n cell: {\r\n minWidth: 50,\r\n },\r\n })\r\n);\r\n\r\nconst SettingsGridTable = (props: {\r\n state: IGridStatePlaceHolder;\r\n settings: ISettings[];\r\n saveSetting: (setting: ISettings) => any;\r\n}) => {\r\n const keyboardNavigation = useKeyboardNavigation({\r\n rowdatas: props.settings,\r\n getFieldID: (item: ISettings) => item.settingID,\r\n });\r\n\r\n const classes = styles();\r\n const [stickyRowTop, setStickyRowHeight, stickyColumnWidth, setColumnWidth] = useTableProps(3, 115, 3, 0);\r\n\r\n const headerRow: IRenderRowCallBacks = {\r\n name: () => (\r\n setStickyRowHeight(0, height)}>\r\n setting name\r\n \r\n ),\r\n value: () => (\r\n \r\n value\r\n \r\n ),\r\n encrypted: () => (\r\n \r\n encrypted\r\n \r\n ),\r\n };\r\n\r\n const dataRow: IRenderRowCallBacks = {\r\n name: (setting: ISettings) => {setting.settingID},\r\n value: (setting: ISettings) => (\r\n props.saveSetting({ ...setting, value: value })}\r\n name={nameof(setting.value)}\r\n keyboardNavigation={keyboardNavigation}\r\n />\r\n ),\r\n encrypted: (setting: ISettings) => (\r\n \r\n {setting.encrypted ? 'JA' : 'nee'}\r\n \r\n ),\r\n };\r\n\r\n const filteredRows = React.useMemo(\r\n () => props.settings /*.filter(\r\n (a) =>\r\n (canDuplex === undefined || a.canDuplex === canDuplex) &&\r\n (valveConnectionID === 0 || a.valveConnectionID === valveConnectionID) &&\r\n (ductID === 0 || a.ductID === ductID) &&\r\n (valveDiameterID === 0 || a.valveDiameterID === valveDiameterID)\r\n )*/,\r\n [props.settings]\r\n );\r\n\r\n return (\r\n \r\n \r\n {RenderRow(props.state, props.settings.length, headerRow, undefined)}\r\n \r\n \r\n {filteredRows.map((setting) => (\r\n {RenderRow(props.state, props.settings.length, dataRow, setting)}\r\n ))}\r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default SettingsGridTable;\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface ISettings {\r\n settingID: string;\r\n value: string | null;\r\n encrypted: boolean;\r\n}\r\n\r\nexport const getSettingsEdit = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/Settings/edit', config);\r\n return response.data;\r\n};\r\n\r\nexport const updateSettingsEdit = async (setting: ISettings) => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.post('api/Settings/edit', setting, config);\r\n return response.data;\r\n};\r\n","import { getSettingsEdit, ISettings, updateSettingsEdit } from 'application/editcomp/api/Settings';\r\nimport React from 'react';\r\n\r\nconst newSetting = () => ({\r\n settingID: '',\r\n value: '',\r\n encrypted: false,\r\n});\r\n\r\nconst useSettingsGridData = () => {\r\n const [settings, setSettings] = React.useState([]);\r\n const [setting, setSetting] = React.useState(newSetting);\r\n const savingRef = React.useRef(false);\r\n\r\n React.useEffect(() => {\r\n getSettingsEdit().then((result) => setSettings(result));\r\n }, []);\r\n\r\n const saveSetting = React.useCallback(\r\n (setting: ISettings) => {\r\n if (savingRef.current === true) return;\r\n savingRef.current = true;\r\n updateSettingsEdit(setting).then((result) => {\r\n savingRef.current = false;\r\n setSettings((prev) => {\r\n if (prev.find((a) => a.settingID === result.settingID)) {\r\n return prev.map((a) => (a.settingID === result.settingID ? result : a));\r\n } else {\r\n setSetting(newSetting);\r\n return [...prev].concat(result);\r\n }\r\n });\r\n });\r\n },\r\n [setSettings, setSetting, setting]\r\n );\r\n\r\n return React.useMemo(\r\n () => ({\r\n settings: settings,\r\n setting: setting,\r\n saveSetting: saveSetting,\r\n setSetting: setSetting,\r\n }),\r\n [settings, saveSetting, setting, setSetting]\r\n );\r\n};\r\n\r\nexport default useSettingsGridData;\r\n","import Button from '@material-ui/core/Button';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport { updateSettingsEdit } from 'application/editcomp/api/Settings';\r\nimport RegularPage from 'components/controls/RegularPage';\r\nimport { InfoDialogEx } from 'components/dialog/InfoDialog';\r\nimport useInfoDialog, { OpenInfoDialogProps } from 'components/dialog/useInfoDialog';\r\nimport React from 'react';\r\nimport nameof from 'ts-nameof.macro';\r\nimport { useGridStateData } from '../controls/hooks/useGridStateData';\r\nimport { datatype, GridInput } from '../controls/input/GridInput';\r\nimport SettingsGridTable from './table/SettingsGridTable';\r\nimport useSettingsGridData from './useSettingsGridData';\r\n\r\nexport interface IGridStateData {\r\n openInfoDialog: (openInfoDialogProps: OpenInfoDialogProps) => void;\r\n}\r\n\r\nexport const initExpandedData = (\r\n openInfoDialog: (openInfoDialogProps: OpenInfoDialogProps) => void\r\n): IGridStateData => {\r\n return {\r\n openInfoDialog: openInfoDialog,\r\n };\r\n};\r\nconst Settings = () => {\r\n const data = useSettingsGridData();\r\n const [infoDialogState, openInfoDialog] = useInfoDialog();\r\n const gridStatePlaceHolder = useGridStateData(initExpandedData(openInfoDialog));\r\n const onCommit = React.useCallback(\r\n (row, name, value) => data.setSetting((prev) => ({ ...prev, [name]: value })),\r\n [data.setSetting]\r\n );\r\n\r\n const canAdd =\r\n data.setting.settingID.length > 0 &&\r\n !data.settings.find((a) => a.settingID.toLocaleLowerCase() === data.setting.settingID.toLocaleLowerCase());\r\n\r\n return (\r\n \r\n \r\n
    Settings
    \r\n
    \r\n name:{' '}\r\n \r\n
    \r\n
    \r\n value:{' '}\r\n \r\n
    \r\n
    \r\n encrypted:\r\n onCommit(null, nameof(data.setting.encrypted), value)}\r\n />\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default Settings;\r\n","import { IValveConnectorEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorEdit';\r\nimport { IValveConnectorGridEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorGridEdit';\r\nimport { IValveGridEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveGridEdit';\r\nimport { IGridStatePlaceHolder } from '../../controls/hooks/useGridStateData';\r\nimport { IGridStateData } from '../ValveConnectorGrid';\r\n\r\nexport interface IRenderRowCallBacks {\r\n valveConnectorName: (valveConnector: IValveConnectorEdit | undefined) => any;\r\n article: (valveConnector: IValveConnectorEdit | undefined) => any;\r\n duplex: (valveConnector: IValveConnectorEdit | undefined) => any;\r\n duct: (valveConnector: IValveConnectorEdit | undefined) => any;\r\n valveConnection: (valveConnector: IValveConnectorEdit | undefined) => any;\r\n valveDiameter: (valveConnector: IValveConnectorEdit | undefined) => any;\r\n valveConnectorGridConnector: (valveConnector: IValveConnectorEdit | undefined, valveGrid: IValveGridEdit) => any;\r\n}\r\n\r\nexport const RenderRow = (\r\n state: IGridStatePlaceHolder,\r\n rowCount: number,\r\n callBacks: IRenderRowCallBacks,\r\n valveConnector: IValveConnectorEdit | undefined,\r\n valveGrids: IValveGridEdit[],\r\n valveConnectorGrids: IValveConnectorGridEdit[]\r\n) => {\r\n let result: any[] = [];\r\n result.push(callBacks.valveConnectorName(valveConnector));\r\n result.push(callBacks.article(valveConnector));\r\n result.push(callBacks.duct(valveConnector));\r\n result.push(callBacks.valveDiameter(valveConnector));\r\n result.push(callBacks.valveConnection(valveConnector));\r\n result.push(callBacks.duplex(valveConnector));\r\n\r\n valveGrids.forEach((valveGrid) => {\r\n result.push(callBacks.valveConnectorGridConnector(valveConnector, valveGrid));\r\n });\r\n return result;\r\n};\r\n","import React from 'react';\r\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\r\nimport {\r\n getValveConnectorGridImage,\r\n uploadValveConnectorGridImage,\r\n} from 'application/components/api/ValveConnectorGrid';\r\nimport { IValveConnectorGridEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorGridEdit';\r\n\r\nconst styles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n valveImage: {},\r\n })\r\n);\r\n\r\nconst ConnectorGridImage = (props: {\r\n valveConnectorGridID: number;\r\n gridImageID: number | undefined;\r\n valveConnectorGridUpdated: (ValveConnectorGridEdit: IValveConnectorGridEdit) => any;\r\n}) => {\r\n const classes = styles();\r\n const inputRef = React.useRef(null);\r\n\r\n const onChangeFile = (event: any) => {\r\n uploadValveConnectorGridImage(props.valveConnectorGridID, event.target.files[0], event.target.files[0].name).then(\r\n (valveConnectorGrid) => {\r\n props.valveConnectorGridUpdated(valveConnectorGrid);\r\n }\r\n );\r\n };\r\n\r\n return (\r\n {\r\n const temp: any = inputRef.current;\r\n if (temp) {\r\n temp.click();\r\n }\r\n }}>\r\n \r\n {props.gridImageID ? (\r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n\r\nexport default ConnectorGridImage;\r\n","import { IValveConnectorEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorEdit';\r\nimport React from 'react';\r\nimport { IGridStatePlaceHolder } from '../../controls/hooks/useGridStateData';\r\nimport Td from '../../controls/table/Td';\r\nimport { IGridStateData } from '../ValveConnectorGrid';\r\nimport ConnectorGridImage from './ConnectorGridImage';\r\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\r\nimport { GridInputTd } from '../../controls/table/GridInputTd';\r\nimport { datatype } from '../../controls/input/GridInput';\r\nimport nameof from 'ts-nameof.macro';\r\nimport { IUsesKeyboardNavigation } from '../../controls/hooks/useKeyboardNavigation';\r\nimport { IValveGridEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveGridEdit';\r\nimport {\r\n IValveConnectorGridEdit,\r\n updateValveConnectorGridsEdit,\r\n} from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorGridEdit';\r\n\r\nconst styles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n cell: {\r\n minWidth: 50,\r\n },\r\n })\r\n);\r\n\r\nconst ValveGridCell = (props: {\r\n state: IGridStatePlaceHolder;\r\n valveGrid: IValveGridEdit;\r\n valveConnector: IValveConnectorEdit;\r\n valveConnectorGrids: IValveConnectorGridEdit[];\r\n valveConnectorGridUpdated: (ValveConnectorGridEdit: IValveConnectorGridEdit) => any;\r\n keyboardNavigation: IUsesKeyboardNavigation;\r\n}) => {\r\n const classes = styles();\r\n const valveConnectorGrid = props.valveConnectorGrids.find(\r\n (a) => a.valveConnectorID === props.valveConnector.valveConnectorID && a.valveGridID === props.valveGrid.valveGridID\r\n );\r\n\r\n if (valveConnectorGrid) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n updateValveConnectorGridsEdit({ ...valveConnectorGrid, supplyZeta: value }).then((result) => {\r\n props.valveConnectorGridUpdated(result);\r\n });\r\n }}\r\n datatype={datatype.decimal2}\r\n name={nameof(valveConnectorGrid.supplyZeta)}\r\n keyboardNavigation={props.keyboardNavigation}\r\n />\r\n\r\n {\r\n updateValveConnectorGridsEdit({ ...valveConnectorGrid, supplyZetaDuplex: value }).then((result) => {\r\n props.valveConnectorGridUpdated(result);\r\n });\r\n }}\r\n datatype={datatype.decimal2}\r\n name={nameof(valveConnectorGrid.supplyZetaDuplex)}\r\n keyboardNavigation={props.keyboardNavigation}\r\n />\r\n \r\n \r\n \r\n \r\n {\r\n updateValveConnectorGridsEdit({ ...valveConnectorGrid, extractionZeta: value }).then((result) => {\r\n props.valveConnectorGridUpdated(result);\r\n });\r\n }}\r\n datatype={datatype.decimal2}\r\n name={nameof(valveConnectorGrid.extractionZeta)}\r\n keyboardNavigation={props.keyboardNavigation}\r\n />\r\n\r\n {\r\n updateValveConnectorGridsEdit({ ...valveConnectorGrid, extractionZetaDuplex: value }).then(\r\n (result) => {\r\n props.valveConnectorGridUpdated(result);\r\n }\r\n );\r\n }}\r\n datatype={datatype.decimal2}\r\n name={nameof(valveConnectorGrid.extractionZetaDuplex)}\r\n keyboardNavigation={props.keyboardNavigation}\r\n />\r\n \r\n \r\n
    \r\n zetaduplex
    S\r\n \r\n
    E
    \r\n \r\n );\r\n } else {\r\n return ;\r\n }\r\n};\r\n\r\nexport default ValveGridCell;\r\n","import { IValveConnectorEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorEdit';\r\nimport React from 'react';\r\nimport { IGridStatePlaceHolder } from '../../controls/hooks/useGridStateData';\r\nimport Table from '../../controls/table/Table';\r\nimport Td from '../../controls/table/Td';\r\nimport Th from '../../controls/table/Th';\r\nimport { IGridStateData } from '../ValveConnectorGrid';\r\nimport { IRenderRowCallBacks, RenderRow } from './RenderRow';\r\nimport ValveGridCell from './ValveGridCell';\r\nimport ArrowDownwardIcon from '@material-ui/icons/ArrowDownward';\r\nimport ArrowForwardIcon from '@material-ui/icons/ArrowForward';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport Select from '@material-ui/core/Select';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport { useKeyboardNavigation } from '../../controls/hooks/useKeyboardNavigation';\r\nimport useTableProps from '../../controls/table/properties/useTableProps';\r\nimport { IValveConnectorGridEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorGridEdit';\r\nimport { IValveGridEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveGridEdit';\r\n\r\nconst ValveConnectorGridTable = (props: {\r\n state: IGridStatePlaceHolder;\r\n valveConnectors: IValveConnectorEdit[];\r\n valveConnectorGrids: IValveConnectorGridEdit[];\r\n valveGrids: IValveGridEdit[];\r\n valveConnectorGridUpdated: (ValveConnectorGridEdit: IValveConnectorGridEdit) => any;\r\n}) => {\r\n const [canDuplex, setCanDuplex] = React.useState();\r\n const [valveConnectionID, setValveConnectionID] = React.useState(0);\r\n const [ductID, setDuctID] = React.useState(0);\r\n const [valveDiameterID, setValveDiameterID] = React.useState(0);\r\n const [valveConnections, ducts, valveDiameters] = React.useMemo(() => {\r\n const valveConnections: { valveConnectionID: number; valveConnection: string }[] = [];\r\n const ducts: { ductID: number; duct: string }[] = [];\r\n const valveDiameters: { valveDiameterID: number; valveDiameter: string }[] = [];\r\n props.valveConnectors.forEach((a) => {\r\n if (!valveConnections.find((item) => item.valveConnectionID === a.valveConnectionID)) {\r\n valveConnections.push({ valveConnectionID: a.valveConnectionID, valveConnection: a.valveConnection });\r\n }\r\n if (!ducts.find((item) => item.ductID === a.ductID)) {\r\n ducts.push({ ductID: a.ductID, duct: a.duct });\r\n }\r\n if (!valveDiameters.find((item) => item.valveDiameterID === a.valveDiameterID)) {\r\n valveDiameters.push({ valveDiameterID: a.valveDiameterID, valveDiameter: a.valveDiameter });\r\n }\r\n });\r\n return [valveConnections, ducts, valveDiameters];\r\n }, [props.valveConnectors]);\r\n\r\n const keyboardNavigation = useKeyboardNavigation({\r\n rowdatas: props.valveConnectors,\r\n getFieldID: (item: IValveConnectorEdit) => item.valveConnectorID,\r\n });\r\n\r\n const [stickyRowTop, setStickyRowHeight, stickyColumnWidth, setColumnWidth] = useTableProps(3, 115, 3, 0);\r\n\r\n const headerRow: IRenderRowCallBacks = {\r\n valveConnectorName: (valveConnector: IValveConnectorEdit | undefined) => (\r\n setStickyRowHeight(1, height)}\r\n stickyColumnLeft={stickyColumnWidth[0]}\r\n OnWidthChanged={(height: number) => setColumnWidth(0, height)}>\r\n connector - grid\r\n \r\n \r\n ),\r\n article: (valveConnector: IValveConnectorEdit | undefined) => (\r\n \r\n article\r\n \r\n ),\r\n duplex: (valveConnector: IValveConnectorEdit | undefined) => (\r\n \r\n canDuplex\r\n \r\n setCanDuplex((prev) => {\r\n if (prev === undefined) return true;\r\n else if (prev === true) return false;\r\n else return undefined;\r\n })\r\n }\r\n />\r\n \r\n ),\r\n duct: (valveConnector: IValveConnectorEdit | undefined) => (\r\n \r\n ) => setDuctID(parseInt(event.target.value as string))}\r\n fullWidth>\r\n \r\n duct\r\n \r\n {ducts.map((item) => (\r\n \r\n {item.duct}\r\n \r\n ))}\r\n \r\n \r\n ),\r\n valveConnection: (valveConnector: IValveConnectorEdit | undefined) => (\r\n \r\n ) =>\r\n setValveConnectionID(parseInt(event.target.value as string))\r\n }\r\n fullWidth>\r\n \r\n connector\r\n \r\n {valveConnections.map((item) => (\r\n \r\n {item.valveConnection}\r\n \r\n ))}\r\n \r\n \r\n ),\r\n valveDiameter: (valveConnector: IValveConnectorEdit | undefined) => (\r\n \r\n ) =>\r\n setValveDiameterID(parseInt(event.target.value as string))\r\n }\r\n fullWidth>\r\n \r\n diameter\r\n \r\n {valveDiameters.map((item) => (\r\n \r\n {item.valveDiameter}\r\n \r\n ))}\r\n \r\n \r\n ),\r\n valveConnectorGridConnector: (valveConnector: IValveConnectorEdit | undefined, valveGrid: IValveGridEdit) => (\r\n \r\n {valveGrid.name}\r\n
    {valveGrid.articleNumber}\r\n \r\n ),\r\n };\r\n\r\n const dataRow: IRenderRowCallBacks = {\r\n valveConnectorName: (valveConnector: IValveConnectorEdit | undefined) => (\r\n \r\n {valveConnector?.name}\r\n \r\n ),\r\n article: (valveConnector: IValveConnectorEdit | undefined) => (\r\n {valveConnector?.articleNumber}\r\n ),\r\n duplex: (valveConnector: IValveConnectorEdit | undefined) => (\r\n \r\n \r\n \r\n ),\r\n duct: (valveConnector: IValveConnectorEdit | undefined) => {valveConnector?.duct},\r\n valveConnection: (valveConnector: IValveConnectorEdit | undefined) => (\r\n {valveConnector?.valveConnection}\r\n ),\r\n valveDiameter: (valveConnector: IValveConnectorEdit | undefined) => (\r\n {valveConnector?.valveDiameter}\r\n ),\r\n valveConnectorGridConnector: (valveConnector: IValveConnectorEdit | undefined, valveGrid: IValveGridEdit) =>\r\n valveConnector ? (\r\n \r\n ) : null,\r\n };\r\n\r\n const filteredRows = React.useMemo(\r\n () =>\r\n props.valveConnectors.filter(\r\n (a) =>\r\n (canDuplex === undefined || a.canDuplex === canDuplex) &&\r\n (valveConnectionID === 0 || a.valveConnectionID === valveConnectionID) &&\r\n (ductID === 0 || a.ductID === ductID) &&\r\n (valveDiameterID === 0 || a.valveDiameterID === valveDiameterID)\r\n ),\r\n [canDuplex, valveConnectionID, ductID, valveDiameterID, props.valveConnectors]\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n {RenderRow(\r\n props.state,\r\n props.valveGrids.length,\r\n headerRow,\r\n undefined,\r\n props.valveGrids,\r\n props.valveConnectorGrids\r\n )}\r\n \r\n \r\n \r\n {filteredRows.map((valveConnector) => (\r\n \r\n {RenderRow(\r\n props.state,\r\n props.valveGrids.length,\r\n dataRow,\r\n valveConnector,\r\n props.valveGrids,\r\n props.valveConnectorGrids\r\n )}\r\n \r\n ))}\r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default ValveConnectorGridTable;\r\n","import axios from 'axios';\r\nimport bearerTokenHeader from 'components/api-authorization/bearerToken';\r\n\r\nexport interface IValveConnectorEdit {\r\n valveConnectorID: number;\r\n name: string;\r\n valveDiameterID: number;\r\n valveDiameter: string;\r\n valveConnectionID: number;\r\n valveConnection: string;\r\n ductID: number;\r\n duct: string;\r\n enArticle: string;\r\n articleID: number;\r\n article: string;\r\n articleNumber: string;\r\n canDuplex: boolean;\r\n}\r\n\r\nexport const getValveConnectorsEdit = async () => {\r\n const config = await bearerTokenHeader();\r\n const response = await axios.get('api/ValveConnector/edit', config);\r\n return response.data;\r\n};\r\n","import {\r\n getValveConnectorsEdit,\r\n IValveConnectorEdit,\r\n} from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorEdit';\r\nimport {\r\n getValveConnectorGridsEdit,\r\n IValveConnectorGridEdit,\r\n} from 'application/editcomp/api/ValveConnectorGrid/ValveConnectorGridEdit';\r\nimport { getValveGridsEdit, IValveGridEdit } from 'application/editcomp/api/ValveConnectorGrid/ValveGridEdit';\r\nimport React from 'react';\r\n\r\nconst useValveConnectorGridData = () => {\r\n const [valveConnectors, setValveConnectors] = React.useState([]);\r\n const [valveConnectorGrids, setValveConnectorGrids] = React.useState([]);\r\n const [valveGrids, setValveGrids] = React.useState([]);\r\n\r\n const valveConnectorGridUpdated = React.useCallback(\r\n (ValveConnectorGridEdit: IValveConnectorGridEdit) => {\r\n setValveConnectorGrids((items: IValveConnectorGridEdit[]) =>\r\n items.map((item) => {\r\n if (item.valveConnectorGridID === ValveConnectorGridEdit.valveConnectorGridID) {\r\n return ValveConnectorGridEdit;\r\n } else {\r\n return item;\r\n }\r\n })\r\n );\r\n },\r\n [setValveConnectorGrids]\r\n );\r\n\r\n React.useEffect(() => {\r\n getValveConnectorGridsEdit().then((result) => setValveConnectorGrids(result));\r\n getValveConnectorsEdit().then((result) => setValveConnectors(result));\r\n getValveGridsEdit().then((result) => setValveGrids(result));\r\n }, []);\r\n\r\n return React.useMemo(\r\n () => ({\r\n valveConnectors: valveConnectors,\r\n valveConnectorGrids: valveConnectorGrids,\r\n valveGrids: valveGrids,\r\n valveConnectorGridUpdated: valveConnectorGridUpdated,\r\n }),\r\n [valveConnectors, valveConnectorGrids, valveGrids, valveConnectorGridUpdated]\r\n );\r\n};\r\n\r\nexport default useValveConnectorGridData;\r\n","import React from 'react';\r\nimport Settings from '../Settings/Settings';\r\nimport ValveConnectorGrid from '../ValveConnectorGrid/ValveConnectorGrid';\r\n\r\nexport interface linkitem {\r\n to: string;\r\n title: string;\r\n role: string;\r\n component: React.ComponentType;\r\n}\r\n\r\nexport const EditComponentItems: linkitem[] = [\r\n {\r\n to: 'ValveConnectorGrid',\r\n title: 'ValveConnectorGrid',\r\n role: 'EditComponent',\r\n component: ValveConnectorGrid,\r\n },\r\n {\r\n to: 'Settings',\r\n title: 'Settings',\r\n role: 'SystemAdmin',\r\n component: Settings,\r\n },\r\n];\r\n\r\nexport default EditComponentItems;\r\n","import RegularPage from 'components/controls/RegularPage';\r\nimport { InfoDialogEx } from 'components/dialog/InfoDialog';\r\nimport useInfoDialog, { OpenInfoDialogProps } from 'components/dialog/useInfoDialog';\r\nimport React from 'react';\r\nimport { useGridStateData } from '../controls/hooks/useGridStateData';\r\nimport ValveConnectorGridTable from './table/ValveConnectorGridTable';\r\nimport useValveConnectorGridData from './useValveConnectorGridData';\r\n\r\nexport interface IGridStateData {\r\n openInfoDialog: (openInfoDialogProps: OpenInfoDialogProps) => void;\r\n}\r\n\r\nexport const initExpandedData = (\r\n openInfoDialog: (openInfoDialogProps: OpenInfoDialogProps) => void\r\n): IGridStateData => {\r\n return {\r\n openInfoDialog: openInfoDialog,\r\n };\r\n};\r\nconst ValveConnectorGrid = () => {\r\n const data = useValveConnectorGridData();\r\n const [infoDialogState, openInfoDialog] = useInfoDialog();\r\n const gridStatePlaceHolder = useGridStateData(initExpandedData(openInfoDialog));\r\n return (\r\n \r\n \r\n
    ValveConnectorGrid
    \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default ValveConnectorGrid;\r\n","import RegularPage from 'components/controls/RegularPage';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Link, useLocation } from 'react-router-dom';\r\nimport { selectCommonState } from 'redux/store';\r\nimport EditComponentItems, { linkitem } from './MenuKeuzes';\r\n\r\nconst MapItems = (props: { items: linkitem[] }) => {\r\n const location = useLocation();\r\n const pathname = location.pathname + (location.pathname.endsWith('/') ? '' : '/');\r\n const commonState = useSelector(selectCommonState);\r\n return (\r\n
    \r\n {props.items.map((item) =>\r\n commonState.user?.roles.includes(item.role) ? (\r\n
    \r\n {item.title}\r\n
    \r\n ) : null\r\n )}\r\n
    \r\n );\r\n};\r\nconst SelectEditComponent = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default SelectEditComponent;\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Route } from 'react-router-dom';\r\nimport { Container } from 'reactstrap';\r\nimport { selectCommonState } from 'redux/store';\r\nimport EditComponentItems, { linkitem } from './SelectEditComponent/MenuKeuzes';\r\nimport SelectEditComponent from './SelectEditComponent/SelectEditComponent';\r\n\r\nconst parent = '/EditComponent';\r\nconst MapRoute = (items: linkitem[]) => {\r\n const commonState = useSelector(selectCommonState);\r\n return items.map((item) =>\r\n commonState.user?.roles.includes(item.role) ? (\r\n
    \r\n \r\n
    \r\n ) : null\r\n );\r\n};\r\n\r\nconst EditComponentRoutes = () => {\r\n return (\r\n \r\n \r\n {MapRoute(EditComponentItems)}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default EditComponentRoutes;\r\n","import { IProject } from 'application/project/api/Project';\r\nimport TextInputField from 'components/controls/TextInputField';\r\nimport * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport nameof from 'ts-nameof.macro';\r\nimport { IUseEditProjectProps } from './useEditProject';\r\n\r\ninterface MyIUseEditProjectProps extends IUseEditProjectProps {\r\n project: IProject;\r\n}\r\n\r\nconst EditProject = (props: MyIUseEditProjectProps) => {\r\n const { t } = useTranslation(['project']);\r\n\r\n return (\r\n
    \r\n
    \r\n ((o) => o.title)}\r\n required\r\n value={props.project?.title}\r\n onChange={(value: string, name: string, error: string) => {\r\n props.changeField(value, name, error);\r\n }}\r\n fullWidth\r\n helperText=\" \"\r\n />\r\n
    \r\n
    \r\n ((o) => o.address)}\r\n value={props.project?.address}\r\n onChange={(value: string, name: string, error: string) => {\r\n props.changeField(value, name, error);\r\n }}\r\n fullWidth\r\n helperText=\" \"\r\n />\r\n
    \r\n
    \r\n ((o) => o.description)}\r\n value={props.project?.description}\r\n onChange={(value: string, name: string, error: string) => {\r\n props.changeField(value, name, error);\r\n }}\r\n fullWidth\r\n helperText=\" \"\r\n />\r\n
    \r\n
    \r\n );\r\n};\r\nexport default EditProject;\r\n","import { Paper } from '@material-ui/core';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport { Theme } from '@material-ui/core/styles';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { createStyles } from '@material-ui/core/styles';\r\nimport * as React from 'react';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport { IProject } from 'application/project/api/Project';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {},\r\n paper: {\r\n padding: theme.spacing(2),\r\n color: theme.palette.text.secondary,\r\n width: '100%',\r\n marginTop: theme.spacing(2),\r\n },\r\n button: {\r\n float: 'right',\r\n },\r\n })\r\n);\r\n\r\nexport const ProjectItem = (props: {\r\n project: IProject;\r\n editProject: (project: IProject) => any;\r\n copyProject: (project: IProject) => any;\r\n deleteProject: (project: IProject) => any;\r\n}) => {\r\n const classes = useStyles();\r\n const { editProject, copyProject, deleteProject } = props;\r\n const { t } = useTranslation(['project']);\r\n\r\n const date = new Date(props.project.date);\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n

    {props.project?.title}

    \r\n {t('projectDateFormat', '{{val, shortdate}}', {\r\n val: date,\r\n })}\r\n
    \r\n
    {props.project?.description}
    \r\n
    \r\n
    \r\n \r\n {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n editProject(props.project);\r\n },\r\n [editProject, props?.project]\r\n )}>\r\n \r\n \r\n {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n copyProject(props.project);\r\n },\r\n [copyProject, props.project]\r\n )}>\r\n \r\n \r\n {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n deleteProject(props.project);\r\n },\r\n [deleteProject, props.project]\r\n )}>\r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default ProjectItem;\r\n","import * as React from 'react';\r\n\r\nexport interface EditOpenState {\r\n title: string;\r\n isOpen: boolean;\r\n content?: React.ReactNode;\r\n onApply: () => any;\r\n onClose: () => any;\r\n canApply?: () => boolean;\r\n applyDisabled?: boolean;\r\n}\r\n\r\nexport interface openEditProps {\r\n title: string;\r\n content?: React.ReactNode;\r\n onApply: () => any;\r\n canApply?: () => boolean;\r\n}\r\n\r\nconst useEditDialog = (): [EditOpenState, (props: openEditProps) => void] => {\r\n const [data, setData] = React.useState<{\r\n isOpen: boolean;\r\n title: string;\r\n content?: React.ReactNode;\r\n onApply: () => any;\r\n canApply?: () => boolean;\r\n }>({\r\n isOpen: false,\r\n title: '',\r\n content: undefined as React.ReactNode,\r\n onApply: () => {},\r\n canApply: undefined,\r\n });\r\n\r\n function SetOpen(props: openEditProps): void {\r\n setData({\r\n isOpen: true,\r\n title: props.title,\r\n content: props.content,\r\n onApply: props.onApply,\r\n canApply: props.canApply,\r\n });\r\n }\r\n function SetClose(): void {\r\n setData((prev) => {\r\n return {\r\n ...prev,\r\n isOpen: false,\r\n };\r\n });\r\n }\r\n\r\n let retVal: EditOpenState = {\r\n title: data.title,\r\n isOpen: data.isOpen,\r\n content: data.content,\r\n onApply: data.onApply,\r\n canApply: data.canApply,\r\n onClose: SetClose,\r\n };\r\n\r\n return [retVal, SetOpen];\r\n};\r\n\r\nexport default useEditDialog;\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport BaseDialog, { BaseButtonType } from './BaseDialog';\r\nimport { EditOpenState } from './useEditDialog';\r\n\r\ninterface MyEditOpenState extends EditOpenState {\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport default function EditDialog(props: MyEditOpenState) {\r\n const { t } = useTranslation(['translation']);\r\n return (\r\n {\r\n props.onClose();\r\n props.onApply();\r\n }}\r\n buttons={[\r\n {\r\n label: t('cancelbutton', 'cancel'),\r\n type: BaseButtonType.close,\r\n },\r\n {\r\n label: t('applybutton', 'apply changes'),\r\n type: BaseButtonType.submit,\r\n disabled: props.canApply !== undefined ? !props.canApply() : props.applyDisabled,\r\n },\r\n ]}>\r\n
    \r\n {props.content}\r\n {props.children}\r\n
    \r\n \r\n );\r\n}\r\n","import * as React from 'react';\r\n\r\nexport interface CorfirmOpenState {\r\n title: string;\r\n isOpen: boolean;\r\n question: React.ReactNode;\r\n onConfirm: () => any;\r\n onClose: () => any;\r\n}\r\n\r\nexport interface openCorfirmProps {\r\n title: string;\r\n question: string;\r\n onConfirm: () => any;\r\n}\r\n\r\nconst useConfirmDialog = (): [\r\n CorfirmOpenState,\r\n (props: openCorfirmProps) => void\r\n] => {\r\n const [data, setData] = React.useState({\r\n isOpen: false,\r\n title: '',\r\n question: undefined as React.ReactNode,\r\n onConfirm: () => {},\r\n });\r\n\r\n function SetOpen(props: openCorfirmProps): void {\r\n setData({\r\n isOpen: true,\r\n title: props.title,\r\n question: props.question,\r\n onConfirm: props.onConfirm,\r\n });\r\n }\r\n function SetClose(): void {\r\n setData((prev) => {\r\n return {\r\n ...prev,\r\n isOpen: false,\r\n };\r\n });\r\n }\r\n\r\n let retVal: CorfirmOpenState = {\r\n title: data.title,\r\n isOpen: data.isOpen,\r\n question: data.question,\r\n onConfirm: data.onConfirm,\r\n onClose: SetClose,\r\n };\r\n\r\n return [retVal, SetOpen];\r\n};\r\n\r\nexport default useConfirmDialog;\r\n","import * as React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport BaseDialog, { BaseButtonType } from './BaseDialog';\r\nimport { CorfirmOpenState } from './useConfirmDialog';\r\n\r\nexport default function ConfirmDialog(props: CorfirmOpenState) {\r\n const { t } = useTranslation(['translation']);\r\n return (\r\n {\r\n props.onClose();\r\n props.onConfirm();\r\n }}\r\n buttons={[\r\n {\r\n label: t('nobutton', 'no'),\r\n type: BaseButtonType.close,\r\n },\r\n {\r\n label: t('yesbutton', 'yes'),\r\n type: BaseButtonType.submit,\r\n },\r\n ]}>\r\n {props.question}\r\n \r\n );\r\n}\r\n","import Button from '@material-ui/core/Button';\r\nimport * as React from 'react';\r\nimport EditProject from './EditProject';\r\nimport ProjectItem from './ProjectItem';\r\nimport useEditProject from './useEditProject';\r\nimport AddCircleIcon from '@material-ui/icons/AddCircle';\r\nimport { Link, useHistory } from 'react-router-dom';\r\nimport useEditDialog from 'components/dialog/useEditDialog';\r\nimport { getProjectObject, getProjects, IProject } from 'application/project/api/Project';\r\nimport EditDialog from 'components/dialog/EditDialog';\r\nimport { Container } from 'reactstrap';\r\nimport TextInputField from 'components/controls/TextInputField';\r\nimport useConfirmDialog from 'components/dialog/useConfirmDialog';\r\nimport ConfirmDialog from 'components/dialog/ConfirmDialog';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\nimport { useDispatch } from 'react-redux';\r\nimport { asyncSetActiveProject } from 'application/project/redux/thunks/AsyncProject';\r\nimport { commonSlice } from 'application/common/redux/commonSlice';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n link: {\r\n '&:hover': {\r\n textDecoration: 'none',\r\n },\r\n },\r\n addButton: {\r\n height: 53,\r\n float: 'left',\r\n width: 150,\r\n },\r\n flexContainer: {\r\n display: 'flex',\r\n },\r\n\r\n flexGrowHor: {\r\n flexGrow: 1,\r\n },\r\n })\r\n);\r\n\r\nexport const ProjectList = (props: { preFlight: boolean }) => {\r\n const [editDialogState, showEditDialog] = useEditDialog();\r\n const [findProject, setFindProject] = React.useState('');\r\n const [projects, setProjects] = React.useState([]);\r\n const [conformDialog, setConfirm] = useConfirmDialog();\r\n const history = useHistory();\r\n const { t } = useTranslation(['projectlist', 'common']);\r\n const styles = useStyles();\r\n const dispatch = useDispatch();\r\n\r\n const { preFlight } = props;\r\n\r\n React.useEffect(() => {\r\n const title = t('title', 'Project list') + ' - Hybalans+';\r\n document.title = title;\r\n dispatch(commonSlice.actions.pageTitleChanged(title));\r\n }, [t, dispatch]);\r\n\r\n const [project, editProjectState] = useEditProject(\r\n (editproject) => {\r\n //update project list\r\n setProjects((prevProjects: IProject[]) => {\r\n const prevProject = prevProjects.find((a) => a.guid === editproject.guid);\r\n if (prevProject) {\r\n return prevProjects.map((pre) => {\r\n if (pre.guid === editproject.guid) {\r\n return editproject;\r\n } else {\r\n return pre;\r\n }\r\n });\r\n } else {\r\n return [editproject, ...prevProjects];\r\n }\r\n });\r\n //active project\r\n const url = '/project/setactive/' + editproject.guid;\r\n history.push(url);\r\n },\r\n (deleteProject) =>\r\n setProjects((prevProjects: IProject[]) => prevProjects.filter((a: IProject) => a.guid !== deleteProject.guid))\r\n );\r\n\r\n React.useEffect(() => {\r\n if (!preFlight) {\r\n getProjects().then((projects) => {\r\n if (projects) {\r\n setProjects(projects);\r\n }\r\n });\r\n }\r\n }, [preFlight]);\r\n\r\n const filteredProjects = React.useMemo(\r\n () =>\r\n projects\r\n .filter(\r\n (a) =>\r\n a.title.toLowerCase().includes(findProject.toLowerCase()) ||\r\n a.address.toLowerCase().includes(findProject.toLowerCase()) ||\r\n a.description.toLowerCase().includes(findProject.toLowerCase())\r\n )\r\n .sort((a, b) => b.date.localeCompare(a.date)),\r\n\r\n [findProject, projects]\r\n );\r\n\r\n const editProject = React.useCallback(\r\n (editproject?: IProject) => {\r\n editProjectState.setProject(editproject ? editproject : getProjectObject());\r\n showEditDialog({\r\n title: t('projectlist:edit_title', 'Edit common project settings'),\r\n onApply: editProjectState.handleSubmitEdit,\r\n canApply: editProjectState.canSubmit,\r\n });\r\n },\r\n [editProjectState, showEditDialog, t]\r\n );\r\n\r\n const copyProject = React.useCallback(\r\n (editproject: IProject) => {\r\n editProjectState.setProject(editproject);\r\n showEditDialog({\r\n title: t('projectlist:copy_title', 'Copy project'),\r\n onApply: editProjectState.handleSubmitCopy,\r\n canApply: editProjectState.canSubmit,\r\n });\r\n },\r\n [editProjectState, showEditDialog, t]\r\n );\r\n\r\n const deleteProject = React.useCallback(\r\n (editproject: IProject) => {\r\n editProjectState.setProject(editproject);\r\n setConfirm({\r\n title: t('projectlist:delete_title', 'delete project'),\r\n question: t('projectlist:delete_question', 'delete project {{title}}, date:{{date, shortdate}}?', {\r\n title: editproject.title,\r\n date: new Date(editproject.date),\r\n }),\r\n onConfirm: editProjectState.handleSubmitDelete,\r\n });\r\n },\r\n [editProjectState, setConfirm, t]\r\n );\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n editProject(undefined)}\r\n className={styles.addButton}>\r\n \r\n \r\n setFindProject(value), [])}\r\n />\r\n
    \r\n {filteredProjects.map((project: IProject) => (\r\n {\r\n e.preventDefault();\r\n dispatch(asyncSetActiveProject(project));\r\n history.push('/project/edit');\r\n }}>\r\n \r\n \r\n ))}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default ProjectList;\r\n","import React from 'react';\r\nimport { Route } from 'react-router';\r\nimport { Layout } from './components/Layout';\r\nimport AuthorizeRoute from './components/api-authorization/AuthorizeRoute';\r\nimport ApiAuthorizationRoutes from './components/api-authorization/ApiAuthorizationRoutes';\r\nimport { ApplicationPaths } from './components/api-authorization/ApiAuthorizationConstants';\r\nimport { Provider, useDispatch } from 'react-redux';\r\nimport { store } from './redux/store';\r\n\r\nimport './custom.css';\r\nimport SetActiveProject from './application/project/view/setters/SetActiveProject';\r\nimport Editor from './application/project/view/Edit/Editor';\r\nimport axios from 'axios';\r\nimport authService from './components/api-authorization/AuthorizeService';\r\nimport { MuiThemeProvider } from '@material-ui/core/styles';\r\nimport { globalTheme } from 'application/shared/styles';\r\nimport { HomeWrapper } from 'application/HomeWrapper';\r\nimport { commonSlice } from 'application/common/redux/commonSlice';\r\nimport { TestenAuthService } from 'components/api-authorization/bearerToken';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { getLanguage, setBackendLanguage, supportedLanguages } from 'i18next/languages';\r\nimport { setLanguage } from 'application/common/redux/thunks/setLanguage';\r\nimport EditComponentRoutes from 'application/editcomp/views/EditComponentRoutes';\r\nimport { pages_project_list } from 'application/project/view/Edit/EditorGrid/useRoutes';\r\nimport ProjectList from 'application/project/view/List/ProjectList';\r\n\r\n// Add a 401 response interceptor\r\naxios.interceptors.response.use(\r\n function (response) {\r\n return response;\r\n },\r\n async function (error) {\r\n if (401 === error.response.status) {\r\n const isauthenticated = await authService.isAuthenticated();\r\n if (isauthenticated) {\r\n authService.updateState(null);\r\n await authService.signOut({});\r\n /*\r\n dit werkte niet zo lekker\r\n */\r\n }\r\n } else {\r\n return Promise.reject(error);\r\n }\r\n }\r\n);\r\n\r\nconst AppWithStoreAndTheme = () => {\r\n const dispatch = useDispatch();\r\n const [roles, setRoles] = React.useState([]);\r\n const { i18n } = useTranslation();\r\n\r\n const changeLanguage = React.useCallback(\r\n async (language: string, setServer: boolean = true) => {\r\n if (i18n.language !== language) {\r\n document.documentElement.lang = language;\r\n await dispatch(commonSlice.actions.LanguageChanged(language));\r\n if (setServer) {\r\n await setBackendLanguage(language);\r\n }\r\n i18n.changeLanguage(language);\r\n dispatch(setLanguage(language));\r\n }\r\n },\r\n [i18n, dispatch]\r\n );\r\n\r\n React.useEffect(() => {\r\n authService.getRoles().then((resRoles) => {\r\n if (componentIsMounted.current) setRoles(resRoles);\r\n });\r\n }, []);\r\n const componentIsMounted = React.useRef(true);\r\n React.useEffect(() => {\r\n return () => {\r\n componentIsMounted.current = false;\r\n };\r\n }, []); // Using an empty dependency array ensures this only runs on unmount\r\n\r\n authService.getAccessToken().then((token) => {\r\n axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;\r\n });\r\n\r\n React.useEffect(() => {\r\n TestenAuthService();\r\n changeLanguage(getLanguage(), false);\r\n\r\n authService.getRawUser().then((user) => {\r\n if (!user) {\r\n dispatch(commonSlice.actions.userChanged(null));\r\n } else {\r\n dispatch(\r\n commonSlice.actions.userChanged({\r\n contactName: user.profile.contactName,\r\n userEmail: user.profile.email,\r\n userID: user.profile.sub,\r\n language: user.profile.language,\r\n roles: user.profile.role,\r\n expires_at: new Date(user.expires_at * 1000).toISOString(),\r\n expires_in: user.expires_in,\r\n })\r\n );\r\n if (supportedLanguages.includes(user.profile.language)) {\r\n changeLanguage(user.profile.language);\r\n }\r\n }\r\n });\r\n }, [dispatch, changeLanguage, i18n]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {roles.includes('EditComponent') ? (\r\n \r\n ) : null}\r\n \r\n \r\n );\r\n};\r\n\r\n/*\r\nconst Spinner = (props: any) => {\r\n const { delay = 0 } = props;\r\n const [ready, setReady] = React.useState(delay === 0);\r\n React.useEffect(() => {\r\n let timeout: any = null;\r\n if (!ready) {\r\n timeout = setTimeout(() => setReady(true), delay);\r\n }\r\n return () => {\r\n if (timeout) clearTimeout(timeout);\r\n };\r\n }, [ready, delay]);\r\n if (!ready) {\r\n console.log('spinner null');\r\n return null;\r\n }\r\n console.log('spinner loading');\r\n return (\r\n
    loading ...
    \r\n // Spinner\r\n );\r\n};\r\n*/\r\n\r\n//https://dev.to/lakhansamani/how-to-use-react-suspense-and-lazy-for-code-splitting-3fo2\r\n\r\nexport const App = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default App;\r\n","import 'react-app-polyfill/ie11';\r\nimport 'react-app-polyfill/stable';\r\nimport 'bootstrap/dist/css/bootstrap.css';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport App from './App';\r\n//import registerServiceWorker from './registerServiceWorker';\r\n\r\n// import i18n (needs to be bundled ;))\r\nimport './i18next/i18n';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n rootElement\r\n);\r\n\r\n// Uncomment the line above that imports the registerServiceWorker function\r\n// and the line below to register the generated service worker.\r\n// By default create-react-app includes a service worker to improve the\r\n// performance of the application by caching static assets. This service\r\n// worker can interfere with the Identity UI, so it is\r\n// disabled by default when Identity is being used.\r\n//\r\n//registerServiceWorker();\r\n"],"sourceRoot":""}