{"version":3,"sources":["assets/19fa5f_154193d7f92f4af6b42b18d8799ff1de~mv2.webp","components/MessageAlerts.js","components/api-authorization/ApiAuthorizationConstants.js","components/api-authorization/AuthorizeService.js","components/api-authorization/LoginMenu.js","components/NavMenu.js","components/Layout.js","components/StartPage.js","components/Home.js","components/AdminFetchComponent.js","components/GroupCustomerFetchComponent.js","components/ContainersPage.js","components/AuthenticatedLink.js","components/GarbageCansPage.js","components/ReportsPage.js","components/DocumentsPage.js","components/Title.js","components/EnvironmentalAdvisors.js","components/SupportContacts.js","components/HazardousWastePage.js","components/ContactPage.js","components/MessagesPage.js","components/ManagerPage.js","components/AdminPage.js","components/api-authorization/Unauthorized.js","components/api-authorization/AuthorizeRoute.js","components/api-authorization/Login.js","components/api-authorization/Logout.js","components/api-authorization/ApiAuthorizationRoutes.js","App.js","store.js","index.js","assets/19fa5f_a7e660fc997b43d6a570782c81390eaf_mv2.webp"],"names":["module","exports","MessageAlerts","messages","length","className","map","m","i","Alert","key","color","text","QueryParameterNames","LogoutActions","LoginActions","prefix","ApplicationPaths","DefaultLoginRedirectPath","ApiAuthorizationClientConfigurationUrl","ApiAuthorizationPrefix","Login","LoginFailed","LoginCallback","Register","Profile","LogOut","LoggedOut","LogOutCallback","IdentityRegisterPath","IdentityManagePath","messagesPath","managerPath","adminPath","authService","_callbacks","_nextSubscriptionId","_user","_isAuthenticated","_popUpDisabled","isCustomerRole","role","isAdminRole","isManagerOrAdminRole","isManagerOrAdminOrGroupCustomerRole","isGroupCustomerRole","this","getUser","user","getRole","getAccessToken","token","jwtData","split","decodedJwtJsonData","window","atob","decodedJwtData","JSON","parse","undefined","profile","ensureUserManagerInitialized","userManager","expired","signinSilent","state","silentUser","console","log","stringify","access_token","signOut","returnUrl","createArguments","updateState","success","Error","signinPopup","popUpUser","message","error","signinRedirect","redirect","url","signinCallback","signoutPopup","signoutRedirect","signoutCallback","response","data","notifySubscribers","callback","push","subscription","subscriptionId","subscriptionIndex","element","index","found","filter","splice","useReplaceToNavigate","status","AuthenticationResultStatus","Fail","Success","Redirect","fetch","ok","json","settings","automaticSilentRenew","includeIdTokenInSilentRenew","userStore","WebStorageStateStore","UserManager","events","addUserSignedOut","a","removeUser","LoginMenu","props","isAuthenticated","userName","isManagerOrAdmin","isAdmin","_subscription","subscribe","populateState","unsubscribe","Promise","all","setState","name","profilePath","logoutPath","pathname","local","authenticatedView","registerPath","loginPath","anonymousView","radius","NavItem","active","location","NavLink","tag","Link","to","Component","withRouter","NavMenu","toggleNavbar","bind","collapsed","Navbar","light","Container","NavbarBrand","alt","src","logo","style","width","marginTop","marginRight","display","NavbarToggler","onClick","Collapse","isOpen","navbar","displayName","connect","messageAlerts","dispatch","setMessageAlerts","type","children","fetchMessages","useCallback","useEffect","StartPage","position","image","bottom","right","Home","adminFetchCustomerNo","setAdminFetchCustomerNo","setCustomerNo","Form","onSubmit","e","preventDefault","customerNo","target","customerNumber","value","FormGroup","Label","for","Input","required","min","onChange","id","placeholder","Button","groupCustomerNumbers","setGroupCustomerNumbers","useState","loadingGroupCustomerNumbers","setLoadingGroupCustomerNumbers","fetchGroupCustomerNumbers","headers","size","margin","handleCustomerChange","g","ActiveOrdersListComponent","rentalObjects","activeOrders","r","orderMessageId","ListGroup","ActiveOrderComponent","bookingNumber","rentalObject","ContainerListComponent","ContainerComponent","messageId","rentalObjectStatus","setRentalObjectStatus","checkStatusCounter","setCheckStatusCounter","expanded","setExpanded","fetchRentalObjectStatus","manager","groupCustomer","queryStr","queryString","checkEmpty","str","replacement","test","timer","setInterval","clearInterval","ListGroupItem","href","Row","Col","locationAddress","xs","objectType","renBookingObjectContentDescr","locationPostaddress","locationPostCode","OrderStatusComponent","showOrderModal","setShowOrderModal","disabled","canOrder","CreateOrderModal","toggle","updateOrder","order","orderStatus","orderDate","date","action","received","orderNumber","OrderStatusText","Hemtagning","Tomning","orderBookingPerson","orderMessage","substring","orderCreatedDate","pickupDate","ConditionalWrapper","condition","wrapper","now","Date","earliestDate","setDate","getDate","getHours","oneweek","includeDates","start","end","arr","dt","x","getDay","getValidDates","setAction","notification","setNotification","orderClicked","setOrderClicked","orderDone","setOrderDone","orderError","setOrderError","setMessage","bookingPerson","setBookingPerson","getDateString","offsetMs","getTimezoneOffset","getTime","toISOString","slice","handleSubmit","newOrder","method","body","result","object","Modal","ModalHeader","ModalBody","selected","dateFormat","maxLength","check","checked","rentalObjectsCustomerNo","setRentalObjects","setRentalObjectsCustomerNo","fetching","setFetching","fetched","setFetched","fetchError","setFetchError","fetchRentalObjects","managerCustomerNumber","customerNeedsFetch","adminNeedsFetch","noRentalObjectsFound","customerName","AuthenticatedLink","filename","link","createRef","handleAction","current","endsWith","blob","URL","createObjectURL","download","click","ref","GarbageCanComponent","litteraKod","avsandare","hamtningsadress","karltyp","fraktion","service","garbageCans","garbageCansCustomerNo","setGarbageCans","setGarbageCansCustomerNo","fetchGarbageCans","noGarbageCansFound","ssrsReportName","Table","AdminFetchComponent","lastDayOfPreviousMonth","setMonth","getMonth","firstDayOfPreviousMonth","reports","setReports","selectedSsrsReportName","setSelectedSsrsReportName","selectedReport","setSelectedReport","fromDate","setFromDate","toDate","setToDate","fetchReports","setCurrentReport","reportNameSSRS","find","handleClick","reportQuery","useDates","decodeURIComponent","get","saveAs","minDate","DocumentList","documents","contracts","environmentDeclarations","sortilogs","controlReports","d","DocumentComponent","document","useUrl","documentId","rel","documentsCustomerNo","setDocuments","setDocumentsCustomerNo","fetchDocuments","noDocumentsFound","Title","title","bigTitle","advisors","setAdvisors","fetchAdvisors","email","SupportContacts","noHede","HazardousWastePage","ContactPage","colors","setMessages","loadingMessages","setLoadingMessages","setText","startDate","setStartDate","endDate","setEndDate","setColor","messageAdded","setMessageAdded","messageAddedError","setMessageAddedError","newMsg","deleteMessage","c","ManagerPage","customersToAdd","setCustomersToAdd","existingCustomers","setExistingCustomers","loadingCustomers","setLoadingCustomers","saveCustomerError","setSaveCustomerError","savingCustomer","setSavingCustomer","changeEmailError","setChangeEmailError","fetchCustomers","newUser","deleteUser","changeEmail","newEmail","CustomerComponent","customer","showDetails","setShowDetails","showChangeEmail","setShowChangeEmail","organizationNumber","groupCustomerOnly","CustomerDetailsComponent","CustomerChangeEmailComponent","fetchingDetails","setFetchingDetails","details","setDetails","setEmail","fetchCustomerDetails","emailInputField","CustomerDetailsWarning","warningMessages","toLowerCase","rentalObjectBookingNr","getBookingNumber","l","setNewEmail","AdminPage","users","setUsers","loadingUsers","setLoadingUsers","newUserEmail","setNewUserEmail","newUserRole","setNewUserRole","newCustomerNumbers","setNewCustomerNumbers","userAdded","setUserAdded","userAddedError","setUserAddedError","fetchUsers","replace","AddAdminComponent","u","ExistingAdminComponent","join","Unauthorized","AuthorizeRoute","ready","authenticated","authenticationChanged","populateAuthenticationState","createElement","path","protocol","host","search","hash","redirectUrl","encodeURIComponent","component","adminRole","managerOrAdminRole","rest","okAdminComponent","okManagerComponent","okCustomerComponent","render","login","getReturnUrl","processLoginCallback","URLSearchParams","redirectToProfile","redirectToRegister","signIn","navigateToReturnUrl","completeSignIn","fromQuery","startsWith","origin","redirectToApiAuthorizationPath","encodeURI","apiAuthorizationPath","Logout","isReady","history","logout","processLogoutCallback","completeSignOut","ApiAuthorizationRoutes","loginAction","logoutAction","registerLocale","sv","setDefaultLocale","App","exact","ContainersPage","GarbageCansPage","ReportsPage","DocumentsPage","MessagesPage","initialState","store","createStore","baseUrl","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","basename"],"mappings":"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","file":"static/js/main.f5d1ff52.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/19fa5f_154193d7f92f4af6b42b18d8799ff1de~mv2.472bfa8b.webp\";","import React from 'react';\r\nimport { Alert, } from 'reactstrap';\r\n\r\nfunction MessageAlerts({ messages }) {\r\n\r\n \r\n if (messages.length === 0) {\r\n return
;\r\n }\r\n\r\n return (\r\n
\r\n {\r\n messages.map((m, i) => {\r\n return {m.text};\r\n })\r\n }\r\n
\r\n ); \r\n \r\n \r\n}\r\nexport { MessageAlerts };","export const ApplicationName = 'LundstamsKundportal';\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 messagesPath: '/meddelanden',\r\n managerPath: '/kunder',\r\n adminPath: '/admin'\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 isCustomer() {\r\n const role = await this.getRole();\r\n return this.isCustomerRole(role);\r\n }\r\n\r\n async isAdmin() {\r\n const role = await this.getRole();\r\n return this.isAdminRole(role);\r\n }\r\n\r\n async isGroupCustomer() {\r\n const role = await this.getRole();\r\n return this.isGroupCustomerRole(role);\r\n }\r\n\r\n async isManagerOrAdmin() {\r\n const role = await this.getRole();\r\n return this.isManagerOrAdminRole(role);\r\n }\r\n\r\n async isManagerOrAdminOrGroupCustomer() {\r\n const role = await this.getRole();\r\n return this.isManagerOrAdminOrGroupCustomerRole(role);\r\n }\r\n\r\n async getRole() {\r\n const token = await this.getAccessToken();\r\n if (token) {\r\n let jwtData = token.split('.')[1];\r\n let decodedJwtJsonData = window.atob(jwtData);\r\n let decodedJwtData = JSON.parse(decodedJwtJsonData);\r\n return decodedJwtData.role;\r\n }\r\n return undefined;\r\n }\r\n\r\n isCustomerRole = role => {\r\n return role === 'Customer';\r\n }\r\n\r\n isAdminRole = role => {\r\n return role === 'Admin';\r\n }\r\n\r\n isManagerOrAdminRole = role => {\r\n return role === 'Manager' || role === 'Admin';\r\n }\r\n\r\n isManagerOrAdminOrGroupCustomerRole = role => {\r\n return role === 'Manager' || role === 'Admin' || role === 'GroupCustomer';\r\n }\r\n\r\n isGroupCustomerRole = role => {\r\n return role === 'GroupCustomer';\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 getAccessToken() {\r\n await this.ensureUserManagerInitialized();\r\n const user = await this.userManager.getUser();\r\n if (!user) {\r\n return null;\r\n }\r\n if (user.expired === true) {\r\n try {\r\n //Attempt to sign in our user silently\r\n const silentUser = await this.userManager.signinSilent({\r\n state: 'state'\r\n })\r\n console.log(\"Attempted silent login \" + JSON.stringify(silentUser));\r\n //Return refreshed access token\r\n return silentUser && silentUser.access_token\r\n } catch (err) {\r\n console.log(\"Silent login failed \" + JSON.stringify(err));\r\n await this.signOut({returnUrl: \"/\" } );\r\n }\r\n }\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('Popup disabled. Change \\'AuthorizeService.js:AuthorizeService._popupDisabled\\' to false to enable it.')\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('Popup disabled. Change \\'AuthorizeService.js:AuthorizeService._popupDisabled\\' to false to enable it.')\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() { return authService }\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 { withRouter } from 'react-router-dom';\r\nimport { Link } from 'react-router-dom';\r\nimport authService from './AuthorizeService';\r\nimport { ApplicationPaths } from './ApiAuthorizationConstants';\r\n\r\nclass LoginMenu 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 isManagerOrAdmin: false,\r\n isAdmin: false\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, isManagerOrAdmin, isAdmin] = await Promise.all([authService.isAuthenticated(), authService.getUser(), authService.isManagerOrAdmin(), authService.isAdmin()])\r\n this.setState({\r\n isAuthenticated,\r\n userName: user && user.name,\r\n isManagerOrAdmin,\r\n isAdmin\r\n });\r\n }\r\n\r\n render() {\r\n const { isAuthenticated, userName, isManagerOrAdmin, isAdmin } = 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 const messagesPath = `${ApplicationPaths.messagesPath}`;\r\n const managerPath = `${ApplicationPaths.managerPath}`;\r\n const adminPath = `${ApplicationPaths.adminPath}`;\r\n return this.authenticatedView(userName, profilePath, logoutPath, messagesPath, managerPath, adminPath, isManagerOrAdmin, isAdmin);\r\n }\r\n }\r\n\r\n authenticatedView(userName, profilePath, logoutPath, messagesPath, managerPath, adminPath, isManagerOrAdmin, isAdmin) {\r\n const radius = isManagerOrAdmin && !isAdmin ? 'right-radius' : '';\r\n return (\r\n {isManagerOrAdmin &&\r\n \r\n Meddelanden\r\n \r\n }\r\n {isManagerOrAdmin &&\r\n \r\n Kunder\r\n \r\n }\r\n {isAdmin &&\r\n \r\n Admin\r\n \r\n }\r\n {/*\r\n \r\n {userName}\r\n \r\n */}\r\n \r\n Logga ut\r\n \r\n );\r\n\r\n }\r\n\r\n anonymousView(registerPath, loginPath) {\r\n return (\r\n {/* \r\n Register\r\n */}\r\n \r\n Logga in\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withRouter(LoginMenu);","import React, { Component } from 'react';\r\nimport { Collapse, Container, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from 'reactstrap';\r\nimport { withRouter } from 'react-router';\r\nimport { Link } from 'react-router-dom';\r\nimport LoginMenu from './api-authorization/LoginMenu';\r\nimport './NavMenu.css';\r\nimport logo from '../assets/19fa5f_a7e660fc997b43d6a570782c81390eaf_mv2.webp';\r\n\r\n\r\nclass 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 };\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 render () {\r\n return (\r\n
\r\n \r\n \r\n \r\n \"Lundstams\"\r\n Kundportal\r\n \r\n \r\n \r\n
    \r\n \r\n Containrar\r\n \r\n \r\n Kärl\r\n \r\n \r\n Statistik\r\n \r\n \r\n Avtal och dokument\r\n \r\n \r\n Farligt avfall\r\n \r\n \r\n Kontakt\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 withRouter(NavMenu);","import React, { useCallback, useEffect } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { Container } from 'reactstrap';\r\nimport { MessageAlerts } from './MessageAlerts';\r\nimport NavMenu from './NavMenu';\r\n\r\nfunction Layout({ messages, setMessageAlerts, children }) {\r\n\r\n\r\n const fetchMessages = useCallback(async () => {\r\n const response = await fetch('api/Customer/GetMessages');\r\n const data = await response.json();\r\n setMessageAlerts(data);\r\n }, [setMessageAlerts])\r\n\r\n useEffect(() => {\r\n fetchMessages()\r\n }, [fetchMessages])\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {children}\r\n \r\n
\r\n );\r\n \r\n}\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n messages: state.messageAlerts\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n setMessageAlerts: data => dispatch({ type: 'MESSAGE_ALERTS', data })\r\n };\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Layout);\r\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport image from '../assets/19fa5f_154193d7f92f4af6b42b18d8799ff1de~mv2.webp';\r\nimport logo from '../assets/19fa5f_a7e660fc997b43d6a570782c81390eaf_mv2.webp';\r\n\r\n\r\nexport function StartPage() {\r\n\r\n return (\r\n
\r\n

Välkommen till Lundstams kundportal!

\r\n\r\n
\r\n\r\n
\r\n Här kan du:\r\n
    \r\n
  • Se och beställa tömning av dina containrar
  • \r\n
  • Se dina innehav av kärl
  • \r\n
  • Ta fram statistikrapporter
  • \r\n
  • Se dina avtal och andra dokument
  • \r\n
\r\n
\r\n\r\n
\r\n\r\n\r\n
\r\n \"Lundstams\"\r\n \"Lundstams\"\r\n
\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport { StartPage } from './StartPage';\r\n\r\nfunction Home() {\r\n\r\n\r\n return \r\n}\r\n\r\n\r\nexport { Home };","import React from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { Button, Form, FormGroup, Label, Input } from 'reactstrap';\r\n\r\nfunction AdminFetchComponent({ setCustomerNo, adminFetchCustomerNo, setAdminFetchCustomerNo }) {\r\n\r\n const handleFetch = e => {\r\n e.preventDefault();\r\n const customerNo = e.target.customerNumber.value;\r\n setCustomerNo(customerNo);\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n setAdminFetchCustomerNo(e.target.value)}\r\n id=\"customerNumber\"\r\n placeholder=\"Ange kundnummer\" />\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n adminFetchCustomerNo: state.adminFetchCustomerNo,\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n setAdminFetchCustomerNo: (data) => dispatch({ type: 'ADMIN_FETCH_CUSTOMER_NO', data }),\r\n };\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(AdminFetchComponent);\r\n\r\n","import React, { useCallback, useEffect, useState } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { FormGroup, Label, Input } from 'reactstrap';\r\nimport { BeatLoader } from 'react-spinners'; \r\n\r\nimport authService from './api-authorization/AuthorizeService';\r\n\r\nfunction GroupCustomerFetchComponent({ customerNo, setCustomerNo, groupCustomerNumbers, setGroupCustomerNumbers }) {\r\n\r\n const [loadingGroupCustomerNumbers, setLoadingGroupCustomerNumbers] = useState(false);\r\n\r\n const fetchGroupCustomerNumbers = useCallback(async () => {\r\n if (groupCustomerNumbers !== null) {\r\n return;\r\n }\r\n setLoadingGroupCustomerNumbers(true);\r\n const token = await authService.getAccessToken();\r\n const response = await fetch('api/Customer/GetGroupCustomerNumbers', {\r\n headers: { 'Authorization': `Bearer ${token}` }\r\n });\r\n const data = await response.json();\r\n setGroupCustomerNumbers(data);\r\n if (data.length > 0) {\r\n const customerNo = data[0].customerNumber;\r\n setCustomerNo(customerNo);\r\n }\r\n setLoadingGroupCustomerNumbers(false);\r\n }, [setCustomerNo, setLoadingGroupCustomerNumbers, setGroupCustomerNumbers])\r\n\r\n useEffect(() => {\r\n fetchGroupCustomerNumbers()\r\n }, [fetchGroupCustomerNumbers])\r\n\r\n const handleCustomerChange = customerNo => {\r\n setCustomerNo(customerNo);\r\n }\r\n\r\n return (\r\n
\r\n {\r\n loadingGroupCustomerNumbers &&\r\n \r\n }\r\n {\r\n !loadingGroupCustomerNumbers && groupCustomerNumbers !== null && groupCustomerNumbers.length > 0 &&\r\n \r\n \r\n handleCustomerChange(e.target.value)}\r\n id=\"customerNumber\">\r\n {\r\n groupCustomerNumbers.map(g => )\r\n }\r\n \r\n \r\n }\r\n
\r\n \r\n );\r\n}\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n groupCustomerNumbers: state.groupCustomerNumbers,\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n setGroupCustomerNumbers: (data) => dispatch({ type: 'GROUP_CUSTOMER_NUMBERS', data }),\r\n };\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(GroupCustomerFetchComponent);\r\n","import React, { useCallback, useEffect, useState } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { Alert, Button, Form, FormGroup, Label, Input, Modal, ModalBody, ModalHeader, Row, Col, ListGroup, ListGroupItem } from 'reactstrap';\r\nimport DatePicker from \"react-datepicker\";\r\nimport { BeatLoader } from 'react-spinners';\r\nimport queryString from 'query-string';\r\n\r\nimport authService from './api-authorization/AuthorizeService';\r\nimport AdminFetchComponent from './AdminFetchComponent';\r\nimport GroupCustomerFetchComponent from './GroupCustomerFetchComponent';\r\n\r\nfunction ContainersPage({ role, customerNo, setCustomerNo, rentalObjectsCustomerNo, setRentalObjectsCustomerNo, rentalObjects, setRentalObjects }) {\r\n\r\n const [fetching, setFetching] = useState(false);\r\n const [fetched, setFetched] = useState(false);\r\n const [fetchError, setFetchError] = useState('');\r\n\r\n const fetchRentalObjects = useCallback(async () => {\r\n if (authService.isManagerOrAdminOrGroupCustomerRole(role) && customerNo === '') {\r\n return;\r\n }\r\n setFetching(true);\r\n const token = await authService.getAccessToken();\r\n\r\n const managerCustomerNumber = authService.isManagerOrAdminOrGroupCustomerRole(role) ? `/${customerNo}` : '';\r\n const groupCustomer = authService.isGroupCustomerRole(role) ? 'GroupCustomer' : '';\r\n const url = `api/Customer/RentalObjects${groupCustomer}${managerCustomerNumber}`;\r\n console.log(\"url: \" + url)\r\n\r\n try {\r\n const response = await fetch(url, {\r\n headers: { 'Authorization': `Bearer ${token}` }\r\n });\r\n if (!response.ok) {\r\n throw new Error('Anrop misslyckades');\r\n }\r\n const data = await response.json();\r\n setRentalObjects(data);\r\n } catch (error) {\r\n setFetchError(error.message);\r\n }\r\n setFetching(false);\r\n setRentalObjectsCustomerNo(customerNo);\r\n setFetched(true);\r\n }, [role, customerNo, setRentalObjects, setRentalObjectsCustomerNo])\r\n\r\n useEffect(() => {\r\n const customerNeedsFetch = (rentalObjects === null && authService.isCustomerRole(role));\r\n const adminNeedsFetch = (authService.isManagerOrAdminOrGroupCustomerRole(role) && customerNo !== null && customerNo !== rentalObjectsCustomerNo);\r\n if (customerNeedsFetch || adminNeedsFetch) {\r\n fetchRentalObjects();\r\n }\r\n }, [fetchRentalObjects, customerNo, rentalObjectsCustomerNo, role, rentalObjects])\r\n\r\n/* DEBUGGING AID \r\n const compareInputs = (inputKeys, oldInputs, newInputs) => {\r\n inputKeys.forEach(key => {\r\n const oldInput = oldInputs[key];\r\n const newInput = newInputs[key];\r\n if (oldInput !== newInput) {\r\n console.log(\"change detected\", key, \"old:\", oldInput, \"new:\", newInput);\r\n }\r\n });\r\n };\r\n const useDependenciesDebugger = inputs => {\r\n const oldInputsRef = useRef(inputs);\r\n const inputValuesArray = Object.values(inputs);\r\n const inputKeysArray = Object.keys(inputs);\r\n useMemo(() => {\r\n const oldInputs = oldInputsRef.current;\r\n\r\n compareInputs(inputKeysArray, oldInputs, inputs);\r\n\r\n oldInputsRef.current = inputs;\r\n }, inputValuesArray); // eslint-disable-line react-hooks/exhaustive-deps\r\n };\r\n\r\n useDependenciesDebugger({ fetchRentalObjects, role, rentalObjects });\r\n END DEBUGGING AID */\r\n\r\n const noRentalObjectsFound = !fetching\r\n && rentalObjects !== null\r\n && rentalObjects.length === 0\r\n && fetched;\r\n\r\n return (\r\n
\r\n

Containrar

\r\n\r\n
\r\n {authService.isManagerOrAdminRole(role)\r\n && \r\n }\r\n\r\n {authService.isGroupCustomerRole(role)\r\n && \r\n }\r\n\r\n {fetching\r\n ?
Hämtar containrar...
\r\n :
\r\n {rentalObjects !== null && rentalObjects.length > 0 &&\r\n
\r\n

{rentalObjects[0].customerName}

\r\n
\r\n }\r\n \r\n \r\n
\r\n }\r\n {noRentalObjectsFound && !fetchError &&
Inga containrar hittades.
}\r\n {fetchError &&
{fetchError}
}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction ActiveOrdersListComponent({ rentalObjects, role, customerNo }) {\r\n // Hämtdatum\r\n // Beställningsdatum\r\n // Status\r\n // Beskrivning av container\r\n const activeOrders = rentalObjects === null ? [] : rentalObjects.filter(r => r.orderMessageId);\r\n return (\r\n
\r\n {activeOrders.length > 0 &&\r\n
\r\n
\r\n
Aktiva beställningar
\r\n
\r\n \r\n {activeOrders.map(r => )}\r\n \r\n
\r\n }\r\n
\r\n );\r\n}\r\n\r\nfunction ContainerListComponent({ rentalObjects, role, customerNo }) {\r\n return (\r\n
\r\n {rentalObjects !== null && rentalObjects.length > 0 &&\r\n
\r\n
\r\n
Innehav
\r\n
\r\n \r\n {rentalObjects.map(r => )}\r\n \r\n
\r\n }\r\n
\r\n );\r\n}\r\n\r\nfunction ActiveOrderComponent({ role, rentalObject: r, customerNo }) {\r\n\r\n const missingData = '';\r\n const messageId = r.orderMessageId;\r\n const [rentalObjectStatus, setRentalObjectStatus] = useState(null);\r\n const [checkStatusCounter, setCheckStatusCounter] = useState(0);\r\n const [expanded, setExpanded] = useState(true);\r\n\r\n const fetchRentalObjectStatus = useCallback(async () => {\r\n const token = await authService.getAccessToken();\r\n\r\n const manager = authService.isManagerOrAdminOrGroupCustomerRole(role) ? `Manager` : '';\r\n const groupCustomer = authService.isGroupCustomerRole(role) ? `GroupCustomer` : '';\r\n const queryStr = { messageId };\r\n if (authService.isGroupCustomerRole(role)) {\r\n queryStr.customerNumber = customerNo;\r\n }\r\n const url = `api/Customer/RentalObjectStatus${manager}${groupCustomer}?${queryString.stringify(queryStr)}`;\r\n\r\n const response = await fetch(url, {\r\n headers: { 'Authorization': `Bearer ${token}` }\r\n });\r\n const data = await response.json();\r\n setRentalObjectStatus(data);\r\n }, [role, messageId, customerNo])\r\n\r\n useEffect(() => {\r\n if (messageId) {\r\n fetchRentalObjectStatus();\r\n }\r\n }, [fetchRentalObjectStatus, messageId, customerNo, checkStatusCounter])\r\n\r\n useEffect(() => {\r\n const timer = setInterval(() => {\r\n setCheckStatusCounter(checkStatusCounter + 1);\r\n }, 15 * 1000);\r\n return () => clearInterval(timer);\r\n });\r\n\r\n function checkEmpty(str, replacement) {\r\n if (!str || /^\\s*$/.test(str)) {\r\n return replacement\r\n }\r\n return str;\r\n }\r\n\r\n function handleClick(e) {\r\n e.preventDefault();\r\n setExpanded(!expanded);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n Plats: {r.locationAddress}\r\n Typ: {checkEmpty(r.objectType, missingData)}\r\n Material: {checkEmpty(r.renBookingObjectContentDescr, missingData)}\r\n \r\n \r\n {expanded &&\r\n
\r\n \r\n Postadress: {checkEmpty(r.locationPostaddress, missingData)}\r\n \r\n \r\n Postnr: {checkEmpty(r.locationPostCode, missingData)}\r\n \r\n \r\n Hyresavtal: {r.bookingNumber}\r\n \r\n \r\n
\r\n }\r\n
\r\n )\r\n}\r\n\r\nfunction ContainerComponent({ role, rentalObject: r }) {\r\n\r\n const missingData = '';\r\n const [showOrderModal, setShowOrderModal] = useState(false);\r\n const toggle = () => setShowOrderModal(!showOrderModal);\r\n const [expanded, setExpanded] = useState(false);\r\n\r\n const updateOrder = order => {\r\n r.orderStatus = order.status;\r\n r.orderMessageId = order.messageId;\r\n r.orderDate = order.date;\r\n r.action = order.action;\r\n }\r\n\r\n function checkEmpty(str, replacement) {\r\n if (!str || /^\\s*$/.test(str)) {\r\n return replacement\r\n }\r\n return str;\r\n }\r\n\r\n function handleClick(e) {\r\n e.preventDefault();\r\n setExpanded(!expanded);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n Plats: {r.locationAddress}\r\n Typ: {checkEmpty(r.objectType, missingData)}\r\n Material: {checkEmpty(r.renBookingObjectContentDescr, missingData)}\r\n \r\n \r\n {expanded &&\r\n
\r\n \r\n Postadress: {checkEmpty(r.locationPostaddress, missingData)}\r\n \r\n \r\n Postnr: {checkEmpty(r.locationPostCode, missingData)}\r\n \r\n \r\n Hyresavtal: {r.bookingNumber}\r\n \r\n {!r.orderMessageId &&\r\n \r\n }\r\n\r\n {authService.isManagerOrAdminRole(role) && r.canOrder !== null &&
({r.canOrder})
}\r\n
\r\n }\r\n {showOrderModal &&\r\n \r\n }\r\n
\r\n )\r\n}\r\n\r\nfunction OrderStatusComponent({ r, rentalObjectStatus }) {\r\n\r\n const action = { Hemtagning: \"Återtagande\", Tomning: \"Tömning\" };\r\n if (!r.orderMessageId) {\r\n return null;\r\n }\r\n const received = rentalObjectStatus && rentalObjectStatus.orderNumber;\r\n return (\r\n
\r\n \r\n Status: {received ? rentalObjectStatus.status : r.OrderStatusText ? r.OrderStatusText : 'Inskickad'}\r\n Åtgärd: {action[r.action]}\r\n \r\n \r\n Namn på beställare: {r.orderBookingPerson}\r\n Meddelande: {r.orderMessage}\r\n \r\n {\r\n !received &&\r\n <>\r\n \r\n Hämtdatum: {r.orderDate.substring(0, 10)}\r\n Beställningsdatum: {r.orderCreatedDate.substring(0, 10)}\r\n \r\n \r\n }\r\n {\r\n received &&\r\n <>\r\n \r\n Hämtdatum: {rentalObjectStatus.pickupDate?.substring(0, 10)}\r\n Beställningsdatum: {r.orderCreatedDate.substring(0, 10)}\r\n \r\n \r\n Ordernr: {rentalObjectStatus.orderNumber}\r\n \r\n \r\n }\r\n
\r\n );\r\n}\r\n\r\nfunction ConditionalWrapper({ condition, wrapper, children }) {\r\n return condition ? wrapper(children) : children;\r\n}\r\n\r\nfunction CreateOrderModal({ rentalObject: r, isOpen, toggle, updateOrder }) {\r\n\r\n const getValidDates = function (start, end) {\r\n for (var arr = [], dt = new Date(start); dt <= end; dt.setDate(dt.getDate() + 1)) {\r\n arr.push(new Date(dt));\r\n }\r\n return arr.filter(x => x.getDay() > 0 && x.getDay() < 6); // Remove Sunday och Saturday\r\n }\r\n\r\n const now = new Date();\r\n const earliestDate = new Date();\r\n earliestDate.setDate(now.getDate() + 1);\r\n if (now.getHours() >= 12) {\r\n earliestDate.setDate(now.getDate() + 2);\r\n }\r\n const oneweek = now;\r\n oneweek.setDate(now.getDate() + 7);\r\n const includeDates = getValidDates(earliestDate, oneweek);\r\n\r\n const [action, setAction] = useState('Tomning');\r\n const [date, setDate] = useState(earliestDate);\r\n const [notification, setNotification] = useState(false);\r\n const [orderClicked, setOrderClicked] = useState(false);\r\n const [orderDone, setOrderDone] = useState(false);\r\n const [orderError, setOrderError] = useState(null);\r\n const [message, setMessage] = useState('');\r\n const [bookingPerson, setBookingPerson] = useState('');\r\n\r\n const getDateString = date => {\r\n if (date === null || date === '') {\r\n return null;\r\n }\r\n const offsetMs = date.getTimezoneOffset() * 60 * 1000;\r\n const dateLocal = new Date(date.getTime() - offsetMs);\r\n const str = dateLocal.toISOString().slice(0, 19);\r\n return str;\r\n }\r\n\r\n const handleSubmit = async e => {\r\n e.preventDefault();\r\n setOrderClicked(true);\r\n\r\n const token = await authService.getAccessToken();\r\n const newOrder = { action, date: getDateString(date), bookingNumber: r.bookingNumber, notification, message, bookingPerson };\r\n try {\r\n const response = await fetch('api/Customer/CreateOrder', {\r\n method: 'POST',\r\n body: JSON.stringify(newOrder),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Anrop misslyckades. ${response.status}`);\r\n }\r\n const data = await response.json();\r\n if (!data.success) {\r\n throw new Error(data.result);\r\n }\r\n setOrderDone(true);\r\n setOrderError(null);\r\n updateOrder(data.object);\r\n } catch (error) {\r\n setOrderError(error.message);\r\n }\r\n }\r\n\r\n return (\r\n \r\n {r.locationAddress} - {r.objectType} - {r.renBookingObjectContentDescr}\r\n\r\n \r\n {!orderDone && !orderError &&\r\n
handleSubmit(e, r.bookingNumber, action, date)}>\r\n\r\n \r\n \r\n setAction(e.target.value)}\r\n id=\"addAction\">\r\n \r\n \r\n \r\n \r\n \r\n \r\n setDate(date)}\r\n dateFormat='yyyy-MM-dd'\r\n />\r\n \r\n \r\n \r\n setBookingPerson(e.target.value)}\r\n id=\"addBookingPerson\" />\r\n \r\n \r\n \r\n setMessage(e.target.value)}\r\n id=\"addMessage\" />\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n {orderClicked && !orderDone && !orderError &&\r\n
\r\n }\r\n
\r\n }\r\n {orderDone && !orderError &&\r\n
Beställning har skickats
\r\n }\r\n {orderError &&\r\n {orderError}\r\n }\r\n {(orderDone || orderError) &&\r\n \r\n }\r\n
\r\n
\r\n )\r\n}\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n rentalObjects: state.rentalObjects,\r\n customerNo: state.customerNo,\r\n rentalObjectsCustomerNo: state.rentalObjectsCustomerNo,\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n setRentalObjects: (data) => dispatch({ type: 'RENTAL_OBJECTS', data }),\r\n setCustomerNo: (data) => dispatch({ type: 'CUSTOMER_NO', data }),\r\n setRentalObjectsCustomerNo: (data) => dispatch({ type: 'RENTAL_OBJECTS_CUSTOMER_NO', data }),\r\n };\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ContainersPage);\r\n","import React, { createRef } from 'react';\r\nimport authService from './api-authorization/AuthorizeService';\r\n\r\nexport function AuthenticatedLink({ url, filename, children }) {\r\n const link = createRef()\r\n\r\n const handleAction = async (e) => {\r\n if (!link.current.href.endsWith('/#')) {\r\n return\r\n }\r\n e.preventDefault();\r\n const token = await authService.getAccessToken();\r\n const result = await fetch(url, {\r\n headers: { 'Authorization': `Bearer ${token}` }\r\n })\r\n\r\n const blob = await result.blob()\r\n const href = window.URL.createObjectURL(blob)\r\n\r\n link.current.download = filename\r\n link.current.href = href\r\n\r\n link.current.click()\r\n }\r\n\r\n return (\r\n <>\r\n {children}\r\n \r\n )\r\n}","import React, { useCallback, useEffect, useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { connect } from 'react-redux';\r\nimport { Table } from 'reactstrap';\r\nimport { BeatLoader } from 'react-spinners';\r\nimport queryString from 'query-string';\r\n\r\nimport { AuthenticatedLink } from './AuthenticatedLink';\r\nimport authService from './api-authorization/AuthorizeService';\r\nimport AdminFetchComponent from './AdminFetchComponent';\r\nimport GroupCustomerFetchComponent from './GroupCustomerFetchComponent';\r\n\r\nfunction GarbageCansPage({ role, customerNo, setCustomerNo, garbageCansCustomerNo, setGarbageCansCustomerNo, garbageCans, setGarbageCans }) {\r\n\r\n const [fetching, setFetching] = useState(false);\r\n const [fetched, setFetched] = useState(false);\r\n const [fetchError, setFetchError] = useState('');\r\n\r\n const fetchGarbageCans = useCallback(async () => {\r\n if (authService.isManagerOrAdminOrGroupCustomerRole(role) && customerNo === '') {\r\n return;\r\n }\r\n setFetching(true);\r\n const token = await authService.getAccessToken();\r\n\r\n const managerCustomerNumber = authService.isManagerOrAdminOrGroupCustomerRole(role) ? `/${customerNo}` : '';\r\n const groupCustomer = authService.isGroupCustomerRole(role) ? 'GroupCustomer' : '';\r\n const url = `api/Customer/GarbageCans${groupCustomer}${managerCustomerNumber}`;\r\n\r\n try {\r\n const response = await fetch(url, {\r\n headers: { 'Authorization': `Bearer ${token}` }\r\n });\r\n if (!response.ok) {\r\n throw new Error('Anrop misslyckades');\r\n }\r\n const data = await response.json();\r\n setGarbageCans(data);\r\n } catch (error) {\r\n setFetchError(error.message);\r\n console.log(\"Anrop fel \" + error.message);\r\n }\r\n setFetching(false);\r\n setGarbageCansCustomerNo(customerNo);\r\n setFetched(true);\r\n }, [role, customerNo, setGarbageCans, setGarbageCansCustomerNo])\r\n\r\n useEffect(() => {\r\n const customerNeedsFetch = (garbageCans === null && authService.isCustomerRole(role));\r\n const adminNeedsFetch = (authService.isManagerOrAdminOrGroupCustomerRole(role) && customerNo !== null && customerNo !== garbageCansCustomerNo);\r\n if (customerNeedsFetch || adminNeedsFetch) {\r\n fetchGarbageCans();\r\n }\r\n }, [fetchGarbageCans, customerNo, garbageCansCustomerNo, role, garbageCans])\r\n\r\n \r\n\r\n const noGarbageCansFound = !fetching\r\n && garbageCans !== null\r\n && garbageCans.length === 0\r\n && fetched;\r\n\r\n const reportQuery = { ssrsReportName: 'Kärl med schema' };\r\n const managerCustomerNumber = authService.isManagerOrAdminRole(role) ? `/${customerNo}` : '';\r\n const url = `/api/Customer/CreateReport${managerCustomerNumber}?${queryString.stringify(reportQuery)}`;\r\n\r\n return (\r\n
\r\n

Kärl

\r\n\r\n
\r\n Kontakta ditt lokala kontor för beställning.\r\n
\r\n
\r\n Förklaring till kolumnen service:\r\n
    \r\n
  • (14) Siffra inom parentes anger antal dagar mellan varje tömning
  • \r\n
  • Udda/Jämn anger att tömning sker udda respektive jämn vecka
  • \r\n
  • Budas betyder att du får ringa in när du vill ha tömning
  • \r\n
\r\n
\r\n\r\n
\r\n {authService.isManagerOrAdminRole(role)\r\n && \r\n }\r\n\r\n {authService.isGroupCustomerRole(role)\r\n && \r\n }\r\n\r\n {fetching\r\n ?
Hämtar kärl...
\r\n :
\r\n {garbageCans !== null && garbageCans.length > 0 &&\r\n <>\r\n

{garbageCans[0].customerName}

\r\n\r\n
\r\n
    \r\n
  • Spara som Excel-fil
  • \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 {garbageCans.map((r, i) => )}\r\n \r\n
Littera/arbetsplatsAvsändareHämtas adressKärltypFraktionService
\r\n \r\n }\r\n
\r\n }\r\n {noGarbageCansFound && !fetchError &&
Inga kärl hittades.
}\r\n {fetchError &&
{fetchError}
}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction GarbageCanComponent({ rentalObject: r }) {\r\n\r\n const missingData = '';\r\n\r\n function checkEmpty(str, replacement) {\r\n if (!str || /^\\s*$/.test(str)) {\r\n return replacement\r\n }\r\n return str;\r\n }\r\n\r\n return (\r\n \r\n {r.litteraKod}\r\n {checkEmpty(r.avsandare, missingData)}\r\n {checkEmpty(r.hamtningsadress, missingData)}\r\n {checkEmpty(r.karltyp, missingData)}\r\n {checkEmpty(r.fraktion, missingData)}\r\n {checkEmpty(r.service, 'Budas')}\r\n \r\n )\r\n}\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n garbageCans: state.garbageCans,\r\n customerNo: state.customerNo,\r\n garbageCansCustomerNo: state.garbageCansCustomerNo,\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n setGarbageCans: (data) => dispatch({ type: 'GARBAGE_CANS', data }),\r\n setCustomerNo: (data) => dispatch({ type: 'CUSTOMER_NO', data }),\r\n setGarbageCansCustomerNo: (data) => dispatch({ type: 'GARBAGE_CANS_CUSTOMER_NO', data }),\r\n };\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(GarbageCansPage);\r\n","import React, { useCallback, useEffect, useState } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { Button, Form, FormGroup, Label, Input } from 'reactstrap';\r\nimport DatePicker from \"react-datepicker\";\r\nimport { BeatLoader } from 'react-spinners';\r\nimport queryString from 'query-string';\r\nimport { saveAs } from 'file-saver';\r\n\r\nimport authService from './api-authorization/AuthorizeService';\r\n\r\nimport \"react-datepicker/dist/react-datepicker.css\";\r\nimport GroupCustomerFetchComponent from './GroupCustomerFetchComponent';\r\n\r\n\r\nfunction ReportsPage({ role, customerNo, setCustomerNo }) {\r\n\r\n const lastDayOfPreviousMonth = new Date();\r\n lastDayOfPreviousMonth.setMonth(lastDayOfPreviousMonth.getMonth(), 0);\r\n const firstDayOfPreviousMonth = new Date();\r\n firstDayOfPreviousMonth.setDate(1);\r\n firstDayOfPreviousMonth.setMonth(firstDayOfPreviousMonth.getMonth() - 1);\r\n\r\n const [reports, setReports] = useState([]);\r\n const [selectedSsrsReportName, setSelectedSsrsReportName] = useState('');\r\n const [selectedReport, setSelectedReport] = useState({});\r\n const [fromDate, setFromDate] = useState(firstDayOfPreviousMonth);\r\n const [toDate, setToDate] = useState(lastDayOfPreviousMonth);\r\n const [fetching, setFetching] = useState(false);\r\n const [fetchError, setFetchError] = useState('');\r\n\r\n //const link = createRef();\r\n\r\n const fetchReports = useCallback(async () => {\r\n setFetching(true);\r\n const token = await authService.getAccessToken();\r\n const response = await fetch('api/Customer/GetReportTypes', {\r\n headers: { 'Authorization': `Bearer ${token}` }\r\n });\r\n const data = await response.json();\r\n //console.log(JSON.stringify(data));\r\n setReports(data);\r\n setCurrentReport(data, data[0].reportNameSSRS);\r\n setFetching(false);\r\n }, [])\r\n\r\n const setCurrentReport = (reports, ssrsReportName) => {\r\n setSelectedSsrsReportName(ssrsReportName);\r\n setSelectedReport(reports.find(r => r.reportNameSSRS === ssrsReportName));\r\n }\r\n\r\n useEffect(() => {\r\n fetchReports()\r\n }, [fetchReports])\r\n\r\n const handleClick = async e => {\r\n e.preventDefault();\r\n setFetchError('');\r\n\r\n const token = await authService.getAccessToken();\r\n const reportQuery = { ssrsReportName: selectedSsrsReportName };\r\n if (selectedReport.useDates) {\r\n reportQuery.fromDate = fromDate.toISOString().slice(0, 10);\r\n reportQuery.toDate = toDate.toISOString().slice(0, 10);\r\n }\r\n const managerCustomerNumber = authService.isManagerOrAdminOrGroupCustomerRole(role) ? `/${customerNo}` : '';\r\n const groupCustomer = authService.isGroupCustomerRole(role) ? 'GroupCustomer' : '';\r\n const url = `api/Customer/CreateReport${groupCustomer}${managerCustomerNumber}?${queryString.stringify(reportQuery)}`;\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Anrop misslyckades.`);\r\n }\r\n const data = await response.blob();\r\n\r\n const filename = decodeURIComponent(response.headers.get('Content-Disposition').split(\"filename*=UTF-8''\")[1]);\r\n saveAs(data, filename);\r\n } catch (error) {\r\n setFetchError(error.message);\r\n }\r\n }\r\n\r\n return (\r\n
\r\n

Statistik

\r\n {reports && reports.length > 0 &&\r\n

{reports[0].customerName}

\r\n }\r\n\r\n
\r\n {authService.isManagerOrAdminRole(role)\r\n && }\r\n\r\n\r\n {authService.isGroupCustomerRole(role)\r\n && \r\n }\r\n\r\n {fetching\r\n ? \r\n : \r\n \r\n setCurrentReport(reports, e.target.value)}\r\n id=\"report\">\r\n {reports.map(r => )}\r\n \r\n \r\n }\r\n {selectedReport && selectedReport.useDates &&\r\n <>\r\n \r\n \r\n setFromDate(date)}\r\n dateFormat='yyyy-MM-dd'\r\n />\r\n \r\n \r\n \r\n setToDate(date)}\r\n dateFormat='yyyy-MM-dd'\r\n />\r\n \r\n \r\n }\r\n \r\n {/* Hämta */}\r\n {fetchError &&
{fetchError}
}\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction AdminFetchComponent({ customerNo, setCustomerNo }) {\r\n\r\n return (\r\n \r\n \r\n setCustomerNo(e.target.value)}\r\n id=\"customerNumber\"\r\n placeholder=\"Ange kundnummer\" />\r\n \r\n )\r\n}\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n customerNo: state.customerNo,\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n setCustomerNo: (data) => dispatch({ type: 'CUSTOMER_NO', data }),\r\n };\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(ReportsPage);\r\n","import React, { useCallback, useEffect, useState } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { BeatLoader } from 'react-spinners';\r\nimport queryString from 'query-string';\r\n\r\nimport { AuthenticatedLink } from './AuthenticatedLink';\r\nimport authService from './api-authorization/AuthorizeService';\r\nimport AdminFetchComponent from './AdminFetchComponent';\r\nimport GroupCustomerFetchComponent from './GroupCustomerFetchComponent';\r\n\r\nfunction DocumentsPage({ role, customerNo, setCustomerNo, documentsCustomerNo, setDocumentsCustomerNo, documents, setDocuments }) {\r\n\r\n const [fetching, setFetching] = useState(false);\r\n const [fetched, setFetched] = useState(false);\r\n const [fetchError, setFetchError] = useState('');\r\n\r\n const fetchDocuments = useCallback(async () => {\r\n if (authService.isManagerOrAdminOrGroupCustomerRole(role) && customerNo === '') {\r\n return;\r\n }\r\n setFetching(true);\r\n const token = await authService.getAccessToken();\r\n\r\n const managerCustomerNumber = authService.isManagerOrAdminOrGroupCustomerRole(role) ? `/${customerNo}` : '';\r\n const groupCustomer = authService.isGroupCustomerRole(role) ? 'GroupCustomer' : '';\r\n const url = `api/Customer/Documents${groupCustomer}${managerCustomerNumber}`;\r\n\r\n try {\r\n const response = await fetch(url, {\r\n headers: { 'Authorization': `Bearer ${token}` }\r\n });\r\n if (!response.ok) {\r\n throw new Error('Anrop misslyckades');\r\n }\r\n const data = await response.json();\r\n\r\n setDocuments(data);\r\n } catch (error) {\r\n setFetchError(error.message);\r\n }\r\n setFetching(false);\r\n setDocumentsCustomerNo(customerNo);\r\n setFetched(true);\r\n }, [role, customerNo, setDocuments, setDocumentsCustomerNo])\r\n\r\n useEffect(() => {\r\n const customerNeedsFetch = (documents === null && authService.isCustomerRole(role));\r\n const adminNeedsFetch = (authService.isManagerOrAdminOrGroupCustomerRole(role) && customerNo !== null && customerNo !== documentsCustomerNo);\r\n if (customerNeedsFetch || adminNeedsFetch) {\r\n fetchDocuments();\r\n }\r\n }, [fetchDocuments, customerNo, documentsCustomerNo, role, documents])\r\n\r\n const noDocumentsFound = !fetching\r\n && documents !== null\r\n && documents.length === 0\r\n && fetched;\r\n\r\n return (\r\n
\r\n

Avtal och dokument

\r\n
\r\n Miljötillstånd hittar du på Lundstams hemsida.\r\n
\r\n\r\n {authService.isManagerOrAdminRole(role)\r\n && \r\n }\r\n\r\n {authService.isGroupCustomerRole(role)\r\n && \r\n }\r\n\r\n {fetching\r\n ?
Hämtar avtal och dokument...
\r\n : \r\n }\r\n {noDocumentsFound && !fetchError &&
Inga avtal eller dokument hittades.
}\r\n {fetchError &&
{fetchError}
}\r\n\r\n
\r\n );\r\n}\r\n\r\nfunction DocumentList({ role, documents, customerNo }) {\r\n const contracts = documents === null ? [] : documents.filter(x => x.type === 'Avtal');\r\n const environmentDeclarations = documents === null ? [] : documents.filter(x => x.type === 'Miljodeklaration');\r\n const sortilogs = documents === null ? [] : documents.filter(x => x.type === 'Sortilog');\r\n const controlReports = documents === null ? [] : documents.filter(x => x.type === 'KontrollRapport');\r\n return (\r\n
\r\n {documents !== null && documents.length > 0 &&\r\n

{documents[0].customerName}

\r\n }\r\n {contracts.length > 0 &&\r\n <>\r\n

Avtal

\r\n
    \r\n {contracts.map(d => )}\r\n
\r\n \r\n }\r\n {sortilogs.length > 0 &&\r\n <>\r\n

Sortiloger

\r\n
    \r\n {sortilogs.map(d => )}\r\n
\r\n \r\n }\r\n {controlReports.length > 0 &&\r\n <>\r\n

Besiktningsdokument

\r\n
    \r\n {controlReports.map(d => )}\r\n
\r\n \r\n }\r\n {environmentDeclarations.length > 0 &&\r\n <>\r\n

Transportdokument (farligt avfall och farligt gods)

\r\n
    \r\n {environmentDeclarations.map(d => )}\r\n
\r\n \r\n }\r\n\r\n
\r\n )\r\n}\r\n\r\nfunction DocumentComponent({ role, document: d, customerNo, useUrl }) {\r\n\r\n const manager = authService.isManagerOrAdminOrGroupCustomerRole(role) ? `Manager` : '';\r\n const groupCustomer = authService.isGroupCustomerRole(role) ? `GroupCustomer` : '';\r\n const queryStr = authService.isGroupCustomerRole(role) ? queryString.stringify({ customerNumber: customerNo }) : '';\r\n\r\n const url = `/api/Customer/Document${manager}${groupCustomer}/${d.documentId}${queryStr}`;\r\n\r\n return (\r\n
  • \r\n { useUrl\r\n ? {d.name}\r\n : {d.name}\r\n } \r\n
  • \r\n )\r\n}\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n documents: state.documents,\r\n customerNo: state.customerNo,\r\n documentsCustomerNo: state.documentsCustomerNo,\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n setDocuments: (data) => dispatch({ type: 'DOCUMENTS', data }),\r\n setCustomerNo: (data) => dispatch({ type: 'CUSTOMER_NO', data }),\r\n setDocumentsCustomerNo: (data) => dispatch({ type: 'DOCUMENTS_CUSTOMER_NO', data }),\r\n };\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(DocumentsPage);\r\n","import React from 'react';\r\n\r\nexport function Title({ title, bigTitle }) {\r\n if (bigTitle) {\r\n return
    {title}
    \r\n }\r\n return
    \r\n {title}\r\n
    \r\n}\r\n\r\n\r\n\r\n","import React, { useCallback, useEffect, useState } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport { BeatLoader } from 'react-spinners';\r\nimport authService from './api-authorization/AuthorizeService';\r\nimport { Title } from './Title';\r\n\r\nexport function EnvironmentalAdvisors({ advisors, setAdvisors, title, bigTitle }) {\r\n\r\n const [fetching, setFetching] = useState(false);\r\n\r\n const fetchAdvisors = useCallback(async () => {\r\n if (advisors && advisors.length === 0) {\r\n setFetching(true);\r\n const token = await authService.getAccessToken();\r\n const response = await fetch('api/Customer/GetAdvisors', {\r\n headers: { 'Authorization': `Bearer ${token}` }\r\n });\r\n const data = await response.json();\r\n setAdvisors(data);\r\n setFetching(false);\r\n }\r\n }, [advisors, setAdvisors])\r\n\r\n useEffect(() => {\r\n fetchAdvisors()\r\n }, [fetchAdvisors])\r\n\r\n return (\r\n <>\r\n \r\n {fetching\r\n ? <BeatLoader size={15} margin={2} />\r\n : <div className=\"margin-top-bottom\">\r\n <ul>\r\n {advisors && advisors.map((x,i) => <li key={i}>{x.name}<br />Epost: <a href={\"mailto:\" + x.email} className=\"href-link\">{x.email}</a></li>)}\r\n </ul>\r\n </div>\r\n } \r\n </>\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n advisors: state.advisors\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n setAdvisors: (data) => dispatch({ type: 'ADVISORS', data })\r\n };\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(EnvironmentalAdvisors);\r\n\r\n\r\n","import React from 'react';\r\nimport { Title } from './Title';\r\n\r\nexport function SupportContacts({ bigTitle, title, noHede }) {\r\n\r\n return (\r\n <div className=\"margin-top-bottom\">\r\n <div className=\"margin-top-bottom\">\r\n <h4>{title}</h4>\r\n </div>\r\n <Title bigTitle={true} title=\"Östersund\" />\r\n <div className=\"margin-top-bottom\">\r\n <div className=\"margin-top-bottom\">\r\n <ul>\r\n <li>\r\n Epost: <a href=\"mailto:info.osd@lundstams.se\" className=\"href-link\">info.osd@lundstams.se</a>\r\n <br />\r\n Telefon: 063-576060\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <Title bigTitle={bigTitle} title=\"Åre\" />\r\n <div className=\"margin-top-bottom\">\r\n <div className=\"margin-top-bottom\">\r\n <ul>\r\n <li>\r\n Epost: <a href=\"mailto:info.are@lundstams.se\" className=\"href-link\">info.are@lundstams.se</a>\r\n <br />\r\n Telefon: 0647-31042\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n <Title bigTitle={bigTitle} title=\"Umeå\" />\r\n <div className=\"margin-top-bottom\">\r\n <div className=\"margin-top-bottom\">\r\n <ul>\r\n <li>\r\n Epost: <a href=\"mailto:info.umea@lundstams.se\" className=\"href-link\">info.umea@lundstams.se</a>\r\n <br />\r\n Telefon: 090-133500\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n {!noHede &&\r\n <div>\r\n <Title bigTitle={bigTitle} title=\"Hede\" />\r\n <div className=\"margin-top-bottom\">\r\n <div className=\"margin-top-bottom\">\r\n <ul>\r\n <li>\r\n Epost: <a href=\"mailto:info.hede@lundstams.se\" className=\"href-link\">info.hede@lundstams.se</a>\r\n <br />\r\n Telefon: 0684-10277\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n );\r\n}\r\n\r\n","import React from 'react';\r\nimport EnvironmentalAdvisors from './EnvironmentalAdvisors';\r\nimport { SupportContacts } from './SupportContacts';\r\n\r\nfunction HazardousWastePage() {\r\n\r\n return (\r\n <div>\r\n <h1>Farligt avfall</h1>\r\n <SupportContacts title=\"Vid beställning kontakta ditt lokala kontor:\" bigTitle noHede />\r\n\r\n <EnvironmentalAdvisors title=\"För rådgivning gällande farligt avfall kontakta din miljörådgivare:\" bigTitle />\r\n\r\n </div>\r\n );\r\n}\r\n\r\nexport default HazardousWastePage;\r\n","import React from 'react';\r\nimport EnvironmentalAdvisors from './EnvironmentalAdvisors';\r\nimport { SupportContacts } from './SupportContacts';\r\n\r\nfunction ContactPage() {\r\n\r\n return (\r\n <div>\r\n <h1>Kontakta Lundstams</h1>\r\n\r\n <div className=\"margin-top-bottom\">\r\n <SupportContacts bigTitle />\r\n </div>\r\n\r\n\r\n <div className=\"margin-top-bottom\">\r\n <EnvironmentalAdvisors bigTitle />\r\n </div>\r\n\r\n\r\n </div>\r\n );\r\n}\r\n\r\nexport default ContactPage;\r\n","import React, { useCallback, useEffect, useState } from 'react';\r\nimport { Alert, Button, Form, FormGroup, Label, Input } from 'reactstrap';\r\nimport { connect } from 'react-redux';\r\nimport DatePicker from \"react-datepicker\";\r\nimport { BeatLoader } from 'react-spinners';\r\nimport queryString from 'query-string';\r\n\r\nimport authService from './api-authorization/AuthorizeService';\r\n\r\n\r\nfunction MessagesPage({ setMessageAlerts }) {\r\n\r\n const colors = [{ value: 'primary', text: 'Blå' }, { value: 'success', text: 'Grön' }, { value: 'secondary', text: 'Grå' }, { value: 'warning', text: 'Gul' }, { value: 'danger', text: 'Röd' }];\r\n const [messages, setMessages] = useState([]);\r\n const [loadingMessages, setLoadingMessages] = useState(false);\r\n const [text, setText] = useState('');\r\n const [startDate, setStartDate] = useState('');\r\n const [endDate, setEndDate] = useState('');\r\n const [color, setColor] = useState(colors[0].value);\r\n const [messageAdded, setMessageAdded] = useState('');\r\n const [messageAddedError, setMessageAddedError] = useState('');\r\n\r\n\r\n const fetchMessages = useCallback(async () => {\r\n setLoadingMessages(true);\r\n const token = await authService.getAccessToken();\r\n const response = await fetch('api/Manager/GetMessages', {\r\n headers: { 'Authorization': `Bearer ${token}` }\r\n });\r\n const data = await response.json();\r\n setMessages(data);\r\n setMessageAlerts(data);\r\n setLoadingMessages(false);\r\n }, [setMessageAlerts])\r\n\r\n useEffect(() => {\r\n fetchMessages()\r\n }, [fetchMessages])\r\n\r\n const getDateString = date => {\r\n if (date === null || date === '') {\r\n return null;\r\n }\r\n const offsetMs = date.getTimezoneOffset() * 60 * 1000;\r\n const dateLocal = new Date(date.getTime() - offsetMs);\r\n const str = dateLocal.toISOString().slice(0, 10);\r\n console.log(date + \" _-- \" + str);\r\n return str;\r\n }\r\n\r\n const handleSubmit = async (e, ) => {\r\n e.preventDefault();\r\n\r\n const token = await authService.getAccessToken();\r\n const newMsg = { text, color, startDate: getDateString(startDate), endDate: getDateString(endDate) };\r\n try {\r\n const response = await fetch('api/Manager/AddNewMessage', {\r\n method: 'POST',\r\n body: JSON.stringify(newMsg),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Anrop misslyckades. ${response.status}`);\r\n }\r\n const data = await response.json();\r\n if (!data.success) {\r\n throw new Error(data.result);\r\n }\r\n setMessageAdded(data.object);\r\n setMessageAddedError(null);\r\n setText('');\r\n setStartDate('');\r\n setEndDate('');\r\n\r\n fetchMessages();\r\n } catch (error) {\r\n setMessageAdded('');\r\n setMessageAddedError(error.message);\r\n }\r\n }\r\n\r\n const deleteMessage = async id => {\r\n const token = await authService.getAccessToken();\r\n const reportQuery = { id };\r\n const url = `api/Manager/DeleteMessage?${queryString.stringify(reportQuery)}`;\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'DELETE',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Anrop misslyckades. ${response.status}`);\r\n }\r\n const data = await response.json();\r\n if (!data.success) {\r\n throw new Error(data.result);\r\n }\r\n\r\n fetchMessages();\r\n console.log(`Message deleted ok ${id}`)\r\n } catch (error) {\r\n console.log(`Message delete failed ${error.message}`)\r\n }\r\n }\r\n\r\n return (\r\n <div>\r\n <h1>Meddelanden</h1>\r\n\r\n\r\n <h4>Lägg till meddelande</h4>\r\n <div>\r\n <Form onSubmit={handleSubmit}>\r\n\r\n <FormGroup>\r\n <Label for=\"addText\">Meddelande:</Label>\r\n <Input\r\n required\r\n type=\"text\"\r\n name=\"text\"\r\n value={text}\r\n onChange={e => setText(e.target.value)}\r\n id=\"addText\"\r\n placeholder=\"\" />\r\n </FormGroup>\r\n\r\n <FormGroup>\r\n <Label for=\"startDate\">Startdatum:</Label>\r\n <DatePicker\r\n className='form-control'\r\n id=\"startDate\"\r\n selected={startDate}\r\n onChange={date => setStartDate(date)}\r\n dateFormat='yyyy-MM-dd'\r\n />\r\n </FormGroup>\r\n <FormGroup>\r\n <Label for=\"endDate\">Slutdatum:</Label>\r\n <DatePicker\r\n className='form-control'\r\n id=\"endDate\"\r\n selected={endDate}\r\n minDate={startDate}\r\n onChange={date => setEndDate(date)}\r\n dateFormat='yyyy-MM-dd'\r\n />\r\n </FormGroup>\r\n <FormGroup>\r\n <Label for=\"report\">Färg:</Label>\r\n <Input\r\n type=\"select\"\r\n name=\"select\"\r\n value={color}\r\n onChange={e => setColor(e.target.value)}\r\n id=\"report\">\r\n {colors.map(c => <option key={c.value} value={c.value}>{c.text}</option>)}\r\n </Input>\r\n </FormGroup>\r\n {text !== '' &&\r\n <Alert color={color}>{text}</Alert>\r\n }\r\n <Button>Spara</Button>\r\n </Form>\r\n {messageAdded && <div>Meddelande \"{messageAdded}\" har sparats.</div>}\r\n {messageAddedError && <div>{messageAddedError}</div>}\r\n </div>\r\n\r\n <div className='vertical-space' />\r\n\r\n <h4>Aktuella meddelanden</h4>\r\n <div>\r\n {\r\n loadingMessages\r\n ? <BeatLoader size={15} margin={2} />\r\n : messages.map(m => <Alert className='overflow-hidden' key={m.id} color={m.color}>{m.text}<Button className='float-right' onClick={() => deleteMessage(m.id)}>Ta bort</Button></Alert>)\r\n }\r\n </div>\r\n\r\n </div>\r\n );\r\n}\r\n\r\nconst mapStateToProps = state => {\r\n return {\r\n messages: state.messageAlerts\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = dispatch => {\r\n return {\r\n setMessageAlerts: data => dispatch({ type: 'MESSAGE_ALERTS', data })\r\n };\r\n}\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(MessagesPage);\r\n","import React, { useCallback, useEffect, useState } from 'react';\r\nimport { Alert, Button, Form, FormGroup, Label, Input, Modal, ModalBody, ModalHeader, Row, Col } from 'reactstrap';\r\nimport { BeatLoader } from 'react-spinners';\r\nimport queryString from 'query-string';\r\n\r\nimport authService from './api-authorization/AuthorizeService';\r\n\r\n\r\nfunction ManagerPage(props) {\r\n\r\n const [customersToAdd, setCustomersToAdd] = useState([]);\r\n const [existingCustomers, setExistingCustomers] = useState([]);\r\n const [loadingCustomers, setLoadingCustomers] = useState(false);\r\n const [saveCustomerError, setSaveCustomerError] = useState(null);\r\n const [savingCustomer, setSavingCustomer] = useState(false);\r\n const [changeEmailError, setChangeEmailError] = useState(null);\r\n\r\n const fetchCustomers = useCallback(async () => {\r\n setLoadingCustomers(true);\r\n const token = await authService.getAccessToken();\r\n const response = await fetch('api/Manager/GetCustomers', {\r\n headers: { 'Authorization': `Bearer ${token}` }\r\n });\r\n const data = await response.json();\r\n setCustomersToAdd(data.filter(x => x.email === null));\r\n setExistingCustomers(data.filter(x => x.email != null));\r\n setLoadingCustomers(false);\r\n }, [])\r\n\r\n useEffect(() => {\r\n fetchCustomers()\r\n }, [fetchCustomers])\r\n\r\n const handleSubmit = async (e, email, customerNumber, name) => {\r\n e.preventDefault();\r\n setSavingCustomer(true);\r\n const token = await authService.getAccessToken();\r\n if (email === '') {\r\n email = null;\r\n }\r\n const newUser = { email, customerNumber, name };\r\n try {\r\n const response = await fetch('api/Manager/SaveCustomer', {\r\n method: 'POST',\r\n body: JSON.stringify(newUser),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Anrop misslyckades. ${response.status}`);\r\n }\r\n const data = await response.json();\r\n\r\n if (!data.success) {\r\n throw new Error(data.result);\r\n }\r\n setSaveCustomerError(null);\r\n setSavingCustomer(false);\r\n fetchCustomers();\r\n } catch (error) {\r\n setSaveCustomerError(error.message);\r\n setSavingCustomer(false);\r\n }\r\n }\r\n\r\n const deleteUser = async email => {\r\n const token = await authService.getAccessToken();\r\n const reportQuery = { email };\r\n const url = `api/Manager/DeleteUser?${queryString.stringify(reportQuery)}`;\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'DELETE',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Anrop misslyckades. ${response.status}`);\r\n }\r\n const data = await response.json();\r\n if (!data.success) {\r\n throw new Error(data.result);\r\n }\r\n\r\n fetchCustomers();\r\n console.log(`User deleted ok ${email}`)\r\n } catch (error) {\r\n\r\n console.log(`User delete failed ${error.message}`)\r\n }\r\n }\r\n\r\n const changeEmail = async (e, email, newEmail) => {\r\n e.preventDefault();\r\n setSavingCustomer(true);\r\n\r\n const token = await authService.getAccessToken();\r\n const reportQuery = { email, newEmail };\r\n const url = `api/Manager/ChangeEmail?${queryString.stringify(reportQuery)}`;\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Anrop misslyckades. ${response.status}`);\r\n }\r\n const data = await response.json();\r\n if (!data.success) {\r\n throw new Error(data.result);\r\n }\r\n\r\n fetchCustomers();\r\n console.log(`User changed email ok ${newEmail}`);\r\n setSavingCustomer(false);\r\n setChangeEmailError(null);\r\n\r\n } catch (error) {\r\n setSavingCustomer(false);\r\n setChangeEmailError(error.message);\r\n console.log(`User change email failed ${error.message}`)\r\n }\r\n }\r\n\r\n return (\r\n <div>\r\n <h1>Hantera kunder</h1>\r\n\r\n <div>\r\n {loadingCustomers\r\n ? <BeatLoader size={15} margin={2} />\r\n :\r\n <div>\r\n <h4>Kunder som saknar epost</h4>\r\n {customersToAdd.map(c =>\r\n <CustomerComponent\r\n key={c.customerNumber}\r\n customer={c}\r\n handleSubmit={handleSubmit}\r\n saveCustomerError={saveCustomerError}\r\n savingCustomer={savingCustomer} />)}\r\n <div className='vertical-space' />\r\n <h4>Befintliga kunder</h4>\r\n {existingCustomers.map(c =>\r\n <CustomerComponent\r\n key={c.customerNumber}\r\n customer={c}\r\n handleSubmit={handleSubmit}\r\n deleteUser={deleteUser}\r\n changeEmail={changeEmail}\r\n savingCustomer={savingCustomer}\r\n changeEmailError={changeEmailError} />)}\r\n </div>\r\n }\r\n </div>\r\n\r\n </div>\r\n );\r\n}\r\n\r\nfunction CustomerComponent({ customer: c, handleSubmit, saveCustomerError, savingCustomer, deleteUser, changeEmail, changeEmailError }) {\r\n\r\n const [showDetails, setShowDetails] = useState(false);\r\n const toggle = () => setShowDetails(!showDetails);\r\n const [showChangeEmail, setShowChangeEmail] = useState(false);\r\n const toggleChangeEmail = () => setShowChangeEmail(!showChangeEmail);\r\n\r\n\r\n const hasEmail = () => {\r\n return c.email;\r\n }\r\n\r\n return (\r\n <div className='customer'>\r\n <Row>\r\n <Col xs={1}>Kundnr:</Col>\r\n <Col>{c.customerNumber}</Col>\r\n <Col>\r\n <Button className='float-right' disabled={showDetails} onClick={() => setShowDetails(true)}>{hasEmail() ? 'Visa detaljer' : 'Lägg till'}</Button>\r\n </Col>\r\n\r\n </Row>\r\n <Row>\r\n <Col xs={1}>Namn:</Col>\r\n <Col>{c.name} ({c.organizationNumber})</Col>\r\n </Row>\r\n {\r\n c.email &&\r\n <Row>\r\n <Col xs={1}>Epost:</Col>\r\n <Col>{c.email}</Col>\r\n {deleteUser &&\r\n <Col>\r\n <Button disabled={c.groupCustomerOnly} className=\"float-right\" onClick={() => deleteUser(c.email)}>Ta bort</Button>\r\n <Button disabled={c.groupCustomerOnly} className=\"float-right\" style={{ marginRight: \"10px\" }} onClick={() => setShowChangeEmail(true)}>Ändra epost</Button>\r\n </Col>\r\n }\r\n </Row>\r\n }\r\n {showDetails &&\r\n <CustomerDetailsComponent\r\n customer={c}\r\n handleSubmit={handleSubmit}\r\n saveCustomerError={saveCustomerError}\r\n savingCustomer={savingCustomer}\r\n isOpen={showDetails}\r\n toggle={toggle} />\r\n }\r\n {showChangeEmail &&\r\n <CustomerChangeEmailComponent\r\n customer={c}\r\n handleSubmit={changeEmail}\r\n changeEmailError={changeEmailError}\r\n savingCustomer={savingCustomer}\r\n isOpen={showChangeEmail}\r\n toggle={toggleChangeEmail} />\r\n }\r\n </div>\r\n )\r\n}\r\n\r\nfunction CustomerDetailsComponent({ customer: c, handleSubmit, isOpen, toggle, saveCustomerError, savingCustomer}) {\r\n\r\n const [fetchingDetails, setFetchingDetails] = useState(false);\r\n const [details, setDetails] = useState(null);\r\n const [email, setEmail] = useState('');\r\n\r\n const customerNumber = c.customerNumber;\r\n\r\n const fetchCustomerDetails = useCallback(async () => {\r\n\r\n setFetchingDetails(true);\r\n const token = await authService.getAccessToken();\r\n try {\r\n const response = await fetch(`api/Manager/GetCustomerDetails?customerNumber=${customerNumber}`, {\r\n method: 'GET',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Anrop misslyckades. ${response.status}`);\r\n }\r\n const data = await response.json();\r\n\r\n setDetails(data);\r\n setFetchingDetails(false);\r\n } catch (error) {\r\n setFetchingDetails(false);\r\n\r\n }\r\n }, [customerNumber]);\r\n\r\n useEffect(() => {\r\n fetchCustomerDetails()\r\n }, [fetchCustomerDetails])\r\n\r\n const emailInputField = c.status === 'Epost saknas';\r\n\r\n return (\r\n <Modal size='lg' isOpen={isOpen} toggle={toggle}>\r\n <ModalHeader toggle={toggle}>{c.name}</ModalHeader>\r\n\r\n <ModalBody>\r\n {fetchingDetails\r\n ? < BeatLoader size={15} margin={2} />\r\n : null\r\n }\r\n {details &&\r\n <div>\r\n <CustomerDetailsWarning messages={details.warningMessages} />\r\n </div>\r\n }\r\n <div className='horisontal-line' />\r\n\r\n {details &&\r\n emailInputField &&\r\n <Form onSubmit={e => handleSubmit(e, email, c.customerNumber, c.name)}>\r\n <FormGroup>\r\n <Label for=\"addEmail\">Epost:</Label>\r\n <Input\r\n required\r\n type=\"email\"\r\n name=\"email\"\r\n value={email}\r\n onChange={e => setEmail(e.target.value)}\r\n id=\"addEmail\"\r\n placeholder=\"Ange epost-adress\" />\r\n </FormGroup>\r\n <Button disabled={savingCustomer}>{emailInputField ? 'Skicka inbjudan' : 'Spara'}</Button>\r\n </Form>\r\n }\r\n {saveCustomerError &&\r\n <div className=\"margin-top-bottom\">{saveCustomerError}</div>\r\n }\r\n </ModalBody>\r\n </Modal>\r\n )\r\n}\r\n\r\nfunction CustomerDetailsWarning({ messages }) {\r\n\r\n const getColor = type => {\r\n if (type === null) {\r\n return \"info\";\r\n }\r\n if (type === \"Error\") {\r\n return \"danger\";\r\n }\r\n return type.toLowerCase();\r\n }\r\n\r\n const getBookingNumber = m => {\r\n return m.rentalObjectBookingNr ? `Avtalsnr ${m.rentalObjectBookingNr}` : null;\r\n }\r\n\r\n const getMessageAsBullets = msg => {\r\n const list = msg.split('\\n');\r\n return list.map((l, i) => <li key={i}>{l}</li>)\r\n }\r\n\r\n return (\r\n <div>\r\n <h4>Varningar:</h4>\r\n {\r\n messages && messages.length > 0\r\n ? messages.map((m, i) => <Alert key={i} color={getColor(m.type)}><div>{getBookingNumber(m)}<ul>{getMessageAsBullets(m.message)}</ul></div></Alert>)\r\n : <div>Inga varningar hittades</div>\r\n\r\n }\r\n </div>\r\n )\r\n}\r\n\r\nfunction CustomerChangeEmailComponent({ customer: c, handleSubmit, isOpen, toggle, changeEmailError, savingCustomer }) {\r\n\r\n const [newEmail, setNewEmail] = useState('');\r\n\r\n return (\r\n <Modal size='lg' isOpen={isOpen} toggle={toggle}>\r\n <ModalHeader toggle={toggle}>{c.name}</ModalHeader>\r\n\r\n <ModalBody>\r\n\r\n <Form onSubmit={e => handleSubmit(e, c.email, newEmail)}>\r\n <FormGroup>\r\n <Label for=\"addEmail\">Nuvarande epost:</Label>\r\n <Input\r\n required\r\n type=\"email\"\r\n name=\"email\"\r\n value={c.email}\r\n id=\"addEmail\"\r\n placeholder=\"Nuvarande epost-adress\" />\r\n <Label for=\"newEmail\">Ange ny epost:</Label>\r\n <Input\r\n required\r\n type=\"email\"\r\n name=\"newEmail\"\r\n value={newEmail}\r\n onChange={e => setNewEmail(e.target.value)}\r\n id=\"newEmail\"\r\n placeholder=\"Ange ny epost-adress\" />\r\n </FormGroup>\r\n <Button disabled={savingCustomer}>Spara</Button>\r\n </Form>\r\n {changeEmailError &&\r\n <div className=\"margin-top-bottom\">{changeEmailError}</div>\r\n }\r\n </ModalBody>\r\n </Modal>\r\n )\r\n}\r\n\r\n\r\nexport { ManagerPage };","import React, { useCallback, useEffect, useState } from 'react';\r\nimport { Button, Form, FormGroup, Input, Label, Row, Col } from 'reactstrap';\r\nimport { BeatLoader } from 'react-spinners'; \r\nimport queryString from 'query-string';\r\n\r\nimport authService from './api-authorization/AuthorizeService';\r\n\r\nfunction AdminPage(props) {\r\n\r\n const [users, setUsers] = useState([]);\r\n const [loadingUsers, setLoadingUsers] = useState(false);\r\n const [newUserEmail, setNewUserEmail] = useState('');\r\n const [newUserRole, setNewUserRole] = useState('Manager');\r\n const [newCustomerNumbers, setNewCustomerNumbers] = useState('');\r\n const [userAdded, setUserAdded] = useState('');\r\n const [userAddedError, setUserAddedError] = useState('');\r\n\r\n\r\n const fetchUsers = useCallback(async () => {\r\n setLoadingUsers(true);\r\n const token = await authService.getAccessToken();\r\n const response = await fetch('api/Admin/GetManagers', {\r\n headers: { 'Authorization': `Bearer ${token}` }\r\n });\r\n const data = await response.json();\r\n setUsers(data);\r\n setLoadingUsers(false);\r\n }, [])\r\n\r\n useEffect(() => {\r\n fetchUsers()\r\n }, [fetchUsers])\r\n\r\n const handleSubmit = async e => {\r\n e.preventDefault();\r\n console.log(`Submit ${newUserEmail} - ${newUserRole}`);\r\n\r\n let groupCustomerNumbers = null;\r\n if (newUserRole === 'GroupCustomer' && newCustomerNumbers !== '') {\r\n groupCustomerNumbers = newCustomerNumbers.replace(/ /g, '').split(',');\r\n }\r\n\r\n const token = await authService.getAccessToken();\r\n const newUser = { email: newUserEmail, role: newUserRole, groupCustomerNumbers };\r\n try {\r\n const response = await fetch('api/Admin/AddNewUser', {\r\n method: 'POST',\r\n body: JSON.stringify(newUser),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Anrop misslyckades. ${response.status}`);\r\n }\r\n const data = await response.json();\r\n //console.log(JSON.stringify(data));\r\n if (!data.success) {\r\n throw new Error(data.result);\r\n }\r\n setUserAdded(newUserEmail);\r\n setUserAddedError(null);\r\n\r\n fetchUsers();\r\n //console.log(`User added ok ${userAdded} - ${userAddedError}`)\r\n } catch (error) {\r\n //console.log(`User added failed ${JSON.stringify(error)} ${userAdded} - ${userAddedError}`)\r\n setUserAdded('');\r\n setUserAddedError(error.message);\r\n }\r\n }\r\n\r\n const deleteUser = async email => {\r\n const token = await authService.getAccessToken();\r\n const reportQuery = { email };\r\n const url = `api/Admin/DeleteUser?${queryString.stringify(reportQuery)}`;\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'DELETE',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${token}`\r\n }\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Anrop misslyckades. ${response.status}`);\r\n }\r\n const data = await response.json();\r\n if (!data.success) {\r\n throw new Error(data.result);\r\n }\r\n\r\n fetchUsers();\r\n console.log(`User deleted ok ${email}`)\r\n } catch (error) {\r\n console.log(`User delete failed ${error.message}`)\r\n }\r\n }\r\n\r\n return (\r\n <div>\r\n <h1>Admin</h1>\r\n <AddAdminComponent\r\n handleSubmit={handleSubmit}\r\n newUserEmail={newUserEmail}\r\n newUserRole={newUserRole}\r\n newCustomerNumbers={newCustomerNumbers}\r\n setNewUserEmail={setNewUserEmail}\r\n setNewUserRole={setNewUserRole}\r\n setNewCustomerNumbers={setNewCustomerNumbers}\r\n userAdded={userAdded}\r\n userAddedError={userAddedError}\r\n />\r\n\r\n <div className='vertical-space' />\r\n <h4>Befintliga användare</h4>\r\n <div>\r\n {\r\n loadingUsers\r\n ? <BeatLoader size={15} margin={2} />\r\n : users.map(u => <ExistingAdminComponent key={u.email} user={u} deleteUser={deleteUser} />)\r\n }\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction AddAdminComponent({ handleSubmit, newUserEmail, newUserRole, newCustomerNumbers, setNewUserEmail, setNewUserRole, setNewCustomerNumbers, userAdded, userAddedError }) {\r\n return (\r\n <div><h4>Lägg till användare</h4>\r\n <Form onSubmit={handleSubmit}>\r\n <FormGroup>\r\n <Label for=\"addNewEmail\">Epost:</Label>\r\n <Input\r\n type=\"email\"\r\n name=\"email\"\r\n value={newUserEmail}\r\n onChange={e => setNewUserEmail(e.target.value)}\r\n id=\"addNewEmail\"\r\n placeholder=\"Ange epost-adress\" />\r\n </FormGroup>\r\n <FormGroup>\r\n <Label for=\"addNewRole\">Roll:</Label>\r\n <Input\r\n type=\"select\"\r\n name=\"select\"\r\n value={newUserRole}\r\n onChange={e => setNewUserRole(e.target.value)}\r\n id=\"addNewRole\">\r\n <option value=\"Manager\">Manager</option>\r\n <option value=\"Admin\">Admin</option>\r\n <option value=\"GroupCustomer\">Koncernanvändare</option>\r\n </Input>\r\n </FormGroup>\r\n {newUserRole === \"GroupCustomer\" &&\r\n <FormGroup>\r\n <Label for=\"addNewCustomerNumbers\">Kundnr:</Label>\r\n <Input\r\n type=\"text\"\r\n name=\"customerNumbers\"\r\n value={newCustomerNumbers}\r\n onChange={e => setNewCustomerNumbers(e.target.value)}\r\n id=\"addNewCustomerNumbers\"\r\n placeholder=\"Ange kundnummer kommaseparerat (ex. 123,134,423)\" />\r\n </FormGroup>\r\n }\r\n <Button>Spara</Button>\r\n </Form>\r\n {userAdded && <div>Konto för {userAdded} har skapats.</div>}\r\n {userAddedError && <div>{userAddedError}</div>}\r\n </div>)\r\n}\r\n\r\nfunction ExistingAdminComponent({ user, deleteUser }) {\r\n\r\n const translateRole = role => {\r\n if (role === 'GroupCustomer') {\r\n return \"Koncernanvändare\";\r\n }\r\n return role;\r\n }\r\n\r\n return <div className='admin-user'>\r\n <Row>\r\n <Col xs={1}>Epost:</Col>\r\n <Col>{user.email}</Col>\r\n <Col>\r\n <Button className=\"float-right\" onClick={() => deleteUser(user.email)}>Ta bort</Button>\r\n </Col>\r\n </Row>\r\n <Row>\r\n <Col xs={1}>Roll:</Col>\r\n <Col>{translateRole(user.role)}</Col>\r\n </Row>\r\n {user.groupCustomerNumbers !== null\r\n && user.groupCustomerNumbers.length > 0\r\n &&\r\n <Row>\r\n <Col xs={1}>Kundnr:</Col>\r\n <Col>{user.groupCustomerNumbers.join()}</Col>\r\n </Row>\r\n }\r\n </div>\r\n}\r\n\r\nexport { AdminPage };\r\n","import React, { Component } from 'react';\r\n\r\nexport class Unauthorized extends Component {\r\n static displayName = Unauthorized.name;\r\n\r\n render() {\r\n return (\r\n <div>\r\n <h1>Behörighet saknas</h1>\r\n </div>\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\nimport { Unauthorized } from './Unauthorized';\r\n\r\nexport default class AuthorizeRoute extends Component {\r\n constructor(props) {\r\n super(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 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, isManagerOrAdmin, isAdmin, role } = 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 if (!ready) {\r\n return <div></div>;\r\n } else {\r\n const { component: Component, adminRole, managerOrAdminRole, ...rest } = this.props;\r\n const okAdminComponent = isAdmin && adminRole;\r\n const okManagerComponent = isManagerOrAdmin && managerOrAdminRole;\r\n const okCustomerComponent = authenticated && !managerOrAdminRole && !adminRole;\r\n return <Route {...rest}\r\n render={(props) => {\r\n if (okAdminComponent || okManagerComponent || okCustomerComponent) {\r\n return <Component {...props} role={role} />\r\n } else if (managerOrAdminRole || adminRole) {\r\n return <Unauthorized />\r\n } else {\r\n return <Redirect to={redirectUrl} />\r\n }\r\n }} />\r\n }\r\n }\r\n\r\n async populateAuthenticationState() {\r\n const authenticated = await authService.isAuthenticated();\r\n const role = await authService.getRole();\r\n const isManagerOrAdmin = authService.isManagerOrAdminRole(role);\r\n const isAdmin = authService.isAdminRole(role);\r\n this.setState({ ready: true, authenticated, isManagerOrAdmin, isAdmin, role });\r\n }\r\n\r\n async authenticationChanged() {\r\n this.setState({ ready: false, authenticated: false, isManagerOrAdmin: false, isAdmin: 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 <div>{message}</div>\r\n } else {\r\n switch (action) {\r\n case LoginActions.Login:\r\n return (<div>Vänligen vänta...</div>);\r\n case LoginActions.LoginCallback:\r\n return (<div>Vänligen vänta...</div>);\r\n case LoginActions.Profile:\r\n case LoginActions.Register:\r\n return (<div></div>);\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(`${ApplicationPaths.IdentityRegisterPath}?${QueryParameterNames.ReturnUrl}=${encodeURI(ApplicationPaths.Login)}`);\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 <app>/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: \"Du har nu loggat ut.\" });\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 <div></div>\r\n }\r\n if (!!message) {\r\n return (<div>{message}</div>);\r\n } else {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n return (<div>Vänligen vänta...</div>);\r\n case LogoutActions.LogoutCallback:\r\n return (<div>Vänligen vänta...</div>);\r\n case LogoutActions.LoggedOut:\r\n return (<div>{message}</div>);\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: \"Du har nu loggat ut.\" });\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\n\r\nexport default class ApiAuthorizationRoutes extends Component {\r\n\r\n render () {\r\n return(\r\n <Fragment>\r\n <Route path={ApplicationPaths.Login} render={() => loginAction(LoginActions.Login)} />\r\n <Route path={ApplicationPaths.LoginFailed} render={() => loginAction(LoginActions.LoginFailed)} />\r\n <Route path={ApplicationPaths.LoginCallback} render={() => loginAction(LoginActions.LoginCallback)} />\r\n <Route path={ApplicationPaths.Profile} render={() => loginAction(LoginActions.Profile)} />\r\n <Route path={ApplicationPaths.Register} render={() => loginAction(LoginActions.Register)} />\r\n <Route path={ApplicationPaths.LogOut} render={() => logoutAction(LogoutActions.Logout)} />\r\n <Route path={ApplicationPaths.LogOutCallback} render={() => logoutAction(LogoutActions.LogoutCallback)} />\r\n <Route path={ApplicationPaths.LoggedOut} render={() => logoutAction(LogoutActions.LoggedOut)} />\r\n </Fragment>);\r\n }\r\n}\r\n\r\nfunction loginAction(name){\r\n return (<Login action={name}></Login>);\r\n}\r\n\r\nfunction logoutAction(name) {\r\n return (<Logout action={name}></Logout>);\r\n}\r\n","import React, { Component } from 'react';\r\nimport { Route } from 'react-router';\r\nimport Layout from './components/Layout';\r\nimport { Home } from './components/Home';\r\nimport ContainersPage from './components/ContainersPage';\r\nimport GarbageCansPage from './components/GarbageCansPage';\r\nimport ReportsPage from './components/ReportsPage';\r\nimport DocumentsPage from './components/DocumentsPage';\r\nimport HazardousWastePage from './components/HazardousWastePage';\r\nimport ContactPage from './components/ContactPage';\r\nimport MessagesPage from './components/MessagesPage';\r\nimport { ManagerPage } from './components/ManagerPage';\r\nimport { AdminPage } from './components/AdminPage';\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\n\r\nimport { registerLocale, setDefaultLocale } from \"react-datepicker\";\r\nimport sv from 'date-fns/locale/sv';\r\n\r\nimport './custom.css';\r\n\r\nregisterLocale('sv', sv)\r\nsetDefaultLocale('sv');\r\n\r\nexport default class App extends Component {\r\n static displayName = App.name;\r\n\r\n render () {\r\n return (\r\n <Layout>\r\n <AuthorizeRoute exact path='/' component={Home} />\r\n <AuthorizeRoute path='/containrar' component={ContainersPage} />\r\n <AuthorizeRoute path='/karl' component={GarbageCansPage} />\r\n <AuthorizeRoute path='/statistik' component={ReportsPage} />\r\n <AuthorizeRoute path='/dokument' component={DocumentsPage} />\r\n <AuthorizeRoute path='/farligtavfall' component={HazardousWastePage} />\r\n <AuthorizeRoute path='/kontakt' component={ContactPage} />\r\n <AuthorizeRoute managerOrAdminRole path='/meddelanden' component={MessagesPage} />\r\n <AuthorizeRoute managerOrAdminRole path='/kunder' component={ManagerPage} />\r\n <AuthorizeRoute adminRole path='/admin' component={AdminPage} />\r\n <Route path={ApplicationPaths.ApiAuthorizationPrefix} component={ApiAuthorizationRoutes} />\r\n </Layout>\r\n );\r\n }\r\n}\r\n","import { createStore } from 'redux';\r\n\r\nconst initialState = {\r\n messageAlerts: [],\r\n rentalObjects: null,\r\n rentalObjectsCustomerNo: null,\r\n garbageCans: null,\r\n garbageCansCustomerNo: null,\r\n documents: null,\r\n documentsCustomerNo: null,\r\n customerNo: '',\r\n advisors: [],\r\n groupCustomerNumbers: null,\r\n adminFetchCustomerNo: ''\r\n};\r\n\r\nconst rootReducer = function (state = initialState, action) {\r\n// console.log(\"Action \" + action.type + \" \" + action.data?.length)\r\n switch (action.type) {\r\n case 'MESSAGE_ALERTS':\r\n return { ...state, messageAlerts: action.data };\r\n case 'RENTAL_OBJECTS':\r\n return { ...state, rentalObjects: action.data };\r\n case 'GARBAGE_CANS':\r\n return { ...state, garbageCans: action.data };\r\n case 'DOCUMENTS':\r\n return { ...state, documents: action.data };\r\n case 'RENTAL_OBJECTS_CUSTOMER_NO':\r\n return { ...state, rentalObjectsCustomerNo: action.data };\r\n case 'GARBAGE_CANS_CUSTOMER_NO':\r\n return { ...state, garbageCansCustomerNo: action.data };\r\n case 'DOCUMENTS_CUSTOMER_NO':\r\n return { ...state, documentsCustomerNo: action.data };\r\n case 'CUSTOMER_NO':\r\n return { ...state, customerNo: action.data };\r\n case 'ADVISORS':\r\n return { ...state, advisors: action.data };\r\n case 'GROUP_CUSTOMER_NUMBERS':\r\n return { ...state, groupCustomerNumbers: action.data }\r\n case 'ADMIN_FETCH_CUSTOMER_NO':\r\n return { ...state, adminFetchCustomerNo: action.data }\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nconst store = createStore(rootReducer);\r\n\r\nexport { store };","import '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 { Provider } from 'react-redux';\r\nimport App from './App';\r\n\r\nimport { store } from './store';\r\n\r\n//import registerServiceWorker from './registerServiceWorker';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n <Provider store={store}>\r\n <BrowserRouter basename={baseUrl}>\r\n <App />\r\n </BrowserRouter>\r\n </Provider>,\r\n rootElement);\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\r\n","module.exports = __webpack_public_path__ + \"static/media/19fa5f_a7e660fc997b43d6a570782c81390eaf_mv2.949585df.webp\";"],"sourceRoot":""}