diff --git a/webstillas/src/components/Signup.js b/webstillas/src/components/Signup.js index a2ed0e4f8ea2795d029673ccbeebd712ce8ad845..ed9bd4b3180714f2fa4fdd598e0e606e7d47470c 100644 --- a/webstillas/src/components/Signup.js +++ b/webstillas/src/components/Signup.js @@ -6,7 +6,7 @@ import {useUserAuth} from "../context/UserAuthContext"; import postModel from "../modelData/postModel"; import {formatDateToString} from "./projects/projects"; import {LOGIN} from "./constants"; -import {USER_POST_URL, USER_URL} from "../modelData/constantsFile"; +import {USER_POST_URL} from "../modelData/constantsFile"; import "../firebaselogin.css" /** diff --git a/webstillas/src/components/logistics/scaffold/addScaffolding.js b/webstillas/src/components/logistics/scaffold/addScaffolding.js index ec279de2ea3235846364e6318ed0517a5106965c..870f90898e8e92fd5ee48a44cf85920a350a661e 100644 --- a/webstillas/src/components/logistics/scaffold/addScaffolding.js +++ b/webstillas/src/components/logistics/scaffold/addScaffolding.js @@ -24,7 +24,6 @@ function AddScaffolding() { }) //Verification of - const [postSuccess, setPostSuccess] = useState(null) const [buttonPress, setButtonPress] = useState(false) @@ -70,6 +69,9 @@ function AddScaffolding() { } + const [type, setType] = useState("") + + /** * Function that will add the new scaffolding object * @@ -81,25 +83,22 @@ function AddScaffolding() { scaffolding ] try { - //posting body - const promise = await postModel(SCAFFOLDING_URL, (body)).catch( - e => console.log(e) - ) - setPostSuccess(promise.statusCode) + await postModel(SCAFFOLDING_URL, (body)) + setType("success") + } catch (e) { - console.log(e) + setType("danger") } } - return ( <div className={"main-add-scaffolding"}> - {(postSuccess === 201) ? + {(type === "success") ? (<Alert className={"alert-success"} key={"success"} variant={"success"}> Stillasdel har blitt registrert </Alert>) : null} - {(postSuccess !== 201 && buttonPress) ? + {(type === "danger" && buttonPress) ? (<Alert className={"alert-success"} key={"danger"} variant={"danger"}> Stillasdel har ikke blitt registrert diff --git a/webstillas/src/components/mapPage/mapPage.js b/webstillas/src/components/mapPage/mapPage.js index f22f2bae31753462be83d291c4f4eab4b840a76f..63069804ed42f806dcacfc4cfab6a8a1ba975277 100644 --- a/webstillas/src/components/mapPage/mapPage.js +++ b/webstillas/src/components/mapPage/mapPage.js @@ -5,6 +5,8 @@ import {GetDummyData} from "../../modelData/addData"; import ReactMapboxGl, {ScaleControl, Marker, ZoomControl} from "react-mapbox-gl"; import {MapBoxAPIKey} from "../../firebaseConfig"; import img from "./marker.png" +import {InternalServerError} from "../error/error"; +import {SpinnerDefault} from "../Spinner"; const Map = ReactMapboxGl({ accessToken: MapBoxAPIKey @@ -72,10 +74,13 @@ function MapPageClass(props) { * @returns {JSX.Element} */ export const MapPage = () => { - const {isLoading, data} = GetDummyData("allProjects", PROJECTS_WITH_SCAFFOLDING_URL) + const {isLoading, data, isError} = GetDummyData("allProjects", PROJECTS_WITH_SCAFFOLDING_URL) if (isLoading) { - return <h1>Loading</h1> + return <SpinnerDefault /> + } else if(isError){ + return <InternalServerError /> } else { - return <MapPageClass data={data}/> + const projects = JSON.parse(data.text) + return <MapPageClass data={projects}/> } } diff --git a/webstillas/src/components/projects/elements/Modal.js b/webstillas/src/components/projects/elements/Modal.js index 37c795a83008d9dd24863980081a272ba2f5c861..9296a3a6119b4493331b80aa2fba138cc323bdcc 100644 --- a/webstillas/src/components/projects/elements/Modal.js +++ b/webstillas/src/components/projects/elements/Modal.js @@ -1,6 +1,6 @@ import React, {useState} from "react"; import 'bootstrap/dist/css/bootstrap.min.css'; -import {Button, Modal} from 'react-bootstrap'; +import {Button, Modal, Spinner} from 'react-bootstrap'; import img from "../../scaffolding/images/spirstillas_solideq_spir_klasse_5_stillas_135_1.jpg"; import putModel from "../../../modelData/putData"; import { @@ -76,8 +76,9 @@ export default function InfoModalFunc(props) { const handleShow = () => setShow(true); const queryClient = useQueryClient() - const {data: jsonProjects} = GetDummyData("allProjects", PROJECTS_WITH_SCAFFOLDING_URL) - let jsonProject = queryClient.getQueryData(["project", props.id]) + const {isLoading, data: projects} = GetDummyData("allProjects", PROJECTS_WITH_SCAFFOLDING_URL) + let project = queryClient.getQueryData(["project", props.id]) + let jsonProject = JSON.parse(project.text) const [scaffolding, setScaffolding] = useState(scaffoldingMove); const [ToProject, setToProject] = useState(""); @@ -111,7 +112,6 @@ export default function InfoModalFunc(props) { * @returns {Promise<void>} */ const AddScaffold = async () => { - console.log(JSON.stringify(move)) try { await putModel(TRANSFER_SCAFFOLDING, JSON.stringify(move)) await queryClient.resetQueries(["project", props.id]) @@ -133,15 +133,27 @@ export default function InfoModalFunc(props) { - - //Checks if the user did not set to project equal to from project. const validFormat = ToProject !== FromProject + let jsonProjects + if (!isLoading){ + jsonProjects = JSON.parse(projects.text) + } return ( <> - <Button className="nextButton" onClick={handleShow}> + {isLoading ? <Button className="nextButton" disabled> + <Spinner + as="span" + animation="grow" + size="sm" + role="status" + aria-hidden="true" + /> + Loading + </Button> : + <Button className="nextButton" onClick={handleShow}> Overfør deler til Prosjekt - </Button> + </Button>} <Modal show={show} onHide={handleClose} @@ -164,7 +176,7 @@ export default function InfoModalFunc(props) { <option value={0}>Storage</option> {jsonProjects?.map(e => { return ( - <option value={e.projectID}>{e.projectName}</option> + <option key={e.projectID} value={e.projectID}>{e.projectName}</option> ) })} </select> @@ -221,6 +233,7 @@ export default function InfoModalFunc(props) { </> ); + } diff --git a/webstillas/src/components/projects/elements/preView.js b/webstillas/src/components/projects/elements/preView.js index 85b5048a1bb5870b1cc8663660d05bfbe7498783..fec37ef6d8502e8eaadd8a8be2ec350451468c9a 100644 --- a/webstillas/src/components/projects/elements/preView.js +++ b/webstillas/src/components/projects/elements/preView.js @@ -157,14 +157,17 @@ function contactInformation(project) { */ export const PreView = () => { //Fetching the data of specific project. - const {isLoading: projectLoad, data: project, isError } = GetDummyData(["project", getProjectID()], PROJECTS_URL_WITH_ID + getProjectID() + WITH_SCAFFOLDING_URL) + const {isLoading: projectLoad, data, isError } = GetDummyData(["project", getProjectID()], PROJECTS_URL_WITH_ID + getProjectID() + WITH_SCAFFOLDING_URL) if (projectLoad) { return <SpinnerDefault/> } else if(isError){ return <InternalServerError /> } else { - return ( + const project = JSON.parse(data.text) + + + return ( <div className={"preView-Project-Main"}> <div className={"map-preview"}> <PreViewFunction data={project[0]}/> diff --git a/webstillas/src/components/projects/projects.js b/webstillas/src/components/projects/projects.js index 40e9d1db41b31e89d675fefd5e4495b342940c48..6f55896ccb0a6fac856ecc426ffd48d9370efcda 100644 --- a/webstillas/src/components/projects/projects.js +++ b/webstillas/src/components/projects/projects.js @@ -40,80 +40,82 @@ export function Project(){ if (isLoading) { return( - <SpinnerDefault /> + <SpinnerDefault /> ) } else if (isError){ return <InternalServerError/> } else { + const allProjects = (JSON.parse(data.text)) + return ( <div className={"main-project-window"}> - <div className={"main-sidebar"} > - <div className={"search-filter"}> - <p className = {"input-sorting-text"}>Status</p> - <select className={"form-select options"} onChange={(e) => - setSelectedOption(e.target.value)}> - <option defaultValue="">Velg her</option> - <option value={"Active"}>Aktiv</option> - <option value={"Inactive"}>Inaktiv</option> - <option value={"Upcoming"}>Kommende</option> - </select> - </div> - <div className={"search-filter"}> - <p className = {"input-sorting-text"}>Prosjekt navn: </p> - <input - className={"form-control"} - type="text" - placeholder={"Søk prosjekt navn"} - value={searchName} - onChange={e => { - setSearchName(e.target.value) - }}/> - </div> - <div className={"search-filter"}> - <p className = {"input-sorting-text"}>Stillsmengde: </p> - <div className={"search-filter size"}> - <input - className={"form-control size-search"} - type="number" - placeholder={"Fra"} - min={0} - onWheel={(e) => e.prototype} - onChange={e => setFromSize(Number(e.target.value))} - /> - <input - className={"form-control size-search"} - type="number" - placeholder={"Til"} - min={0} - onChange={e => { - setToSize(Number(e.target.value)) - }} - /> - </div> - </div> - <div className={"date-filter"}> - <p className = {"input-sorting-text"}>Fra dato: </p> + <div className={"main-sidebar"} > + <div className={"search-filter"}> + <p className = {"input-sorting-text"}>Status</p> + <select className={"form-select options"} onChange={(e) => + setSelectedOption(e.target.value)}> + <option defaultValue="">Velg her</option> + <option value={"Active"}>Aktiv</option> + <option value={"Inactive"}>Inaktiv</option> + <option value={"Upcoming"}>Kommende</option> + </select> + </div> + <div className={"search-filter"}> + <p className = {"input-sorting-text"}>Prosjekt navn: </p> + <input + className={"form-control"} + type="text" + placeholder={"Søk prosjekt navn"} + value={searchName} + onChange={e => { + setSearchName(e.target.value) + }}/> + </div> + <div className={"search-filter"}> + <p className = {"input-sorting-text"}>Stillsmengde: </p> + <div className={"search-filter size"}> <input - className={"form-control"} - type="date" - onChange={e => { - setStartDate(formatDateToString(e.target.value)) - }}/> - </div> - <div className={"search-filter"}> - <p className = {"input-sorting-text"}>Til dato: </p> + className={"form-control size-search"} + type="number" + placeholder={"Fra"} + min={0} + onWheel={(e) => e.prototype} + onChange={e => setFromSize(Number(e.target.value))} + /> <input - className={"form-control"} - type="date" + className={"form-control size-search"} + type="number" + placeholder={"Til"} + min={0} onChange={e => { - setEndDate(formatDateToString(e.target.value)) - }}/> + setToSize(Number(e.target.value)) + }} + /> </div> </div> + <div className={"date-filter"}> + <p className = {"input-sorting-text"}>Fra dato: </p> + <input + className={"form-control"} + type="date" + onChange={e => { + setStartDate(formatDateToString(e.target.value)) + }}/> + </div> + <div className={"search-filter"}> + <p className = {"input-sorting-text"}>Til dato: </p> + <input + className={"form-control"} + type="date" + onChange={e => { + setEndDate(formatDateToString(e.target.value)) + }}/> + </div> + </div> <div> <div className={"projects-display"}> - {data.filter(data => (data.projectName.toLowerCase()).includes(searchName.toLowerCase())) + {allProjects.filter(data => (data.projectName.toLowerCase()).includes(searchName.toLowerCase())) .filter(data => { if (fromSize !== 0) { console.log(fromSize) diff --git a/webstillas/src/components/scaffolding/elements/ModalScaffolding.js b/webstillas/src/components/scaffolding/elements/ModalScaffolding.js index 7a9796b6287d019c48f1e81a986bd0ff33ac5ccd..53c470dcb9b8b0ee796c09e4d828e337ee069240 100644 --- a/webstillas/src/components/scaffolding/elements/ModalScaffolding.js +++ b/webstillas/src/components/scaffolding/elements/ModalScaffolding.js @@ -9,13 +9,13 @@ import "./Modalscaffolding.css" function ScaffoldingInProject(type, projects) { - const queryClient = useQueryClient() const {isLoading, data} = GetDummyData("allProjects", PROJECTS_WITH_SCAFFOLDING_URL) if (isLoading){ return <h1>Loading</h1> }else { - const result = data.map((element) => { + const allProjects = JSON.parse(data.text) + const result = allProjects.map((element) => { return { ...element, scaffolding: element.scaffolding.filter((subElement) => subElement.type.toLowerCase() === type.toLowerCase() && subElement.Quantity.expected !== 0) diff --git a/webstillas/src/components/scaffolding/scaffolding.js b/webstillas/src/components/scaffolding/scaffolding.js index a58682c0b1200b1441ef13db6073f9a88314c4a8..343164a747b3a8bd084d54efe0f65856204a22cf 100644 --- a/webstillas/src/components/scaffolding/scaffolding.js +++ b/webstillas/src/components/scaffolding/scaffolding.js @@ -5,6 +5,7 @@ import {PROJECTS_WITH_SCAFFOLDING_URL, SCAFFOLDING_URL, STORAGE_URL} from "../.. import {GetDummyData} from "../../modelData/addData"; import {useQueryClient} from "react-query"; import {SpinnerDefault} from "../Spinner"; +import {InternalServerError} from "../error/error"; /** Class that will create an overview of the scaffolding parts @@ -26,12 +27,12 @@ class ScaffoldingClass extends React.Component { countObjects(arr, key){ let arr2 = []; - arr.forEach((x)=>{ + arr?.forEach((x)=>{ // Checking if there is any object in arr2 // which contains the key value - if(arr2.some((val)=>{return val[key] === x[key]})){ + if(arr2?.some((val)=>{return val[key] === x[key]})){ // If yes! then increase the occurrence by 1 - arr2.forEach((k)=>{ + arr2?.forEach((k)=>{ if(k[key] !== x[key]){ k["occurrence"]++ } @@ -44,7 +45,7 @@ class ScaffoldingClass extends React.Component { let a = {} a[key] = x[key] a["occurrence"] = 1 - arr2.push(a); + arr2?.push(a); } }) @@ -83,11 +84,11 @@ class ScaffoldingClass extends React.Component { const result = Object.keys(scaffoldingObject).map((key) => scaffoldingObject[key]); if (selectedOption === "ascending") { - result[0].sort((a, b) => (a.scaffolding < b.scaffolding) ? 1 : -1) + result[0]?.sort((a, b) => (a.scaffolding < b.scaffolding) ? 1 : -1) } else if (selectedOption === "descending") { - result[0].sort((a, b) => (a.scaffolding > b.scaffolding) ? 1 : -1) + result[0]?.sort((a, b) => (a.scaffolding > b.scaffolding) ? 1 : -1) } else { - result[0].sort((a, b) => (a.type > b.type)) + result[0]?.sort((a, b) => (a.type > b.type)) } return ( //todo only scroll the scaffolding not the map @@ -104,7 +105,7 @@ class ScaffoldingClass extends React.Component { </div> <div className={"grid-container"}> - {result[0].map((e) => { + {result[0]?.map((e) => { return ( <CardElement key={e.type} @@ -126,17 +127,10 @@ class ScaffoldingClass extends React.Component { } export const Scaffolding = () => { - const {isLoading: LoadingScaffolding, data: Scaffolding} = GetDummyData("scaffolding", SCAFFOLDING_URL) - const {isLoading: LoadingStorage, data: Storage} = GetDummyData("storage", STORAGE_URL) - const queryClient = useQueryClient() - let LoadingAll - let ProjectsData - if (queryClient.getQueryData("allProjects") !== undefined) { - ProjectsData = queryClient.getQueryData("allProjects") - } - const {isLoading: LoadingAllProjects, data} = GetDummyData("allProjects", PROJECTS_WITH_SCAFFOLDING_URL) - ProjectsData = data - LoadingAll = LoadingAllProjects + const {isLoading: LoadingScaffolding, data: Scaffolding, isError: scaffoldingError} = GetDummyData("scaffolding", SCAFFOLDING_URL) + const {isLoading: LoadingStorage, data: Storage, isError: storageError} = GetDummyData("storage", STORAGE_URL) + const {isLoading: LoadingAll, data: Project, isError: allProjectError} = GetDummyData("allProjects", PROJECTS_WITH_SCAFFOLDING_URL) + @@ -144,10 +138,16 @@ export const Scaffolding = () => { if (LoadingScaffolding || LoadingStorage || LoadingAll) { return <SpinnerDefault /> + } else if(scaffoldingError || storageError || allProjectError){ + return <InternalServerError /> } else { - return <ScaffoldingClass scaffolding = {Scaffolding} - storage = {Storage} - projects = {ProjectsData} + const scaffoldingData = JSON.parse(Scaffolding.text) + const storageData = JSON.parse(Storage.text) + const projectData = JSON.parse(Project.text) + + return <ScaffoldingClass scaffolding = {scaffoldingData} + storage = {storageData} + projects = {projectData} /> } } diff --git a/webstillas/src/components/topBar/topBar.js b/webstillas/src/components/topBar/topBar.js index c451cbfc3a0357ce50d4d1723a8544d867759158..0b33d9734bd4c9fe554b62a92dbccbed966f72dc 100644 --- a/webstillas/src/components/topBar/topBar.js +++ b/webstillas/src/components/topBar/topBar.js @@ -19,17 +19,21 @@ import {ADD_PROJECT_URL, ADD_SCAFFOLDING_URL, MAP_URL, PROJECT_URL, SCAFFOLDING_ */ const TopBar = () => { const {logOut} = useUserAuth(); - let loading, userData + let loading, user - /*Checking if the user is authenticated - * If so, fetch userdata - */ - if (auth.currentUser !== null) { + + //If the user is authenticated, fetch data from database + if (auth.currentUser){ const {isLoading, data} = GetDummyData("user", USER_URL + auth.currentUser.uid) loading = isLoading - userData = data + user = data + } + + + + /* If the user is not authenticated, the topbar will be empty. */ @@ -45,6 +49,7 @@ const TopBar = () => { //If data is loading, the user will get a spinner displayed return <SpinnerDefault/> } else { + const userData = JSON.parse(user.text) //Top bar with interactive buttons to navigate. return ( <AppBar position="sticky"> @@ -70,7 +75,7 @@ const TopBar = () => { </DropdownItem> </NavDropdown> <DropdownButton id="dropdown-button" - title={"userData.name.firstName"} + title={userData?.name.firstName} size="sm" > <DropdownItem> diff --git a/webstillas/src/components/userinformation/userInfo.js b/webstillas/src/components/userinformation/userInfo.js index ca6a22a8b9232dbf487678baedd758eda3ba7a71..e72f5c5052a26d32ea13633a6e34d999e6b2da00 100644 --- a/webstillas/src/components/userinformation/userInfo.js +++ b/webstillas/src/components/userinformation/userInfo.js @@ -5,6 +5,7 @@ import { USER_URL} from "../../modelData/constantsFile"; import {SpinnerDefault} from "../Spinner"; import "./userInfo.css" import profileImg from "./profile-png-icon-2.png" +import {InternalServerError} from "../error/error"; /** @@ -14,11 +15,23 @@ import profileImg from "./profile-png-icon-2.png" */ export function UserInfo(){ //Todo add if error - const {isLoading, data, isError} = GetDummyData("user", USER_URL + auth.currentUser.uid) - if (isLoading) { + let isLoadingUser, userData, isErrorUser + + if (auth.currentUser){ + const {isLoading, data, isError} = GetDummyData("user", USER_URL + auth.currentUser.uid) + isLoadingUser = isLoading + userData = data + isErrorUser = isError + } + + if (isLoadingUser) { return (<SpinnerDefault/>) - } else { + } else if( isErrorUser){ + return <InternalServerError /> + } + else { + const user = JSON.parse(userData.text) return ( <div className={"main-userinfo"}> <div className={"info-card"}> @@ -27,7 +40,7 @@ export function UserInfo(){ </div> <div className={"information-text"}> <h4 className={"header-information"}> - {data.name.firstName} {data.name.lastName} + {user?.name.firstName} {user?.name.lastName} </h4> <h4 className={"under-information"}> Navn @@ -35,7 +48,7 @@ export function UserInfo(){ </div> <div className={"information-text"}> <h4 className={"header-information"}> - {data.phone} + {user?.phone} </h4> <h4 className={"under-information"}> Telefonnummer @@ -43,7 +56,7 @@ export function UserInfo(){ </div> <div className={"information-text"}> <h4 className={"header-information"}> - {data.email} + {user?.email} </h4> <h4 className={"under-information"}> Email @@ -51,7 +64,7 @@ export function UserInfo(){ </div> <div className={"information-text"}> <h4 className={"header-information"}> - {data.employeeID} + {user?.employeeID} </h4> <h4 className={"under-information"}> Ansatt ID @@ -59,7 +72,7 @@ export function UserInfo(){ </div> <div className={"information-text"}> <h4 className={"header-information"}> - {data.dateOfBirth} + {user?.dateOfBirth} </h4> <h4 className={"under-information"}> Fødselsdato @@ -67,7 +80,7 @@ export function UserInfo(){ </div> <div className={"information-text"}> <h4 className={"header-information"}> - {data.role} + {user?.role} </h4> <h4 className={"under-information"}> Stilling @@ -75,7 +88,7 @@ export function UserInfo(){ </div> <div className={"information-text"}> <h4 className={"header-information"}> - {data.admin.toString()} + {user?.admin.toString()} </h4> <h4 className={"under-information"}> Administrerende rettigheter diff --git a/webstillas/src/modelData/fetchData.js b/webstillas/src/modelData/fetchData.js index c18a1dfdb4cec8898f701b2e70497bdd97811c1d..05c88dfb827d196a8f613dc4e4815121d2b28d95 100644 --- a/webstillas/src/modelData/fetchData.js +++ b/webstillas/src/modelData/fetchData.js @@ -12,13 +12,17 @@ export default function fetchModel(url) { return; } if (xhr.status !== 200) { - reject(new Error(JSON.stringify({ + reject({ status: xhr.status, statusText: xhr.statusText, text: xhr.responseText - }))); + }); } else { - resolve(JSON.parse(xhr.responseText)); + resolve({ + statusCode: xhr.status, + text: xhr.responseText + } + ); } }); xhr.open('GET', BASE_URL + url); diff --git a/webstillas/src/modelData/postModel.js b/webstillas/src/modelData/postModel.js index c0de311a2d8eac8db64c3a17eb68354afac02ef8..0c85fee4e0e6ccd094d53c6973ea609daf24b840 100644 --- a/webstillas/src/modelData/postModel.js +++ b/webstillas/src/modelData/postModel.js @@ -15,7 +15,7 @@ export default function postModel(url, body) { } if (xhr.status !== 201) { reject(new Error(JSON.stringify({ - status: xhr.status, + statusCode: xhr.status, statusText: xhr.statusText, text: xhr.responseText })));