From 549f16abefe7eee9a40429a12d89d31fb2bf0f4d Mon Sep 17 00:00:00 2001 From: gblessylva Date: Tue, 2 Jun 2020 07:11:48 +0100 Subject: [PATCH 1/2] FEAT: Investor Dashboard added --- package-lock.json | 35 ++ package.json | 3 +- src/components/routes/afterAuth.js | 4 +- .../dashboards/investors/MainContents.jsx | 185 +++++++++++ .../views/dashboards/investors/SideNav.jsx | 52 +++ .../views/dashboards/investors/index.jsx | 18 + .../investors/widgets/investmentFeeds.jsx | 82 +++++ .../investors/widgets/topWidgets.jsx | 29 ++ src/components/views/dashboards/sme/sme.js | 8 + src/index.html | 2 + src/static/jd.jpg | Bin 0 -> 28237 bytes src/styles/dashboard/investors.css | 312 ++++++++++++++++++ 12 files changed, 728 insertions(+), 2 deletions(-) create mode 100644 src/components/views/dashboards/investors/MainContents.jsx create mode 100644 src/components/views/dashboards/investors/SideNav.jsx create mode 100644 src/components/views/dashboards/investors/index.jsx create mode 100644 src/components/views/dashboards/investors/widgets/investmentFeeds.jsx create mode 100644 src/components/views/dashboards/investors/widgets/topWidgets.jsx create mode 100644 src/static/jd.jpg create mode 100644 src/styles/dashboard/investors.css diff --git a/package-lock.json b/package-lock.json index a57fb07..f7c493a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4341,6 +4341,11 @@ "once": "^1.4.0" } }, + "enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ=" + }, "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", @@ -8050,6 +8055,14 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=", + "requires": { + "string-convert": "^0.2.0" + } + }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -8644,6 +8657,11 @@ "minimist": "^1.2.5" } }, + "moment": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", + "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10664,6 +10682,18 @@ "tiny-warning": "^1.0.0" } }, + "react-slick": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.26.1.tgz", + "integrity": "sha512-IQVRSkikG2w5bkz+m9Ing5zZIuM9cI+qJyXG2o6PXHKj8GFcsMCJoTBADwyLSsVT8dHcZ8MZ0dsxq0i0CKIq+Q==", + "requires": { + "classnames": "^2.2.5", + "enquire.js": "^2.1.6", + "json2mq": "^0.2.0", + "lodash.debounce": "^4.0.8", + "resize-observer-polyfill": "^1.5.0" + } + }, "react-smooth": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-1.0.5.tgz", @@ -12092,6 +12122,11 @@ "xtend": "^4.0.0" } }, + "string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=" + }, "string-length": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", diff --git a/package.json b/package.json index dfada23..18d6839 100644 --- a/package.json +++ b/package.json @@ -37,15 +37,16 @@ "axios": "^0.19.2", "bootstrap": "^4.5.0", "jquery": "^3.5.1", + "moment": "^2.26.0", "popper.js": "^1.16.1", "prop-types": "^15.7.2", - "moment": "^2.26.0", "react": "^16.13.1", "react-bootstrap": "^1.0.1", "react-dom": "^16.13.1", "react-redux": "^7.2.0", "react-router": "^5.2.0", "react-router-dom": "^5.2.0", + "react-slick": "^0.26.1", "recharts": "^1.8.5", "redux": "^4.0.5", "redux-form": "^8.3.5", diff --git a/src/components/routes/afterAuth.js b/src/components/routes/afterAuth.js index 4c31713..e59a181 100644 --- a/src/components/routes/afterAuth.js +++ b/src/components/routes/afterAuth.js @@ -1,11 +1,13 @@ import React from 'react'; import { Switch, Route } from 'react-router-dom'; import Dashboard from '../views/dashboards/sme/sme'; +import InvestorsDashboard from '../views/dashboards/investors/index.jsx'; function smeRoutes() { return ( - + + ); } diff --git a/src/components/views/dashboards/investors/MainContents.jsx b/src/components/views/dashboards/investors/MainContents.jsx new file mode 100644 index 0000000..0e57c82 --- /dev/null +++ b/src/components/views/dashboards/investors/MainContents.jsx @@ -0,0 +1,185 @@ +import React, { Component } from 'react'; +import Slider from "react-slick"; +import TopWidgets from './widgets/topWidgets.jsx'; +import Feeds from './widgets/investmentFeeds.jsx'; +import thumb from '../../../../static/wefinance-logo.png'; + +const details = [ + { title: 'Investments', boldText: '$2000', details: 'To Amount Invested' }, + { title: 'Returns', boldText: '$3000', details: 'Total returns' }, + { title: 'SMEs', boldText: 15, details: 'Total SMEs Invested' }, + { title: 'Widrawn', boldText: '$1000', details: 'Total Amount Withdrawn' }, + { title: 'Account', boldText: '$2000', details: 'Current Balance' }, + { title: 'Next Circle', boldText: '$1452', details: 'Amount Due Next Circle' } +]; + + +const feeds = [ + { + title: 'WeFinance Nigeria', + thumb, + feedStatus: 'Invest', + paragraph: 'Lorem ipsum dolor sit amet consectetur. Lorem ipsum dolor sit amet.', + round: 'First', + completed: '10', + pending: '5', + investors: '8', + raised: '$60,000', + needed: '$100,000', + return: 10, + Srates: 85 + }, + { + title: 'WeChat Global', + thumb, + feedStatus: 'Invested', + paragraph: 'Lorem ipsum dolor sit amet consectetur. Lorem ipsum dolor sit amet.', + round: 'Second', + completed: '20', + pending: '1', + investors: '8', + raised: '$60,000', + needed: '$100,000', + return: 10, + Srates: 85 + }, + { + title: 'FaceBook Inc', + thumb, + feedStatus: 'Invest', + paragraph: 'Lorem ipsum dolor sit amet consectetur. Lorem ipsum dolor sit amet.', + round: 'First', + completed: '10', + pending: '5', + investors: '8', + raised: '$60,000', + needed: '$100,000', + return: 10, + Srates: 85 + }, + { + title: 'Andela', + thumb, + feedStatus: 'Invest', + paragraph: 'Lorem ipsum dolor sit amet consectetur. Lorem ipsum dolor sit amet.', + round: 'First', + completed: '10', + pending: '5', + investors: '8', + raised: '$60,000', + needed: '$100,000', + return: 10, + Srates: 85 + }, + { + title: 'Glo Nigeria', + thumb, + feedStatus: 'Invested', + paragraph: 'Lorem ipsum dolor sit amet consectetur. Lorem ipsum dolor sit amet.', + round: 'First', + completed: '10', + pending: '5', + investors: '8', + raised: '$60,000', + needed: '$100,000', + return: 10, + Srates: 85 + } +]; + +// React Slick Settings +const settings = { + dots: false, + infinite: false, + speed: 500, + slidesToShow: 4, + slidesToScroll: 4, + initialSlide: 0, + responsive: [ + { + breakpoint: 1024, + settings: { + slidesToShow: 3, + slidesToScroll: 3, + infinite: true, + dots: false + } + }, + { + breakpoint: 600, + settings: { + slidesToShow: 2, + slidesToScroll: 2, + initialSlide: 2 + } + }, + { + breakpoint: 480, + settings: { + slidesToShow: 1, + slidesToScroll: 1 + } + } + ] +}; + +class MainContent extends Component { + render() { + this.name = 'Investors Dashboard'; + + return ( +
+ +
+ + {details.map((detail, i) => )} + +
+
+
+

