From 5d16b633fb6c77e471d9101f7420a1fb7608a1f6 Mon Sep 17 00:00:00 2001 From: patrickbartlett Date: Tue, 9 Mar 2021 03:55:22 -0800 Subject: [PATCH 1/7] fixed some bugs by introducing others --- .../components/UserProfile/UserProfile.css | 1 + .../src/components/UserProfile/UserProfile.js | 242 +++++++++++------- .../src/images/invisible.png | Bin 0 -> 21576 bytes .../src/images/user-icon.png | Bin 5327 -> 0 bytes 4 files changed, 146 insertions(+), 97 deletions(-) create mode 100644 cloud-haven-react-app/src/images/invisible.png delete mode 100644 cloud-haven-react-app/src/images/user-icon.png diff --git a/cloud-haven-react-app/src/components/UserProfile/UserProfile.css b/cloud-haven-react-app/src/components/UserProfile/UserProfile.css index be2fed1..74302c5 100644 --- a/cloud-haven-react-app/src/components/UserProfile/UserProfile.css +++ b/cloud-haven-react-app/src/components/UserProfile/UserProfile.css @@ -26,4 +26,5 @@ .CardHeader { margin-top: 2%; font-weight: bold; + color: #254e70; } diff --git a/cloud-haven-react-app/src/components/UserProfile/UserProfile.js b/cloud-haven-react-app/src/components/UserProfile/UserProfile.js index cbb93dc..eb7538e 100644 --- a/cloud-haven-react-app/src/components/UserProfile/UserProfile.js +++ b/cloud-haven-react-app/src/components/UserProfile/UserProfile.js @@ -4,77 +4,169 @@ import Accordion from 'react-bootstrap/Accordion' import Card from 'react-bootstrap/Card' import Form from 'react-bootstrap/Form' import profile from "../../images/profile-user.png"; +import invisible from "../../images/invisible.png"; import './UserProfile.css' const UserProfile = () => { + const OPEN = '0' + const CLOSED = null + const [ editing, setEditing ] = React.useState(false); - // '0' = open null = closed - const [ accordionsOpen, setAccordionsOpen ] = React.useState([null, null, null]); + const [ accordionsOpen, setAccordionsOpen ] = React.useState([null, null, null]); // '0' = open null = closed + const [ personalInfoForm, setPersonalInfoForm ] = React.useState([]); + + // TO DO: pull user info from passport/backend + const [ firstNameFormData, setFirstNameFormData ] = React.useState({ + controlId: 'formFirstName', + label: 'First Name', + type: 'name', + value: 'Johnald', + focus: null + }) + const [ lastNameFormData, setlastNameFormData ] = React.useState({ + controlId: 'formlastName', + label: 'Last Name', + type: 'name', + value: 'Lastname', + focus: null + }) + const [ emailFormData, setEmailFormData ] = React.useState({ + controlId: 'formEmail', + label: 'Email Address', + type: 'email', + value: 'test@test.gov', + focus: null + }) + const [ phoneFormData, setPhoneFormData ] = React.useState({ + controlId: 'formPhone', + label: 'Phone Number', + type: 'tel', + value: '555-555-555', + focus: null + }) + const [ birthFormData, setBirthFormData ] = React.useState({ + controlId: 'formBirth', + label: 'Date of Birth', + type: 'date', + value: '01-01-2000', + focus: null + }) + const toggleEditing = () => { - setEditing(editing ? false : true); + setEditing(!editing); }; + const clearFocus = () => { + return null + } + + const handleFirstNameFormChange = (newValue) => { + setFirstNameFormData(prevFirstNameFormData => ({ ...prevFirstNameFormData, + value: newValue, + focus: 'notnull' + })); + } + const handleAccordionClick = (accordionNumber) => { - console.log(accordionsOpen[accordionNumber]) var accordionsOpenTemp = accordionsOpen - if (accordionsOpenTemp[accordionNumber] == '0') { - accordionsOpenTemp[accordionNumber] = null + if (accordionsOpenTemp[accordionNumber] === OPEN) { + accordionsOpenTemp[accordionNumber] = CLOSED } else { - accordionsOpenTemp[accordionNumber] = '0' + accordionsOpenTemp[accordionNumber] = OPEN } setAccordionsOpen(accordionsOpenTemp) - console.log(accordionsOpen) } const ProfileHeader = () => { return ( - - - - - - - {' '} - - + + + user-profile + + ) + } + const EditButton = () => { + return ( + ) } const UserInfoAccordions = () => { + const Accordions = (accordNum, accordInfo) => { + return ( + + + { handleAccordionClick(accordNum) }}/> + + + {accordInfo} + + + + + ) + } + + const FirstNameForm = (props) => { + const {formData, formHandler} = props; + return ( + + {formData.label} + formHandler(e.target.value)} + disabled={!editing} /> + + ) + } + const PersonalInformation = () => { return ( - - -
- - Email address - - -
- - -
- - Phone Number - - -
- - -
- - Date of Birth - - -
- -
+
+ + + + + + + + Last Name + + + + + + + + + Email address + + + + + + + Phone Number + + + + + + + Date of Birth + + + + +
) } @@ -83,75 +175,31 @@ const UserProfile = () => { - -
- - First Name - - -
- - -
- - Last Name - - -
-
- - +
Personal Information - - - { handleAccordionClick(0) }}> - - - - - - - - - - +
+ {Accordions(0, )} - +
Contact Details - - - { handleAccordionClick(1) }}> - +
+ {Accordions(1, Contact Details go here)} - - - Contact Details go here - - - - - +
Education - - - { handleAccordionClick(2) }}> - +
+ {Accordions(2, Education goes here (maybe))} - - - Education goes here (maybe) - - -
) } return ( + {/* */} diff --git a/cloud-haven-react-app/src/images/invisible.png b/cloud-haven-react-app/src/images/invisible.png new file mode 100644 index 0000000000000000000000000000000000000000..153f618debeeb0e89b26b4fcf6ec4e1065f6ea46 GIT binary patch literal 21576 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

Y&!*%`SzFQ~`A6tj0<%20B4N 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

G<)+?6 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 aDN9qsnZAIeS=E1EQsySs#&t$s$^QXH?`SOm From c0a20cf6848d7cc441466b52726c81a4cd14291f Mon Sep 17 00:00:00 2001 From: patrickbartlett Date: Thu, 11 Mar 2021 04:08:31 -0800 Subject: [PATCH 2/7] refactored functional components out of functions --- .../components/UserProfile/UserProfile.css | 14 +- .../src/components/UserProfile/UserProfile.js | 196 ++++++------------ 2 files changed, 74 insertions(+), 136 deletions(-) diff --git a/cloud-haven-react-app/src/components/UserProfile/UserProfile.css b/cloud-haven-react-app/src/components/UserProfile/UserProfile.css index 74302c5..30da6be 100644 --- a/cloud-haven-react-app/src/components/UserProfile/UserProfile.css +++ b/cloud-haven-react-app/src/components/UserProfile/UserProfile.css @@ -1,10 +1,12 @@ -.UserProfile { +.UserProfileWrapper { margin-top: 2%; } .EditButton { background-color: #EDEDED; color: #000000; + width: 6em; + height: 3em; border-color: #EDEDED; } @@ -17,14 +19,22 @@ .InfoAccordion { margin-top: 0.5%; margin-bottom: 3%; + width: 100%; } .AccordionCard { background-color: #e5e5e5; } -.CardHeader { +.AccordionHeaderText { margin-top: 2%; font-weight: bold; color: #254e70; } + +.AccordionHeader { + margin-top: 2em; + font-size: 18px; + font-weight: bold;; + text-align: start; +} diff --git a/cloud-haven-react-app/src/components/UserProfile/UserProfile.js b/cloud-haven-react-app/src/components/UserProfile/UserProfile.js index eb7538e..28da3e9 100644 --- a/cloud-haven-react-app/src/components/UserProfile/UserProfile.js +++ b/cloud-haven-react-app/src/components/UserProfile/UserProfile.js @@ -9,19 +9,15 @@ import './UserProfile.css' const UserProfile = () => { - const OPEN = '0' - const CLOSED = null - const [ editing, setEditing ] = React.useState(false); - const [ accordionsOpen, setAccordionsOpen ] = React.useState([null, null, null]); // '0' = open null = closed - const [ personalInfoForm, setPersonalInfoForm ] = React.useState([]); // TO DO: pull user info from passport/backend + const [ firstName, setFirstName ] = React.useState('Johnald') + const [ firstNameFormData, setFirstNameFormData ] = React.useState({ controlId: 'formFirstName', label: 'First Name', type: 'name', - value: 'Johnald', focus: null }) const [ lastNameFormData, setlastNameFormData ] = React.useState({ @@ -53,37 +49,15 @@ const UserProfile = () => { focus: null }) - const toggleEditing = () => { setEditing(!editing); }; - const clearFocus = () => { - return null - } - - const handleFirstNameFormChange = (newValue) => { - setFirstNameFormData(prevFirstNameFormData => ({ ...prevFirstNameFormData, - value: newValue, - focus: 'notnull' - })); - } - - const handleAccordionClick = (accordionNumber) => { - var accordionsOpenTemp = accordionsOpen - if (accordionsOpenTemp[accordionNumber] === OPEN) { - accordionsOpenTemp[accordionNumber] = CLOSED - } else { - accordionsOpenTemp[accordionNumber] = OPEN - } - setAccordionsOpen(accordionsOpenTemp) - } - const ProfileHeader = () => { return ( - - user-profile + + ) @@ -95,115 +69,69 @@ const UserProfile = () => { ) } - const UserInfoAccordions = () => { - - const Accordions = (accordNum, accordInfo) => { - return ( - - - { handleAccordionClick(accordNum) }}/> - - - {accordInfo} - - - - - ) - } - - const FirstNameForm = (props) => { - const {formData, formHandler} = props; - return ( - - {formData.label} - formHandler(e.target.value)} - disabled={!editing} /> - - ) - } - - const PersonalInformation = () => { - return ( - -
- - - - - - - - Last Name - - - - - - - - - Email address - - - - - - - Phone Number - - - - - - - Date of Birth - - - - -
-
- ) - } - - return ( - - - - - - -
- Personal Information -
- {Accordions(0, )} - -
- Contact Details -
- {Accordions(1, Contact Details go here)} - -
- Education -
- {Accordions(2, Education goes here (maybe))} - -
- ) - } return ( - - {/* */} + - +
Personal Information
+ + + + + +
+ + + + {firstNameFormData.label} + setFirstName(e.target.value)} + disabled={editing} /> + + + + + + Last Name + + + + + + + + + Email address + + + + + + + Phone Number + + + + + + + Date of Birth + + + + +
+
+
+
+
+
+ + ) } From a80f20db99017f0dd8f16ba42d204df49bdd374f Mon Sep 17 00:00:00 2001 From: patrickbartlett Date: Thu, 11 Mar 2021 11:18:13 -0800 Subject: [PATCH 3/7] Pulling user info from frontend dummy data --- .../components/UserProfile/UserProfile.css | 1 + .../src/components/UserProfile/UserProfile.js | 68 +++++++++++++------ 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/cloud-haven-react-app/src/components/UserProfile/UserProfile.css b/cloud-haven-react-app/src/components/UserProfile/UserProfile.css index 30da6be..a9c1272 100644 --- a/cloud-haven-react-app/src/components/UserProfile/UserProfile.css +++ b/cloud-haven-react-app/src/components/UserProfile/UserProfile.css @@ -35,6 +35,7 @@ .AccordionHeader { margin-top: 2em; font-size: 18px; + color: #254E70; font-weight: bold;; text-align: start; } diff --git a/cloud-haven-react-app/src/components/UserProfile/UserProfile.js b/cloud-haven-react-app/src/components/UserProfile/UserProfile.js index 28da3e9..d6ed450 100644 --- a/cloud-haven-react-app/src/components/UserProfile/UserProfile.js +++ b/cloud-haven-react-app/src/components/UserProfile/UserProfile.js @@ -12,8 +12,12 @@ const UserProfile = () => { const [ editing, setEditing ] = React.useState(false); // TO DO: pull user info from passport/backend - const [ firstName, setFirstName ] = React.useState('Johnald') - + const [ firstName, setFirstName ] = React.useState('Johnald'); + const [ lastName, setLastName ] = React.useState('Testman'); + const [ email, setEmail ] = React.useState('test@test.gov'); + const [ phoneNumber, setPhoneNumber ] = React.useState('555-555-5555'); + const [ birthDate, setBirthDate ] = React.useState('2021-01-01'); + const [ firstNameFormData, setFirstNameFormData ] = React.useState({ controlId: 'formFirstName', label: 'First Name', @@ -24,28 +28,24 @@ const UserProfile = () => { controlId: 'formlastName', label: 'Last Name', type: 'name', - value: 'Lastname', focus: null }) const [ emailFormData, setEmailFormData ] = React.useState({ controlId: 'formEmail', label: 'Email Address', type: 'email', - value: 'test@test.gov', focus: null }) const [ phoneFormData, setPhoneFormData ] = React.useState({ controlId: 'formPhone', label: 'Phone Number', type: 'tel', - value: '555-555-555', focus: null }) const [ birthFormData, setBirthFormData ] = React.useState({ controlId: 'formBirth', label: 'Date of Birth', type: 'date', - value: '01-01-2000', focus: null }) @@ -56,7 +56,7 @@ const UserProfile = () => { const ProfileHeader = () => { return ( - + @@ -88,37 +88,53 @@ const UserProfile = () => { type={firstNameFormData.type} value={firstName} onChange={e => setFirstName(e.target.value)} - disabled={editing} /> + disabled={!editing} /> - - Last Name - + + {lastNameFormData.label} + setLastName(e.target.value)} + disabled={!editing} /> - - Email address - + + {emailFormData.label} + setEmail(e.target.value)} + disabled={!editing} /> - - Phone Number - + + {phoneFormData.label} + setFirstName(e.target.value)} + disabled={!editing} /> - - Date of Birth - + + {birthFormData.label} + setFirstName(e.target.value)} + disabled={!editing} /> @@ -128,6 +144,18 @@ const UserProfile = () => { +
Other Information
+ + + + + + Other information goes here. + + + + +
From cf808e3457b0c71b21054418fffe7ed7366c3d7f Mon Sep 17 00:00:00 2001 From: patrickbartlett Date: Thu, 11 Mar 2021 11:32:07 -0800 Subject: [PATCH 4/7] fixed tab color to match figma --- cloud-haven-react-app/src/App.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloud-haven-react-app/src/App.css b/cloud-haven-react-app/src/App.css index c9bc9cf..d283b96 100644 --- a/cloud-haven-react-app/src/App.css +++ b/cloud-haven-react-app/src/App.css @@ -7,7 +7,7 @@ /* red */ --notif-color: #C33C54; /* sky blue */ - --tab-color: #8EE3EF; + --tab-color: #BCEAFF; /* turquoise ~same as darkblue~ */ --turquoise: #AEF3E7; From 0461a1013afb34da087af3f70f6d4ddde763bfbf Mon Sep 17 00:00:00 2001 From: patrickbartlett Date: Wed, 14 Apr 2021 22:20:13 -0700 Subject: [PATCH 5/7] added manage data link at bottom of user profile page --- .../components/UserProfile/UserProfile.css | 9 +++++++++ .../src/components/UserProfile/UserProfile.js | 20 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/cloud-haven-react-app/src/components/UserProfile/UserProfile.css b/cloud-haven-react-app/src/components/UserProfile/UserProfile.css index a9c1272..b20c1c5 100644 --- a/cloud-haven-react-app/src/components/UserProfile/UserProfile.css +++ b/cloud-haven-react-app/src/components/UserProfile/UserProfile.css @@ -39,3 +39,12 @@ font-weight: bold;; text-align: start; } + +.SettingsIcon { + margin-top: 0.7em; +} + +.ManageDataText { + font-size: 22px; + color: #254E70; +} diff --git a/cloud-haven-react-app/src/components/UserProfile/UserProfile.js b/cloud-haven-react-app/src/components/UserProfile/UserProfile.js index d6ed450..3751be1 100644 --- a/cloud-haven-react-app/src/components/UserProfile/UserProfile.js +++ b/cloud-haven-react-app/src/components/UserProfile/UserProfile.js @@ -1,9 +1,10 @@ import React from "react"; -import { Container, Row, Col, Button } from 'react-bootstrap'; +import { Container, Row, Col, Button, Nav } from 'react-bootstrap'; import Accordion from 'react-bootstrap/Accordion' import Card from 'react-bootstrap/Card' import Form from 'react-bootstrap/Form' import profile from "../../images/profile-user.png"; +import settings from "../../images/settings.png" import invisible from "../../images/invisible.png"; import './UserProfile.css' @@ -17,7 +18,7 @@ const UserProfile = () => { const [ email, setEmail ] = React.useState('test@test.gov'); const [ phoneNumber, setPhoneNumber ] = React.useState('555-555-5555'); const [ birthDate, setBirthDate ] = React.useState('2021-01-01'); - + const [ firstNameFormData, setFirstNameFormData ] = React.useState({ controlId: 'formFirstName', label: 'First Name', @@ -69,6 +70,19 @@ const UserProfile = () => { ) } + const ManageDataButton = () => { + return ( + + ) + } + return ( @@ -156,6 +170,8 @@ const UserProfile = () => { + + From 5c57d31c60ecd3bdfa07d333a5d5bb402e08c30a Mon Sep 17 00:00:00 2001 From: patrickbartlett Date: Wed, 14 Apr 2021 22:26:41 -0700 Subject: [PATCH 6/7] added user profile to tab system --- cloud-haven-react-app/src/components/TabSystem/TabSystem.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cloud-haven-react-app/src/components/TabSystem/TabSystem.js b/cloud-haven-react-app/src/components/TabSystem/TabSystem.js index 5cd4f59..a4e59fc 100644 --- a/cloud-haven-react-app/src/components/TabSystem/TabSystem.js +++ b/cloud-haven-react-app/src/components/TabSystem/TabSystem.js @@ -4,15 +4,16 @@ import profile from "../../images/profile-user.png"; import chatBubble from "../../images/chat.png"; import calendar from "../../images/calendar.png"; import "./TabSystem.css"; +import UserProfile from "../UserProfile/UserProfile"; const TabSystem = () => { return ( User Profile }> - User profile goes here. + Messages }> - Messages goes here. + Messages goes here. Calendar }> Calendar goes here. From 9ad3a542bb4763d37c6ed8e46b2aa7d43651f03b Mon Sep 17 00:00:00 2001 From: Gwennie Date: Thu, 29 Apr 2021 13:54:24 -0700 Subject: [PATCH 7/7] added caret icons to drop downs and changed button to say "Save" when editing Co-authored-by: ShreyaTumma --- .../components/UserProfile/UserProfile.css | 19 +++ .../src/components/UserProfile/UserProfile.js | 144 ++++++++++-------- 2 files changed, 97 insertions(+), 66 deletions(-) diff --git a/cloud-haven-react-app/src/components/UserProfile/UserProfile.css b/cloud-haven-react-app/src/components/UserProfile/UserProfile.css index b20c1c5..51bd9e0 100644 --- a/cloud-haven-react-app/src/components/UserProfile/UserProfile.css +++ b/cloud-haven-react-app/src/components/UserProfile/UserProfile.css @@ -14,6 +14,7 @@ background-color: #E5E5E5; color: #000000; border-color: #EDEDED; + outline: none; } .InfoAccordion { @@ -48,3 +49,21 @@ font-size: 22px; color: #254E70; } + +.Caret { + float: right; +} + +.card-body { + padding: .5em; +} + +.collapse { + padding: 1em; + padding-top: 0; +} + +.collapsing { + padding: 1em; + padding-top: 0; +} diff --git a/cloud-haven-react-app/src/components/UserProfile/UserProfile.js b/cloud-haven-react-app/src/components/UserProfile/UserProfile.js index 3751be1..b4c3b33 100644 --- a/cloud-haven-react-app/src/components/UserProfile/UserProfile.js +++ b/cloud-haven-react-app/src/components/UserProfile/UserProfile.js @@ -6,6 +6,7 @@ import Form from 'react-bootstrap/Form' import profile from "../../images/profile-user.png"; import settings from "../../images/settings.png" import invisible from "../../images/invisible.png"; +import caretDown from "../../images/caretDown.png"; import './UserProfile.css' const UserProfile = () => { @@ -18,6 +19,7 @@ const UserProfile = () => { const [ email, setEmail ] = React.useState('test@test.gov'); const [ phoneNumber, setPhoneNumber ] = React.useState('555-555-5555'); const [ birthDate, setBirthDate ] = React.useState('2021-01-01'); + const [ buttonText, setButtonText ] = React.useState("Edit") const [ firstNameFormData, setFirstNameFormData ] = React.useState({ controlId: 'formFirstName', @@ -52,6 +54,13 @@ const UserProfile = () => { const toggleEditing = () => { setEditing(!editing); + + if (!editing) { + setButtonText("Save") + } + else { + setButtonText("Edit") + } }; const ProfileHeader = () => { @@ -66,7 +75,7 @@ const UserProfile = () => { const EditButton = () => { return ( - + ) } @@ -87,73 +96,74 @@ const UserProfile = () => { return ( -
Personal Information
+
Personal Information
- + + + + - -
- - - - {firstNameFormData.label} - setFirstName(e.target.value)} - disabled={!editing} /> - - - - - - {lastNameFormData.label} - setLastName(e.target.value)} - disabled={!editing} /> - - - - - - - - {emailFormData.label} - setEmail(e.target.value)} - disabled={!editing} /> - - - - - - {phoneFormData.label} - setFirstName(e.target.value)} - disabled={!editing} /> - - - - - - {birthFormData.label} - setFirstName(e.target.value)} - disabled={!editing} /> - - - -
-
+
+ + + + {firstNameFormData.label} + setFirstName(e.target.value)} + disabled={!editing} /> + + + + + + {lastNameFormData.label} + setLastName(e.target.value)} + disabled={!editing} /> + + + + + + + + {emailFormData.label} + setEmail(e.target.value)} + disabled={!editing} /> + + + + + + {phoneFormData.label} + setFirstName(e.target.value)} + disabled={!editing} /> + + + + + + {birthFormData.label} + setFirstName(e.target.value)} + disabled={!editing} /> + + + +
@@ -161,7 +171,9 @@ const UserProfile = () => {
Other Information
- + + + Other information goes here.