Investment Opportuinities

+ { + feeds.map((feed, i) => ) + } + +
+
+ 1 +
+
+ 2 +
+
+ 3 +
+
+ 4 +
+
+ Next +
+
+
+
+ + + +
+
+
+ ); + } +} +export default MainContent; diff --git a/src/components/views/dashboards/investors/SideNav.jsx b/src/components/views/dashboards/investors/SideNav.jsx new file mode 100644 index 0000000..d1376e0 --- /dev/null +++ b/src/components/views/dashboards/investors/SideNav.jsx @@ -0,0 +1,52 @@ +import React, { Component } from 'react'; +import { Link } from 'react-router-dom'; +import avatar from '../../../../static/jd.jpg'; + +const user = { name: 'Funny Doe', avatar }; + +class SideNav extends Component { + render() { + this.name = 'sidenav'; + return ( +
+
+
+ avatar +
+
+ Welcome {user.name} +
+
+ +
+ ); + } +} + +export default SideNav; diff --git a/src/components/views/dashboards/investors/index.jsx b/src/components/views/dashboards/investors/index.jsx new file mode 100644 index 0000000..940fde5 --- /dev/null +++ b/src/components/views/dashboards/investors/index.jsx @@ -0,0 +1,18 @@ +import React, { Component } from 'react'; +import Main from './MainContents.jsx'; +import SideNav from './SideNav.jsx'; +import '../../../../styles/dashboard/investors.css'; + +class Investors extends Component { + render() { + this.name = 'investors'; + + return ( +
+ +
+
+ ); + } +} +export default Investors; diff --git a/src/components/views/dashboards/investors/widgets/investmentFeeds.jsx b/src/components/views/dashboards/investors/widgets/investmentFeeds.jsx new file mode 100644 index 0000000..5db5c34 --- /dev/null +++ b/src/components/views/dashboards/investors/widgets/investmentFeeds.jsx @@ -0,0 +1,82 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +class InvestmentFeeds extends Component { + render() { + this.name = 'feeds'; + + return ( +
+
+
+ {this.props.thumb} +
+
+

{this.props.title}

+

{this.props.paragraph}

+
+ + +
+
+
+
+
+
+

{this.props.completed} Comp. M

+
+
+
+

{this.props.pending} Pending M

+
+
+
+

{this.props.investors} Investors

+
+
+
+

{this.props.raised} Raised

+
+ +
+
+
+
+

{this.props.needed} Needed

+
+
+
+

{this.props.round} Round

+
+
+
+

{this.props.return}% Returns

+
+
+
+

{this.props.Srates}% SR

+
+
+
+
+
+ ); + } +} +InvestmentFeeds.propTypes = { + title: PropTypes.String, + thumb: PropTypes.String, + feedStatus: PropTypes.String, + paragraph: PropTypes.String, + round: PropTypes.String, + completed: PropTypes.String, + pending: PropTypes.String, + investors: PropTypes.String, + raised: PropTypes.String, + needed: PropTypes.String, + return: PropTypes.String, + Srates: PropTypes.Number + +}; + +export default InvestmentFeeds; diff --git a/src/components/views/dashboards/investors/widgets/topWidgets.jsx b/src/components/views/dashboards/investors/widgets/topWidgets.jsx new file mode 100644 index 0000000..9f82d62 --- /dev/null +++ b/src/components/views/dashboards/investors/widgets/topWidgets.jsx @@ -0,0 +1,29 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import Fade from 'react-reveal/Fade'; + +class TopWidget extends Component { + render() { + this.name = 'top'; + + return ( +
+ +

{this.props.title}

+
+
+

{this.props.boldText}

+
+

{this.props.details}

+
+ ); + } +} +TopWidget.propTypes = { + title: PropTypes.String, + boldText: PropTypes.String, + details: PropTypes.String + +}; + +export default TopWidget; diff --git a/src/components/views/dashboards/sme/sme.js b/src/components/views/dashboards/sme/sme.js index ee68f2c..66bc6ed 100644 --- a/src/components/views/dashboards/sme/sme.js +++ b/src/components/views/dashboards/sme/sme.js @@ -7,11 +7,17 @@ import Transaction from './transactions'; import Investors from './investors'; import Tasks from './currentTasks'; import equity from '../../../../static/equity.svg'; +import Sidebar from '../../../navbar/sidenav'; class Sme extends Component { render() { this.name = 'sme'; return ( + <> +
+ +
+
@@ -30,6 +36,8 @@ class Sme extends Component {
+ + ); } } diff --git a/src/index.html b/src/index.html index 9ca1657..3a7b6b2 100644 --- a/src/index.html +++ b/src/index.html @@ -3,6 +3,8 @@ + + Document diff --git a/src/static/jd.jpg b/src/static/jd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25cee9b262d1e073f04a6559ef5d3f9078048d43 GIT binary patch literal 28237 zcmbTdcRZWz|2CekyDe2kjZ)k#s&;GF%BOW(Rn$s|k=B-!RPC9&1FcyUMNzdyq(%fm z+FG?|5=5w7BZwJdJn8rQJiq7n`u+8Lo=b9GuUuz%H)_mPv)lV5-<5A}`o z0jEv@0H;_#fRkf@rmltFeJe8yjlbPp!*)Ue=mO51KKofj!{=!8z zcGerPR{*C^ojG&*?3q8Gn)U8*);!=W*E#MRcklnjWB&B~O`ofZFO%{vh&`zM&TBEa zA+F@~;?+eqK7N5~f)ckRZ%aultEj4}-_y|jM^E3t(CDG1l{E-#V+(P1admU|@PzsL z`3D3B1&6$T6B!l#_FYVJ%7@gn^p6>tU-AnIi;7E1%c`ntu(i0l`i37Zt!?ccKRdgI zhDV4b^61$3^vvws{KDezrDgi&*7nZs9%KLDPh6(}XZ|}Z*7)Cn{eR-(V#Rg(?AbGC z&;N<*)agLh^9CXX$ktD z(Ecm3|9^qK`oD_o{|W4W$2AVPbmkQ6=AGdJ00Dl_i6zs;1{{zCLHebr4i1y+5-`JQ z6ua=5ucNal^A6Jl(RJ$*+Hc;d4q+RcKU3x{_x1dv%4JoYG(#${E1v?X!+x}Y__!=& zmASz-FxNj*H(UP0OA<_SMzM1kejPZ6y!ok;7@1ID<8ixq-YS;E-Yx_yoPkL90=S}^ zjD%ymH_O%#YeXb}5aq`SfK%3`fi7R~S=gFw;i-fC32uQ3oB+IX`5BaUFhsN^{=T0u z8}L0;`g|~wvj4Kp&%9*>bEtBxZ;2A{*V%HA5Ae#d^A>Hf^75`(VWMI~9UcxX&x{3{ zTvBwMJ%~AMr>oKA=#V{KB)jn}9N#7jvOUDcSN^`H4^P?X%f~R-y4G!DZJV$Sjg~x* z#3lRAV=NuxUNoRXd+is3>d+QI$Sf`fntCfn|9A$cyihq_*3(r+Ra1$$_Z!I5_;eb{ z(^9bnIa&=IXl6_rWweCyipMNP+z4}`BNGs0FsacXP-3k=z4Lv08Io$xh8*(`M)#n% zq-`RFB=JC-@zym8E>o~~c;1x){RGOz<+f&oU2eV>?4?7T+czrTT5Qjcn-%hP;Qua4 z!P#zb^v)M29+PL#^4?E#B%m5+5#oxg>g7CmArYXmOw%m~{ag7c9mL zGK4!BhoHojxqC8hlvU|MhIF^AZEqBb-7CYFOaVYa2FpocL`?wdNdtC*l{$DGdGH~`TYiSE+sw2lr(*yxg>M*_k z*YbX<^7LtGng&~?HS084E(=^8>E>iApNoMbKw?-0P(BtI$bd`EoKMsOZe;zyiHOlv z$YXwt2#2z%#`g!OOk`qABmz9_!*fk5>zW!fyq?kW6?>IGojcvE!^mca#4@kdaGv_D zD31#M7?mG<0+78b+Ke~D26wb6jCZ%?^80CaOA-ADYrp&AsNW|yPT92u{)4W7G9C=rUgDMk%1yfi{;wb=yi--$$zdQ zOR_<(+qMkSqiLjT(`cdo3H!mB$BYy!cq!j)>&!{f4>HKh8YIsTRo{WFCo6OlLQ71>U9NNrk)YP>{woRkhxI3w!DHzNzVB zdZ7o?qBrq_1^j-oyI-J)C}Vzhoh?X%72>2Mez@l2yb^nm&t8B1HB2?Z2{8^^ocYH$ z2-ubxoq_&=r^&lLxis4xzOpqRF?(vnS3jw2(jz3bIj`8!=xHdscS4Ze<)X$3Q*K_T zed}E0mg?(?BWzu@bWb@RQqsv0_L6xkVhoofMh3Tta{IS?I-ItF_6|-Jk@qk)Zn$F! zS69SG-nl!Nj877#rizgKLLKMJf7bX3pxTbxj zoO*8i3qY#*2vK6xbP$Zt&0yrwEn9$p9V)3}W`us`r+YHxl1~8T^$}g?B4A<97(`5% zFMWIx&h1qdX_i!|`{O>zd`GoZYi3ptl>>EBIode>! zd8(gCwg0E1$vn2DdeTT_pHFT%!fmn8y=z=UyWr+tWn>*~ky)&~7C-}rG-zVj?w@N^ zEZpqrDY$CW-<_ZYLLVv=Vn6f;m(;xYcmnW?RWK8v4R&-tZY|}4|j!$lPUOfQ> zF4>VC`Rl5YGF(3?%?{<4r&p{chZf$sOtH)Ne~7Oe55N8VNtr$~Lvt5*cs}!8C4Pa4 z_0N;;-rR=71l6*%zy`@nsPtw5J~fqCTQ{e;0p{HUuVR?byMuiT7@{4XX9HFQaFrv| z4i(UUzv%Xc-KJ-w43isO9aUYDRVOMMuNe3^Mo4lB(gP=!V^<^QdM}y~TFdb-cU4Rc z;R}hQzPp*wcMbpKaL`Tju1APtM>BmpJH}_v2rM#C%b~HpJc=6o-h>~-&7s&gpIqx3 zMp`mO*NC=aCjhtFThZ&**Tg8tG{b8z{u_&NKx$dl1GUFSiQ+1MHZsEqSh2X@RhLc< z%VfdPWFT|7v{(4-$1MY^g?PJp*ytZrYA(HP%j8ZXUi)xZP6()#7h@80dMxKDn?!Es z34Lsqk3e`A5&N95O7dz&Dp~4k4+$)f+#S5+|3ZC5$p`fYb>)ZMx@A6YzijT#z>TjZ z$23TShMx~h)_rz%PAHeXS&$(3wRZc|b)T58l_Nj33NWnc0SAx%_EmmQ9Li-My#1lzp~tQulEOluvs>>qu9@Nx&!gG`*dR&lHp)D0mQ z)={T>6?HueYy$eldc~&L;1dMz{zP*s1o!WuO7K}y07VE?XU`=bKO}ns_!>g~88YA2 z{Cb*cy=k54Kc0`PKa`pHHjQSEdGBgHvv!wyVc=qk!>Jy~4s}(k)O2rY-Z=r-P}R$+ zmxbW%34K#9=3@}c0y*#(K+cJv=oZwR!$0NmP1$vN9i}pBx=q7}H>R1zFC)gvf6hOm z5CS;|{4hQ;#a{i|OZBZVsK*FG$XP8pexBcEQyti5*N~Q7IKEU%w|_Kj+W(PT^pQUd zrSP^Qtj>O)t3k@vDPCW^v(Jz>MYV9(X4)muH!xruy)XJ%a!?2oNhEx#8uvsY&c44; zs2H*3b6#81Dj;yE4bk)d!64=|@0q}P`-#lzE}?~S%+dI>^j9{sHzHi^d91!fd-|)b zVcG2><0~?Xyz5d@GAs6WyZJz>Zo+5$A)RjWNtmL0C9`#INmb2Gi|28?AvbQTdZFi@ zD|uNz0gJ(AS1jbK!y{wi+klfo-gI^Jx4y3qApKpgyHonDiqV&r zvYi5zfm9=jt0sQ-il6Hu zsA_nhLA%XP4DloniiFSYt|z3L=dq!4n;cRX68Y8}35s+q>ZTV5iCVZN_9VWhXgyc- zVV6~3m;dmTuH?g!b!F`blP3VvhRnX>v6k-Wb=q+p<)bB8mPx1A zfi12NLh>7wOme?g>)LJ^STc;;LJ+Oc^B%`igA|R3Qb651WQ-R5^?I9`vdWgE^?KRe zxdc?FXrZSO2iW8Ht#}M4Hna+Z-3e;3sqMe*$21rlhsxb$bjCX z{IZFxu?+A{BZ_?cb3eXuv=XpYL-Qg7=J=O&Bf*`pgS?;2Sf3A`|XYVgGT#YE-N=WDe{ z0dICBFSwyWQAR&d)**mN6nZD*8+rl=_&CHnu1a6AeHebZWXRY`(nmqh;~*kqd6g9-<}(5+gcuE^#ON^2 z8Q@hDK~F)6ovmu;y}QDxOA*3HDG}m~FQ8ba=&Ghh6S?~kb!|qHvlInq{6LZ^W}<~Hzi(TIDYjh^~vF#<&p2k zvxL9D3*h{SryVxyt<*1y+syC>prEqdjxSgrZ0kD~pH(^GuIP<@)dwqQ_| zT|;?gjms|LAx-Yt2>^Q|$#M3D-d1(hzjrj*I>^05@>nZvL4c?09hnj3Ypz~giIz?a za34i(m;mF9L<-Bo?uN?PQAkJ69#r*E|v!H`!8;&mh*Nnu>GUqKWi_mFVEc_c21};5TMo;jIdz;)48Zc z*gi_*ujoILUE|qZ;?LQ#+hS2gHU^W&(#h(uR-fThl`WRC{x>^V!#@-8Pxs4M*Ya69 zU-*vL*3GZ1;zy2|JbO@%ttd0kD)TUwF+UTF;0}tlpxaH_PXv#D=tnF%%SH<+(K3%7 z9OY@<_nPK>86i7@aM|?gIV~n#%eJO|jAeAp^m8LUCR9o(5|M=Nv*8~uM>Un#rYnC+ zloZlb5zR<1hx2O`4jTizXi-nldp0}e?5LKj$yY_?Rp&kB*L5~o8t_qIdFL&mDts0; z{8GV}a+bPTTk8~gK)8d*BA~&+iM^RI#;>=+dd>Gcjux1B_(ju>Ji+iz!Cy4W-YZht z>(9%Mx9|!5kA@dVB$25g74_Z_@(<`(EQCIdBM<{^mik)u>`Zrg_X1l)Ux%E3rChhV zy`nz5ITFSUc3yGhlTnTo4amW4XdlXhmYGClXsphChBK2rD5dQL&_tFeRHeiju+2B@ z^@c}o_G#O9f7vm5NyP`M^1R9i)3soJXKMKV`M*%Q{mjynP4rxn*G>YaX4yK0rs!bK|sy z!On9O)#Ejy&j8lW{^yjELUHf#c3Ea^dhq8dBiB%NyNQ1$@-4-lPn@-OK3rM4p^4^9 zM;W!@*Wi?HZe`f8beSK=Cr}F1pkzN6?ho8DkK_8?=vv68cU7Wj~pCP3L#b>4(6J1P=^5BWfe5(B71kf?>+5Rv>@r!Ml1qm=EPT{7Z?EDEF>@vd~+& zj>pR95xE~d-9p}Gjqyj*ER2(XR*&6XNMI%SFe72>WR3SqE(xXo>&1n;3l6N*3Y)9! zk5%^1Ws$`n>A<1~djs3RD+7NC{~$U1I9i@)NL&YLk03)zuk=S)htwl3cRlkV{&p@^ z6Ta^Mg14wc*giqS^{h{3{dK=lXH-&))v4=9ITm;DX;fbKe<1j$ejCZEeK}=_v53Zw zlICh%)WHGC+?3-nX(r0^`(xucm9xUH@_^1SA`Y)&b|YiKa9~uX1c_oNlst|K^t^kF z`7N`xc|1*2&F;|@g>6IQp;vCQvV5hs9BG?zs=x7Knm|@I>f3SZd|-;s!hXOB01tf{ zRa9bbzB01mDhbI?kujW7x&vh{qr545=_{u069GBcOYw)m;AYybzTbMuy4Tae=HC(Q zCNi}|y}3%29rslxQ^7!sbbxvH)b`edh>)8j|B4mCo%3b)`SclKS8!ia;C*(53CveN z^_kb*)(&-!BF*4C9ZjCYA)?kVze_N?Vl9nL28NBRqevW;1;}rx@rHO&Q5ixPfm#+2 zMBS2KTqBmk@T#;!)WT%(pj^4XpxH+4`iB!hNJG55Gf&u*5?HBVwmXr5D!^Lr+d^ty zzDXX-mT3A$!66_+xc6R6!iM1YYRltpP$6ER*%gtA|2r7V8*d7vdasz*c%J}PM}Uni zT=^nHijoqhGMZtdtr&5nDhZKUy)I+nDa>mdKoZ{FbK6HrW&M*cCQLN2c)Wu5GEt@o zEg+h#*VKaLwp6F~P#Mk95VB=DQ7k^+jk2Y-hk8jYr_E>n;|hH~)#lLNhI%?V>y;b|K8S>-E2h-%a845v%zY}IXI(q9A{wj|8B_n^-({fZ+J!^Jh*%3fq7}^mSvlZI22uKQti`>gv zTU#7VYo6q_`jQzU$^nXf?E|-jjWzaSs?QIW8QF|c?Iyk)4j5lA15%$L3te=BrWATN z)nLs-D)Wtbl)$clL+oI|%bxH>?*u%y5L zfb#8ZX+9+Ha+JnKE~TY|EP5H~77m-~qL(B5rF7ba+8b-18}@t4Oywms%bWmSePz6S z)_f(%OqW~wsM_^jJIU|?cnldj;;Lo)J{soRo(7^ln!XW8L|WX7ka59uJJz&k*lFKOwa^ZgW-?H4zubM z&}=rWK&xp=y`QJ!9OEZPW;WHQ(JZk5caU}}gHz)WUEc(%|yvxh1*<;+G1d_f$`pkB4bp~CP@D>}>ECxCTOwLbp~3{^$n zaL$ug*Q@tYt+edoLbWE&`d<2;*OoVQjcnpyyqb7a!OX1B>Mk+QAp8QZl9ltFgET+& zHC@{rOF0^!b*T%r&2pCET~^(4I3KI>Q&vrkdjC3V3ovxb(RgNE)OM+M)Bb)qZ)@@E zxnH!yva4DNsX(Q#4MY)ZD~~`;R;35S+dpM*;DdOc&P97n3G|cZ+`^n0(E(~V=ZV`D zZdnIWe(qLKz5xZ4*Wapc-4~Nye!LS&m@g5@*(oULVxxKZGX18c-BXW;pqHHJ-dWd^ zRL5vrbG_82_%H`$#ZgBi_;bALyBI}mL>!}QMm;Y>1h^dx_IpMJQ&ylNhkhG|xDj#E zvsnt^2!`3h1j@ClFl)E9;{17mlMD6CvP{`@1@@0!v8#_W9$B4)kkN_H@L*7=^5#nOvd85T&pjH=~p@M}yE1ssS{9 zstVC|;h5`qpqZDvCgv&U=9Ro?0I zpD$@fmWQ@+HsIvb=V2X<(6kKMgPSU-$7o$P;!jY?M5YQ0&eqeACbpyTCnkc#pQJoi z|4ER@<1>hUg!%_=p|A&ga}QLmUqggsfJ)e}pu<>&-E*PC5a{Vc?I!j;mGch*=*J~{ zm?rcAxevKvp3BiW10B;Uek%P1jic8g!fODsqy+} z&4Wc%gZE)?P5}O>rNzn?6Fc1!hMfo5Q6_%(urhCPr7b+^mmQLkPRTdIao}}!HmAPh zAEP8X_6jIa%OHI+4TR!WOQXDYYqk?v7hApqdaV7h1KE>UZ+mxDNM$G}{7F+}Y5_Ef zz_v*>Zq;p3e6*J$`__30pW61~MZ^%9^Ll1rG@6#_vzfJkNYmi0$}zY+=#igRgbg#^J*cr#6RFCS+!^)n=~-Ttb($_?A1U^+?oBUpx95 z0@e$r!)->&XM+T9QHI*d^P;hrxIiVQ;!Fs_cP(DQW@{D%nuy)vo&decthAZ+qgFP1 zQQ*@8#~N@AJxr49q_O0Nek)Bh-gOCB!&k{ygHs6C8k9Wf&suk9qK0aAtp!IPmMb`K zJ54=S{ZQJg-j~B(1!U> zy73VSI#X1pEMZpKnAHSXj*Me7e}o*%QDLDa1aSCUD_)1q;_y*aY5nn2^oNRFY z0--V8hg0m}3G%|1yOyb=s7uH3M}w2qmp@RSCaGA z$1HmK1*{fmmhRZ{mz^DKek}mm!uOi2(6J>`o zpe+;yVmn5Zf&|qgy6FSUMyXGSL9(Y=E2+P}5!!S#0uhRG2Kci(*nr#1Axh zQ3Gh}NZ7Uv=$TD|MiUz`2vqR^`yZP~*c_ZiaV%DQZ-}xm5Y|v(^~67)WAWMBSyp}0 z>XwGev7kz?R}RKeJNU_T3O`j>piTZ-d>F0 z3<^wE_1VT`i0`wMau9f+{h`&Y_=`5>9qp`NM+r>zG5&c^VC*P)SVYtuE?BWHmn%Sp zY8~=pDc50Tl*X3$$*AVCK|lI&!g5zB4ld(|$!hPEju*Wj3B^C6PbCgaIF5H{?Qw9V zQBlGKI@dZm^VcySxu z&|03c!Zp=`E%z(!WzeEfw#{HI9{Ja$vixbd=a`IIvEXa^?+@a9Y?^uKl5Oe3{+z-= zmKH=(w_&d9WS-~;b9?7FHS!Qa59msW3kjq}Z-kl;HToCY!UPvmnJ84Qf=C$B-&LUF zUPYl%p{v5cLYi1=(F}TSEv(~LF8c`pW+2?q>#8y*SI<48Z(w->IE8_2AfxB8BdI%{ zIG~Uds7p%Z%~r1^xtaU-BsX30_g=E%lCNsFaYdxhfX{?={0p+xhNXOV#1!mhGu*g+ zxl2>DFers&sz?L>1J0?0nRlUjh zswNF#hQESXj>qKqdf4#YocmY%*Hn7#h(kgyX(%YREp415F)Q@>SDdS3IlO0% zUW=RMu$VO+65CvN+Rv-DzO{gOu0snEpW^VU$y#yHq#2`wek|YFYMkisDA>h#j3{WS zF{KYVNsX|yJ21hGIH|^D9k_k1`ZU{gnlP=yelu!gMxOoI9q_65jyt~{>byu z-cP}?&mK>DnT9{-c(E1sA4dH~GZi^~W6(WW;(fR5u+&c9Uz*@IjPBX<9cJ$amvb~? zA*8h$yp*cF{aB~q{b#>6ODjStS#YskdOyC?I3@v%xL7iD@Dl@lR4g!VjSzTkvtAppMv@QLK>N8>AG- z`d;|wTvFrt-6)2;&jz7`J1Frx^mhZ|qu|U64Vu z=wR!ot5i(h%3xVpOSafN;jIYIh@aUNdt(HC6|*IJS6@+si>6-+mmo#q^C!yj36mKZ zdph~eJXs+>M}KoBdcjgc$Zp7tXyj zvs7dQyx+Os8@oKkD;qIfBKr{kv9f>K(egTMYMt$1S@4JKeoWtRvimS_!|a~&+)>$~ z;`o=fw|caZ0E7I0${A@}ruLRcYERCG&92W{>&+MeUe8Ag?YS@@LcVwaZXa`C%hm=J#}%*QnE;PU=#o z17Yl`N1AqXRulZzRLgT?zh14-X0I0iU@z^YCB4G(S}n;IIj`ydE3g5@qXe5`p6^&B z=~4*Ui>V)^V0Kj4%rjc_8g(B&6E6bAj@wSE9c=P@CW@V55{H7izulee+(iW)hvPZB z_fRPV$Gqc^DWhQ7T(!>x&}TJ=|*G^pWN+a)V=j4W~xYGB0oEGtroO>2=|ro;dvz z+4c*=l&;e+Jt5tHHI&_JR)?t4@n%M!!X$y6Rw-4!zqQYKY8g*zCV#c6&8qKZ#H`pe zQZUkO&Ys0flo-tT)$ID&!1HJ$I=A{Z;$lm|a*Ar6zf*o^y<@o$ZVB>!3CE>a@NDpl znr6e+ioIDvMdZ^PiwkdwWYnX~e2ORRaNW6GmB&|>K|U(6 zrYP}aw+WUn<$$!;W_S+1PuKo362lR1~$?Ouu5)5+l2bJcJHCk`XZ&S_v zd(S&2xpIepvGG<6)_UTM^>fsq2jtShzb4VYfIOZwj<(kO`Hfg+th8|Va!5>y*_#zr zO-erIGFBoty0>DEvJl+Fxd*S3w<-+M6w~-nI&(AC0WwD07tIMt|2INB2x-(jD936r z$@#@*usc8?U$6A}c3(=I!8|{De|&ujdC^-z%X5ZW8}gy@DBXCFeB@$0P%V(p+AI>%V3ctUhN^hL$a> zm#WsgXdHS|1|q#tnFvJ(OrF82av+Mz_MhL3ju&FQP>SgsiV$Vl{aA()5w71nGj6gZ514hkEu^_RTBd=I(a|E}gL4(CqUM6zlXk--WvvNKhcS#U2< zTqSe~svGpZc@SRNJge|C z`e)Fn3SxAq#r@b|8=M0Qw#7h+%&r|yg}f9s)yKXN!Gc)wb{oxA=_x(O3(}}(BYv@k zsj%pgrFiH3on-Z~PeFMPzozD$jkWxftY@l}J#0&ehqc1Z%SHy#HrEw8X!3HhdmhblAEo@C0c)MJ1bKu7MFA9T;Oz0m7_kd+M`|3u|$&;Fui6x zzEQDCuE1A0Sv8PPq#3(Mj-H;VrR~{*)4a`8=nAV5L&l#++ZybG=ic#JBD!xDBioyo zhXU-{@y#HLqr40xZs+UTfZ;&0_GY*S*1+d)3eKBlO?ZS$!mDi^?^wIa9sgc;49m`m zM)MYZuJU$3@7ZBB`b`pSb)fBUoi9@|v9eDM5b5(}77G(FzR^m!Q>xrY6zX^UghwNeQ?|;Dd=i!FeR%%%o}5qw!73@36NKh>T`B z5JJPEH*1n{JsoIYHINRXhmwKBAC1p{*iZP_k_xZSEh=I5vRZ=Gj@i?};-UU8BkZ>! zbAD5tYp&2~ZIi%E?T=sU;sXx92T?6mT(UI&9&R+{pBYJnv-+-ksJ1X6pIwKiw#`eh zT}*73YjxImBj{sEeqWiMY0tjP>8|^CZsz2T&$1(Wa z8ir@}nfM@;fT-oSS?P_!Q z+!ErNcZM6A(mr|2e9t*>bYHMy%YBt_$dmu=F++0~I=DXVF=^rxKT(d_n)~%D^FYJ3 z!r+%$i_!+-7bY@HR5r(-lV=o+6|^k5O_Cx!#;%bU0Tp2F^-h3dIE^JcXzzDSl&pAOMI>dsDyMDejo$A zM451m*t8k_(d>*Yp(VCAw>ORyyi#{{C@*iMEi~WVF#C~vHS8QCGJIMNG8wd5UNK+C zV@RNH@rX|FtaqsF1nw57)qXw1+jU=qzL4o@!*|w%sGB6Kp?3;gy{43aro@tlWG$o& zvP$o{qT_{vsjV=A9NbeatKj&S8%CmbZ2L+Kwr|#~ZYzMsY_ApD=bwjuB+C>{@`D_v z+S>d;RpCS?K>=b^1N&w4oS@J{O!q0y2n;0~apcgN-4{WEJvt+L)D_5!dV$HFE#MVT z9cv7$TE&Du+`^-uNOXMY-3qimmfpn(8z7z*_G}*0xB|gF4UaT1Z?*J%eBjRq8-|L74V|%GOZo=vn<5Xv+v*OWY*W^eL)TDN!|20U$qo^@U$Mg7B zzdfk-bzT;6U(A#L1aO}hZCwLeP@co4jBbg(KL%1@;;;4``LIl>wSZ?#67t*PIScT7|~Uo;o(h!>x`y{!|&aCTErW;ldS zM}~}q*cu+MlNv>Lo#{?64UMsW$%B97zOo&_1ayC(PXLML0%-Hzdn)zOaPO5C zyx}NL(V!0Q)$*Xk1ipJ--XgZD-8|3O2-$v9Rs27ibZ0s`a@j^HV`e^2Jwt_iR|iUE zPT!bd7a4nMk9_+yZTDcAbYXlZ_-o~lM!cb^I%ebqz_`Wg8B%>VET}ca06n6@=2A_)u?tmQYV5XK zqz_aX9q-gj`KmM33$TH@a(q#FyZeNS^P~#Qo|UU4`VnPQ6?aPc3-y~|dP|TS zVzZ)*+vlU79V)m_LwW8a7L0eRuWnZJQj-CF+A@9H+D{c$ozoO{≷|e%iwn61)+o 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 Bdh-AP literal 0 HcmV?d00001 diff --git a/src/styles/dashboard/investors.css b/src/styles/dashboard/investors.css new file mode 100644 index 0000000..7f3aafd --- /dev/null +++ b/src/styles/dashboard/investors.css @@ -0,0 +1,312 @@ +@import url('https://fonts.googleapis.com/css2?family=Gothic+A1&family=Montserrat&family=Roboto&display=swap'); + +* { + font-family: 'Roboto', sans-serif; +} + +.investor-dashboard { + display: flex; + justify-content: space-around; + width: 100%; + position: relative; +} + +.investor-dashboard > .side-nav { + width: 20%; + display: flex; + flex-direction: column; + align-items: center; + position: fixed; + left: 0; +} + +.user-section { + display: flex; + flex-direction: column; + align-items: center; + margin-top: 2rem; +} + +.user-section > .avatar { + width: 8rem; + height: 8rem; + border-radius: 50%; + display: flex; + justify-content: center; + margin-bottom: 1rem; +} + +.feed-image > img { + width: 100%; + height: 100%; + border-radius: 5px; +} + +.user-section > .avatar img { + width: 100%; + border-radius: 50%; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1), 0 2px 2px rgba(0, 0, 0, 0.3); +} + +.side-nav > .nav { + display: flex; + flex-direction: column; + text-align: left; + margin-top: 3rem; + width: 90%; + padding: 1rem 2rem; +} + +.side-nav > .nav > li { + padding: 1rem 0; +} + +.side-nav > .nav > li > a { + font-size: 1.6rem; + font-family: 'Roboto', sans-serif; + font-weight: 300; +} + +.investor-dashboard > .main { + display: flex; + flex-direction: column; + width: 80%; + margin: 0 auto; + position: absolute; + right: 5rem; +} + +/* .investor-dashboard > .main > .top-widget-container { + display: flex; + flex-direction: row; + justify-content: space-between; +} */ + +.top-widget { + width: 15rem; + margin: 1rem; + height: 15rem; + text-align: center; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1), 0 2px 2px rgba(0, 0, 0, 0.3); + cursor: pointer; + border-bottom-left-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; +} + +.top-widget:hover { + box-shadow: 0 4px 4px rgba(0, 0, 0, 0.1), 0 4px 4px rgba(0, 0, 0, 0.3); +} + +.top-widget > h2 { + color: white; + background: blue; + padding: 1rem; + font-weight: 400; +} + +.top-widget > .bold > h3 { + font-weight: 600; + padding: 1rem 0; + font-size: 3rem; +} + +.top-widget > p { + font-size: 1.2rem; + margin-top: 1rem; +} + +.overview-container { + margin: 3rem auto; + width: 100%; + display: flex; + flex-direction: row; +} + +.investment-feed { + width: 85%; + display: flex; + flex-direction: column; + align-items: center; + box-shadow: 0 4px 4px rgba(0, 0, 0, 0.1), 0 4px 4px rgba(0, 0, 0, 0.3); + border-top: 1px solid rgb(209, 209, 209); + margin-top: 0.9rem; +} + +.investment-feed h2 { + padding: 2rem 0; + border-bottom: 1px solid rgb(209, 209, 209); + width: 100%; + text-align: center; + color: rgb(136, 136, 136); +} + +.feed-widget { + width: 100%; +} + +.feed-containers { + display: flex; + padding: 1rem; + height: 12rem; + margin: 1rem auto; + width: 98%; +} + +.feed-containers:hover { + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1), 0 2px 2px rgba(0, 0, 0, 0.3); +} + +.feed-image { + width: 8rem; + height: 8rem; + border-radius: 5px; + margin-right: 2rem; +} + +.dots { + width: 1rem; + height: 1rem; + border-radius: 50%; +} + +.feed-details { + width: 60%; +} + +.feed-details > p { + font-size: 1.3rem; +} + +.feed-footer { + display: flex; + flex-direction: row; + border-top: 1px solid #d8d8d8; + padding-top: 1rem; +} + +.feed-preview { + border: 1px solid #d8d8d8; + background: none; + padding: 0.6rem 1.5rem; + font-size: 1.4rem; + border-radius: 0.5rem; + color: blue; + margin-right: 2rem; +} + +.Invested { + background-color: #d8d8d8; + cursor: not-allowed; + border: none; + padding: 0.6rem 1.5rem; + font-size: 1.4rem; + border-radius: 0.5rem; +} + +.Invest { + background: blue; + color: white; + border: none; + padding: 0.6rem 1.5rem; + font-size: 1.4rem; + border-radius: 0.5rem; +} + +.Invest:hover { + color: blue; + background-color: white; + border: 1px solid blue; +} + +.feed-milestones { + width: 35%; + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.milestone-item-container { + display: flex; + flex-direction: column; + padding: 0.5rem; +} + +.milestone-item-container > div { + display: flex; + flex-direction: row; + margin: 0; + padding: 0.2rem; +} + +.milestone-item-container > div > p { + padding: 0; + margin: 0; + padding-left: 0.5rem; + font-size: 1rem; + margin-top: -0.2rem; + color: rgb(136, 136, 136); +} + +.green { + background: green; +} + +.black { + background: black; +} + +.gray { + background: gray; +} + +.orange { + background: orange; +} + +.blue { + background: blue; +} + +/* NAVIGATION FOR FEEDS */ +.footer-nav { + width: 100%; + padding: 1rem; + margin: 2rem auto; + display: flex; + flex-direction: row; + justify-content: center; +} + +.active { + background: blue; + color: white; + padding: 0.5rem 1rem; + font-size: 1.6rem; + border-radius: 5px; + font-weight: 300; + margin-right: 1rem; +} + +.inactive { + border: 1px solid blue; + color: blue; + padding: 0.5rem 1rem; + font-size: 1.6rem; + border-radius: 5px; + font-weight: 300; + margin-right: 1rem; + cursor: pointer; +} + +.inactive:hover { + background: blue; + color: white; +} + +.slick-next::before, +.slick-prev::before { + font-size: 3rem; + line-height: 1; + opacity: 0.75; + color: #858383; +} From a4533f5aa62f763214280b6b09d3065e8b2c8470 Mon Sep 17 00:00:00 2001 From: gblessylva Date: Tue, 2 Jun 2020 07:23:46 +0100 Subject: [PATCH 2/2] FEAT: Investors dashboard added --- package-lock.json | 8 ++++++++ package.json | 1 + .../views/dashboards/investors/MainContents.jsx | 3 +-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index f7c493a..244daa8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10651,6 +10651,14 @@ "resize-observer-polyfill": "^1.5.0" } }, + "react-reveal": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/react-reveal/-/react-reveal-1.2.2.tgz", + "integrity": "sha512-JCv3fAoU6Z+Lcd8U48bwzm4pMZ79qsedSXYwpwt6lJNtj/v5nKJYZZbw3yhaQPPgYePo3Y0NOCoYOq/jcsisuw==", + "requires": { + "prop-types": "^15.5.10" + } + }, "react-router": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", diff --git a/package.json b/package.json index 18d6839..6079ab0 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "react-bootstrap": "^1.0.1", "react-dom": "^16.13.1", "react-redux": "^7.2.0", + "react-reveal": "^1.2.2", "react-router": "^5.2.0", "react-router-dom": "^5.2.0", "react-slick": "^0.26.1", diff --git a/src/components/views/dashboards/investors/MainContents.jsx b/src/components/views/dashboards/investors/MainContents.jsx index 0e57c82..cc1b083 100644 --- a/src/components/views/dashboards/investors/MainContents.jsx +++ b/src/components/views/dashboards/investors/MainContents.jsx @@ -1,5 +1,5 @@ import React, { Component } from 'react'; -import Slider from "react-slick"; +import Slider from 'react-slick'; import TopWidgets from './widgets/topWidgets.jsx'; import Feeds from './widgets/investmentFeeds.jsx'; import thumb from '../../../../static/wefinance-logo.png'; @@ -129,7 +129,6 @@ class MainContent extends Component { return (
-
{details.map((detail, i) =>