diff --git a/new-lamassu-admin/src/pages/Customers/CustomerData.js b/new-lamassu-admin/src/pages/Customers/CustomerData.js new file mode 100644 index 00000000..6293893c --- /dev/null +++ b/new-lamassu-admin/src/pages/Customers/CustomerData.js @@ -0,0 +1,326 @@ +import Grid from '@material-ui/core/Grid' +import { makeStyles } from '@material-ui/core/styles' +import _ from 'lodash/fp' +import moment from 'moment' +import * as R from 'ramda' +import { useState, React } from 'react' +import * as Yup from 'yup' + +import ImagePopper from 'src/components/ImagePopper' +import { FeatureButton } from 'src/components/buttons' +import { TextInput } from 'src/components/inputs/formik' +import { H3, Info3 } from 'src/components/typography' +import { + OVERRIDE_AUTHORIZED, + OVERRIDE_REJECTED +} from 'src/pages/Customers/components/propertyCard' +import { ReactComponent as CardIcon } from 'src/styling/icons/ID/card/comet.svg' +import { ReactComponent as PhoneIcon } from 'src/styling/icons/ID/phone/comet.svg' +import { ReactComponent as CrossedCameraIcon } from 'src/styling/icons/ID/photo/crossed-camera.svg' +import { ReactComponent as EditIcon } from 'src/styling/icons/action/edit/comet.svg' +import { ReactComponent as CustomerListViewReversedIcon } from 'src/styling/icons/circle buttons/customer-list-view/white.svg' +import { ReactComponent as CustomerListViewIcon } from 'src/styling/icons/circle buttons/customer-list-view/zodiac.svg' +import { ReactComponent as OverviewReversedIcon } from 'src/styling/icons/circle buttons/overview/white.svg' +import { ReactComponent as OverviewIcon } from 'src/styling/icons/circle buttons/overview/zodiac.svg' +import { URI } from 'src/utils/apollo' +import { ifNotNull } from 'src/utils/nullCheck' + +import styles from './CustomerData.styles.js' +import { EditableCard } from './components' +import { getName } from './helper.js' + +const useStyles = makeStyles(styles) + +const imageWidth = 165 +const imageHeight = 45 +const popupImageWidth = 360 +const popupImageHeight = 240 + +const Photo = ({ show, src }) => { + const classes = useStyles({ width: imageWidth }) + + return ( + <> + {show ? ( + + ) : ( +
+ +
+ )} + + ) +} + +const CustomerData = ({ customer, updateCustomer }) => { + const classes = useStyles() + const [listView, setListView] = useState(false) + + const idData = R.path(['idCardData'])(customer) + const rawExpirationDate = R.path(['expirationDate'])(idData) + const country = R.path(['country'])(idData) + const rawDob = R.path(['dateOfBirth'])(idData) + + const sanctions = R.path(['sanctions'])(customer) + const sanctionsAt = R.path(['sanctionsAt'])(customer) + const sanctionsDisplay = !sanctionsAt + ? 'Not checked yet' + : sanctions + ? 'Passed' + : 'Failed' + + const isEven = elem => elem % 2 === 0 + + const getVisibleCards = _.filter( + elem => !_.isEmpty(elem.data) || !_.isNil(elem.children) + ) + + const getAvailableFields = _.filter(({ value }) => value !== '') + + const schemas = { + idScan: Yup.object().shape({ + name: Yup.string(), + idNumber: Yup.string(), + birthDate: Yup.string(), + age: Yup.string(), + gender: Yup.string(), + state: Yup.string(), + expirationDate: Yup.string() + }), + usSsn: Yup.object().shape({ + usSsn: Yup.string() + }) + } + + const idScanElements = [ + { + name: 'name', + label: 'Name', + value: `${getName(customer)}`, + component: TextInput + }, + { + name: 'idNumber', + label: 'ID number', + value: R.path(['documentNumber'])(idData) ?? '', + component: TextInput + }, + { + name: 'birthDate', + label: 'Birth Date', + value: ifNotNull(rawDob, moment.utc(rawDob).format('YYYY-MM-DD')), + component: TextInput + }, + { + name: 'age', + label: 'Age', + value: ifNotNull( + rawDob, + moment.utc().diff(moment.utc(rawDob).format('YYYY-MM-DD'), 'years') + ), + component: TextInput + }, + { + name: 'gender', + label: 'Gender', + value: R.path(['gender'])(idData) ?? '', + component: TextInput + }, + { + name: 'state', + label: country === 'Canada' ? 'Province' : 'State', + value: R.path(['state'])(idData) ?? '', + component: TextInput + }, + { + name: 'expirationDate', + label: 'Expiration Date', + value: ifNotNull( + rawExpirationDate, + moment.utc(rawExpirationDate).format('YYYY-MM-DD') + ), + component: TextInput + } + ] + + const usSsnElements = [ + { + name: 'us ssn', + label: 'US SSN', + value: `${customer.usSsn ?? ''}`, + component: TextInput, + size: 190 + } + ] + + const initialValues = { + idScan: { + name: '', + idNumber: '', + birthDate: '', + age: '', + gender: '', + state: '', + expirationDate: '' + }, + usSsn: { + usSsn: '' + } + } + + const cards = [ + { + data: getAvailableFields(idScanElements), + title: 'ID Scan', + titleIcon: , + state: R.path(['idCardDataOverride'])(customer), + authorize: () => + updateCustomer({ idCardDataOverride: OVERRIDE_AUTHORIZED }), + reject: () => updateCustomer({ idCardDataOverride: OVERRIDE_REJECTED }), + save: values => console.log(values), + validationSchema: schemas.idScan, + initialValues: initialValues.idScan + }, + { + title: 'SMS Confirmation', + titleIcon: , + authorize: () => {}, + reject: () => {}, + save: () => {} + }, + { + title: 'Name', + titleIcon: , + authorize: () => {}, + reject: () => {}, + save: () => {} + }, + { + title: 'Sanctions check', + titleIcon: , + state: R.path(['sanctionsOverride'])(customer), + authorize: () => + updateCustomer({ sanctionsOverride: OVERRIDE_AUTHORIZED }), + reject: () => updateCustomer({ sanctionsOverride: OVERRIDE_REJECTED }), + save: () => {}, + children: {sanctionsDisplay} + }, + { + title: 'Front facing camera', + titleIcon: , + state: R.path(['frontCameraOverride'])(customer), + authorize: () => + updateCustomer({ frontCameraOverride: OVERRIDE_AUTHORIZED }), + reject: () => updateCustomer({ frontCameraOverride: OVERRIDE_REJECTED }), + save: () => {}, + children: customer.frontCameraPath ? ( + + ) : null + }, + { + title: 'ID card image', + titleIcon: , + state: R.path(['idCardPhotoOverride'])(customer), + authorize: () => + updateCustomer({ idCardPhotoOverride: OVERRIDE_AUTHORIZED }), + reject: () => updateCustomer({ idCardPhotoOverride: OVERRIDE_REJECTED }), + save: () => {}, + children: customer.idCardPhotoPath ? ( + + ) : null + }, + { + data: getAvailableFields(usSsnElements), + title: 'US SSN', + titleIcon: , + state: R.path(['usSsnOverride'])(customer), + authorize: () => updateCustomer({ usSsnOverride: OVERRIDE_AUTHORIZED }), + reject: () => updateCustomer({ usSsnOverride: OVERRIDE_REJECTED }), + save: () => {}, + validationSchema: schemas.usSsn, + initialValues: initialValues.usSsn + } + ] + + const editableCard = ({ + title, + authorize, + reject, + state, + titleIcon, + data, + save, + children, + validationSchema, + initialValues + }) => { + return ( + + ) + } + + const visibleCards = getVisibleCards(cards) + + return ( +
+
+

{'Customer data'}

+ setListView(false)} + /> + setListView(true)}> +
+
+ {!listView && ( + + + {visibleCards.map((elem, idx) => { + return isEven(idx) ? editableCard(elem) : null + })} + + + {visibleCards.map((elem, idx) => { + return !isEven(idx) ? editableCard(elem) : null + })} + + + )} +
+
+ ) +} + +export default CustomerData diff --git a/new-lamassu-admin/src/pages/Customers/CustomerData.styles.js b/new-lamassu-admin/src/pages/Customers/CustomerData.styles.js new file mode 100644 index 00000000..5dfecd1a --- /dev/null +++ b/new-lamassu-admin/src/pages/Customers/CustomerData.styles.js @@ -0,0 +1,20 @@ +export default { + header: { + display: 'flex', + flexDirection: 'row', + marginBottom: 15 + }, + title: { + marginTop: 7, + marginRight: 24 + }, + editIcon: { + marginTop: 5 + }, + cardIcon: { + marginTop: 7 + }, + viewIcons: { + marginRight: 12 + } +} diff --git a/new-lamassu-admin/src/pages/Customers/CustomerProfile.js b/new-lamassu-admin/src/pages/Customers/CustomerProfile.js index 361ae26e..657cbf47 100644 --- a/new-lamassu-admin/src/pages/Customers/CustomerProfile.js +++ b/new-lamassu-admin/src/pages/Customers/CustomerProfile.js @@ -16,13 +16,16 @@ import { ReactComponent as AuthorizeReversedIcon } from 'src/styling/icons/butto import { ReactComponent as AuthorizeIcon } from 'src/styling/icons/button/authorize/zodiac.svg' import { ReactComponent as BlockReversedIcon } from 'src/styling/icons/button/block/white.svg' import { ReactComponent as BlockIcon } from 'src/styling/icons/button/block/zodiac.svg' +import { ReactComponent as DiscountReversedIcon } from 'src/styling/icons/button/discount/white.svg' +import { ReactComponent as Discount } from 'src/styling/icons/button/discount/zodiac.svg' import { fromNamespace, namespaces } from 'src/utils/config' +import CustomerData from './CustomerData' import styles from './CustomerProfile.styles' import { CustomerDetails, TransactionsList, - ComplianceDetails + CustomerSidebar } from './components' import { getFormattedPhone, getName } from './helper' @@ -106,9 +109,9 @@ const SET_CUSTOMER = gql` ` const CustomerProfile = memo(() => { - const classes = useStyles() const history = useHistory() const [showCompliance, setShowCompliance] = useState(false) + const [clickedItem, setClickedItem] = useState('overview') const { id: customerId } = useParams() const { data: customerResponse, refetch: getCustomer, loading } = useQuery( @@ -130,6 +133,8 @@ const CustomerProfile = memo(() => { } }) + const onClickSidebarItem = code => setClickedItem(code) + const configData = R.path(['config'])(customerResponse) ?? [] const locale = configData && fromNamespace(namespaces.LOCALE, configData) const customerData = R.path(['customer'])(customerResponse) ?? [] @@ -142,6 +147,10 @@ const CustomerProfile = memo(() => { R.path(['authorizedOverride'])(customerData) === OVERRIDE_REJECTED const isSuspended = customerData.isSuspended + const isCustomerData = clickedItem === 'customerData' + const isOverview = clickedItem === 'overview' + + const classes = useStyles({ blocked }) return ( <> @@ -164,21 +173,28 @@ const CustomerProfile = memo(() => { )} -
- - setShowCompliance(!showCompliance)} - /> +
+
{!loading && !customerData.isAnonymous && (
+
+ code === clickedItem} + onClick={onClickSidebarItem} + /> +
Actions -
+
+ {}}> + {`Add individual discount`} + +
+
{isSuspended && ( { )} {
)} - +
+
+ {isOverview && ( +
+ + setShowCompliance(!showCompliance)} + /> + +
+ +
+
+ )} + {isCustomerData && ( +
+ +
+ )} +
- {!showCompliance && ( - - )} - {showCompliance && ( - - )} ) }) diff --git a/new-lamassu-admin/src/pages/Customers/CustomerProfile.styles.js b/new-lamassu-admin/src/pages/Customers/CustomerProfile.styles.js index 82346d46..69094460 100644 --- a/new-lamassu-admin/src/pages/Customers/CustomerProfile.styles.js +++ b/new-lamassu-admin/src/pages/Customers/CustomerProfile.styles.js @@ -15,14 +15,26 @@ export default { customerDetails: { marginBottom: 18 }, - customerActions: { + customerBlock: props => ({ display: 'flex', flexDirection: 'row', - '& button': { - marginRight: 15 - }, - '& > :last-child': { - marginRight: 0 - } + margin: [[0, 0, 4, 0]], + padding: [[0, props.blocked ? 35 : 48, 0]] + }), + customerDiscount: { + display: 'flex', + flexDirection: 'row', + margin: [[8, 0, 4, 0]], + padding: [[0, 24, 0]] + }, + panels: { + display: 'flex' + }, + rightSidePanel: { + display: 'block', + width: 1100 + }, + leftSidePanel: { + width: 300 } } diff --git a/new-lamassu-admin/src/pages/Customers/components/ComplianceDetails.js b/new-lamassu-admin/src/pages/Customers/components/ComplianceDetails.js deleted file mode 100644 index d5d66773..00000000 --- a/new-lamassu-admin/src/pages/Customers/components/ComplianceDetails.js +++ /dev/null @@ -1,131 +0,0 @@ -import { Box } from '@material-ui/core' -import { makeStyles } from '@material-ui/core/styles' -import * as R from 'ramda' -import React from 'react' - -import ImagePopper from 'src/components/ImagePopper' -import { H3, Info3 } from 'src/components/typography' -import { - PropertyCard, - OVERRIDE_AUTHORIZED, - OVERRIDE_REJECTED -} from 'src/pages/Customers/components/propertyCard' -import { ReactComponent as CrossedCameraIcon } from 'src/styling/icons/ID/photo/crossed-camera.svg' -import { URI } from 'src/utils/apollo' - -import { complianceDetailsStyles } from './ComplianceDetails.styles' -import Field from './Field' - -import { IdDataCard } from './' - -const useStyles = makeStyles(complianceDetailsStyles) - -const imageWidth = 165 -const imageHeight = 45 -const popupImageWidth = 360 -const popupImageHeight = 240 - -const Photo = ({ show, src }) => { - const classes = useStyles({ width: imageWidth }) - - return ( - <> - {show ? ( - - ) : ( -
- -
- )} - - ) -} - -const ComplianceDetails = ({ customer, updateCustomer }) => { - const classes = useStyles({ width: imageWidth }) - - const sanctions = R.path(['sanctions'])(customer) - const sanctionsAt = R.path(['sanctionsAt'])(customer) - const sanctionsDisplay = !sanctionsAt - ? 'Not checked yet' - : sanctions - ? 'Passed' - : 'Failed' - - return ( -
-

Compliance details

-
- - - - - updateCustomer({ idCardPhotoOverride: OVERRIDE_AUTHORIZED }) - } - reject={() => - updateCustomer({ idCardPhotoOverride: OVERRIDE_REJECTED }) - }> - - - - updateCustomer({ frontCameraOverride: OVERRIDE_AUTHORIZED }) - } - reject={() => - updateCustomer({ frontCameraOverride: OVERRIDE_REJECTED }) - }> - - - - - - updateCustomer({ usSsnOverride: OVERRIDE_AUTHORIZED }) - } - reject={() => - updateCustomer({ usSsnOverride: OVERRIDE_REJECTED }) - }> - - - - updateCustomer({ sanctionsOverride: OVERRIDE_AUTHORIZED }) - } - reject={() => - updateCustomer({ sanctionsOverride: OVERRIDE_REJECTED }) - }> - {sanctionsDisplay} - - - -
-
- ) -} - -export default ComplianceDetails diff --git a/new-lamassu-admin/src/pages/Customers/components/ComplianceDetails.styles.js b/new-lamassu-admin/src/pages/Customers/components/ComplianceDetails.styles.js deleted file mode 100644 index 1bb1d48f..00000000 --- a/new-lamassu-admin/src/pages/Customers/components/ComplianceDetails.styles.js +++ /dev/null @@ -1,25 +0,0 @@ -const complianceDetailsStyles = { - complianceDetailsGrid: { - display: 'flex', - flexDirection: 'row' - }, - firstColumn: { - display: 'flex', - flexDirection: 'column', - width: '100%', - marginRight: 10 - }, - lastColumn: { - display: 'flex', - flexDirection: 'column', - width: '100%', - marginLeft: 10 - }, - photoWrapper: ({ width }) => ({ - display: 'flex', - justifyContent: 'center', - width - }) -} - -export { complianceDetailsStyles } diff --git a/new-lamassu-admin/src/pages/Customers/components/CustomerDetails.js b/new-lamassu-admin/src/pages/Customers/components/CustomerDetails.js index 27714ee9..d5412738 100644 --- a/new-lamassu-admin/src/pages/Customers/components/CustomerDetails.js +++ b/new-lamassu-admin/src/pages/Customers/components/CustomerDetails.js @@ -2,11 +2,8 @@ import { makeStyles, Box } from '@material-ui/core' import * as R from 'ramda' import React, { memo } from 'react' -import { SubpageButton } from 'src/components/buttons' import { H2, Label1, P } from 'src/components/typography' import { ReactComponent as IdIcon } from 'src/styling/icons/ID/card/zodiac.svg' -import { ReactComponent as LawIconInverse } from 'src/styling/icons/circle buttons/law/white.svg' -import { ReactComponent as LawIcon } from 'src/styling/icons/circle buttons/law/zodiac.svg' import mainStyles from '../CustomersList.styles' import { getFormattedPhone, getName } from '../helper' @@ -70,13 +67,6 @@ const CustomerDetails = memo( locale.country )} - - Compliance details -
{elements.map(({ size, header }, idx) => ( diff --git a/new-lamassu-admin/src/pages/Customers/components/CustomerSidebar.js b/new-lamassu-admin/src/pages/Customers/components/CustomerSidebar.js new file mode 100644 index 00000000..57c430ff --- /dev/null +++ b/new-lamassu-admin/src/pages/Customers/components/CustomerSidebar.js @@ -0,0 +1,50 @@ +import { makeStyles } from '@material-ui/core/styles' +import classnames from 'classnames' +import React from 'react' + +import { ReactComponent as CustomerDataReversedIcon } from 'src/styling/icons/customer-nav/data/comet.svg' +import { ReactComponent as CustomerDataIcon } from 'src/styling/icons/customer-nav/data/white.svg' +import { ReactComponent as OverviewReversedIcon } from 'src/styling/icons/customer-nav/overview/comet.svg' +import { ReactComponent as OverviewIcon } from 'src/styling/icons/customer-nav/overview/white.svg' + +import styles from './CustomerSidebar.styles.js' + +const useStyles = makeStyles(styles) + +const CustomerSidebar = ({ isSelected, onClick }) => { + const classes = useStyles() + const sideBarOptions = [ + { + code: 'overview', + display: 'Overview', + Icon: OverviewIcon, + InverseIcon: OverviewReversedIcon + }, + { + code: 'customerData', + display: 'Customer Data', + Icon: CustomerDataIcon, + InverseIcon: CustomerDataReversedIcon + } + ] + + return ( +
+ {sideBarOptions?.map(({ Icon, InverseIcon, display, code }) => ( +
onClick(code)}> +
+ {isSelected(code) ? : } +
+ {display} +
+ ))} +
+ ) +} + +export default CustomerSidebar diff --git a/new-lamassu-admin/src/pages/Customers/components/CustomerSidebar.styles.js b/new-lamassu-admin/src/pages/Customers/components/CustomerSidebar.styles.js new file mode 100644 index 00000000..f40f871a --- /dev/null +++ b/new-lamassu-admin/src/pages/Customers/components/CustomerSidebar.styles.js @@ -0,0 +1,42 @@ +import typographyStyles from 'src/components/typography/styles' +import { zircon, offDarkColor, white } from 'src/styling/variables' + +const { tl2, p } = typographyStyles + +const sidebarColor = zircon + +export default { + sidebar: { + display: 'flex', + backgroundColor: sidebarColor, + width: 219, + flexDirection: 'column', + borderRadius: 5, + marginBottom: 50 + }, + link: { + alignItems: 'center', + display: 'flex', + extend: p, + position: 'relative', + color: offDarkColor, + padding: 15, + cursor: 'pointer' + }, + activeLink: { + display: 'flex', + alignItems: 'center', + extend: tl2, + color: white, + backgroundColor: offDarkColor, + '&:first-child': { + borderRadius: '5px 5px 0px 0px' + }, + '&:last-child': { + borderRadius: '0px 0px 5px 5px' + } + }, + icon: { + marginRight: 15 + } +} diff --git a/new-lamassu-admin/src/pages/Customers/components/EditableCard.js b/new-lamassu-admin/src/pages/Customers/components/EditableCard.js new file mode 100644 index 00000000..fc75f458 --- /dev/null +++ b/new-lamassu-admin/src/pages/Customers/components/EditableCard.js @@ -0,0 +1,246 @@ +import { CardContent, Card, Grid } from '@material-ui/core' +import { makeStyles } from '@material-ui/core/styles' +import classnames from 'classnames' +import { Form, Formik, Field as FormikField } from 'formik' +import { useState, React } from 'react' + +import ErrorMessage from 'src/components/ErrorMessage' +import PromptWhenDirty from 'src/components/PromptWhenDirty' +import { MainStatus } from 'src/components/Status' +import { Tooltip } from 'src/components/Tooltip' +import { ActionButton } from 'src/components/buttons' +import { Label1, Info3, H3 } from 'src/components/typography' +import { + OVERRIDE_AUTHORIZED, + OVERRIDE_REJECTED, + OVERRIDE_PENDING +} from 'src/pages/Customers/components/propertyCard' +import { ReactComponent as EditIcon } from 'src/styling/icons/action/edit/enabled.svg' +import { ReactComponent as EditReversedIcon } from 'src/styling/icons/action/edit/white.svg' +import { ReactComponent as AuthorizeReversedIcon } from 'src/styling/icons/button/authorize/white.svg' +import { ReactComponent as AuthorizeIcon } from 'src/styling/icons/button/authorize/zodiac.svg' +import { ReactComponent as CancelReversedIcon } from 'src/styling/icons/button/cancel/white.svg' +import { ReactComponent as CancelIcon } from 'src/styling/icons/button/cancel/zodiac.svg' +import { ReactComponent as SaveReversedIcon } from 'src/styling/icons/circle buttons/save/white.svg' +import { ReactComponent as SaveIcon } from 'src/styling/icons/circle buttons/save/zodiac.svg' +import { comet } from 'src/styling/variables' + +import styles from './EditableCard.styles.js' + +const useStyles = makeStyles(styles) + +const fieldStyles = { + field: { + position: 'relative', + width: 280, + height: 48, + padding: [[0, 4, 4, 0]] + }, + label: { + color: comet, + margin: [[0, 3]] + }, + notEditing: { + display: 'flex', + flexDirection: 'column', + '& > p:first-child': { + height: 16, + lineHeight: '16px', + transformOrigin: 'left', + paddingLeft: 0, + margin: [[3, 0, 3, 0]] + }, + '& > p:last-child': { + overflow: 'hidden', + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + margin: 0 + } + }, + editing: { + '& > input': { + padding: 0 + } + } +} + +const fieldUseStyles = makeStyles(fieldStyles) + +const EditableField = ({ editing, field, size, ...props }) => { + const classes = fieldUseStyles() + + const classNames = { + [classes.field]: true, + [classes.notEditing]: !editing + } + + return ( +
+ {!editing && ( + <> + {field.label} + {field.value} + + )} + {editing && ( + <> + {field.label} + + + )} +
+ ) +} + +const EditableCard = ({ + data, + save, + authorize, + reject, + state, + title, + titleIcon, + children +}) => { + const classes = useStyles() + + const [editing, setEditing] = useState(false) + const [error, setError] = useState(null) + + const label1ClassNames = { + [classes.label1]: true, + [classes.label1Pending]: state === OVERRIDE_PENDING, + [classes.label1Rejected]: state === OVERRIDE_REJECTED, + [classes.label1Accepted]: state === OVERRIDE_AUTHORIZED + } + + const authorized = + state === OVERRIDE_PENDING + ? { label: 'Pending', type: 'neutral' } + : state === OVERRIDE_REJECTED + ? { label: 'Rejected', type: 'error' } + : { label: 'Accepted', type: 'success' } + + const editableField = field => { + return + } + + return ( +
+ + +
+ {titleIcon} +

{title}

+ +
+ +
+
+ save(values)} + onReset={() => { + setEditing(false) + setError(false) + }}> +
+ +
+ + + {data?.map((field, idx) => { + return idx >= 0 && idx < 4 ? editableField(field) : null + })} + + + {data?.map((field, idx) => { + return idx >= 4 ? editableField(field) : null + })} + + +
+ {children} +
+ {!editing && ( +
+ setEditing(true)}> + {`Edit`} + +
+ )} + {editing && ( +
+ {data && ( +
+ + Save + +
+ )} +
+ + Cancel + +
+ {authorized.label !== 'Accepted' && ( +
+ authorize()}> + {'Authorize'} + +
+ )} + {authorized.label !== 'Rejected' && ( + reject()}> + {'Reject'} + + )} + {error && ( + Failed to save changes + )} +
+ )} +
+ +
+
+
+
+ ) +} + +export default EditableCard diff --git a/new-lamassu-admin/src/pages/Customers/components/EditableCard.styles.js b/new-lamassu-admin/src/pages/Customers/components/EditableCard.styles.js new file mode 100644 index 00000000..1c2a8603 --- /dev/null +++ b/new-lamassu-admin/src/pages/Customers/components/EditableCard.styles.js @@ -0,0 +1,50 @@ +import { tomato, spring4, comet } from 'src/styling/variables' + +export default { + label1: { + display: 'flex', + width: 85, + justifyContent: 'right' + }, + label1Pending: { + color: comet + }, + label1Rejected: { + color: tomato + }, + label1Accepted: { + color: spring4 + }, + editButton: { + marginTop: 30, + display: 'flex', + justifyContent: 'right' + }, + button: { + marginRight: 8 + }, + editingButtons: { + marginTop: 30, + display: 'flex', + justifyContent: 'right' + }, + card: { + borderRadius: 10, + marginRight: 15, + marginBottom: 15 + }, + cardHeader: { + display: 'flex', + flexDirection: 'row', + marginBottom: 15 + }, + editIcon: { + marginTop: 5 + }, + cardIcon: { + marginTop: 7 + }, + cardTitle: { + margin: [[8, 15, 15, 15]] + } +} diff --git a/new-lamassu-admin/src/pages/Customers/components/TransactionsList.js b/new-lamassu-admin/src/pages/Customers/components/TransactionsList.js index 57d9bacf..af5eb959 100644 --- a/new-lamassu-admin/src/pages/Customers/components/TransactionsList.js +++ b/new-lamassu-admin/src/pages/Customers/components/TransactionsList.js @@ -71,8 +71,7 @@ const TransactionsList = ({ customer, data, loading, locale }) => { const tableElements = [ { - header: 'Direction', - width: 207, + width: 75, view: it => ( <> {it.txClass === 'cashOut' ? ( @@ -80,20 +79,19 @@ const TransactionsList = ({ customer, data, loading, locale }) => { ) : ( )} - {it.txClass === 'cashOut' ? 'Cash-out' : 'Cash-in'} ) }, { header: 'Transaction ID', - width: 414, + width: 175, view: it => ( {it.id} ) }, { header: 'Cash', - width: 146, + width: 175, textAlign: 'right', view: it => ( <> @@ -104,7 +102,7 @@ const TransactionsList = ({ customer, data, loading, locale }) => { }, { header: 'Crypto', - width: 142, + width: 175, textAlign: 'right', view: it => ( <> @@ -117,7 +115,7 @@ const TransactionsList = ({ customer, data, loading, locale }) => { }, { header: 'Date', - width: 157, + width: 160, view: it => formatDate(it.created, timezone, 'YYYY-MM-D') }, { diff --git a/new-lamassu-admin/src/pages/Customers/components/index.js b/new-lamassu-admin/src/pages/Customers/components/index.js index 9b0c8945..a8b7b184 100644 --- a/new-lamassu-admin/src/pages/Customers/components/index.js +++ b/new-lamassu-admin/src/pages/Customers/components/index.js @@ -1,6 +1,15 @@ -import ComplianceDetails from './ComplianceDetails' import CustomerDetails from './CustomerDetails' +import CustomerSidebar from './CustomerSidebar' +import EditableCard from './EditableCard' +import Field from './Field' import IdDataCard from './IdDataCard' import TransactionsList from './TransactionsList' -export { CustomerDetails, IdDataCard, TransactionsList, ComplianceDetails } +export { + CustomerDetails, + IdDataCard, + TransactionsList, + CustomerSidebar, + Field, + EditableCard +} diff --git a/new-lamassu-admin/src/styling/icons/action/edit/comet.svg b/new-lamassu-admin/src/styling/icons/action/edit/comet.svg new file mode 100644 index 00000000..8b77414e --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/action/edit/comet.svg @@ -0,0 +1,9 @@ + + + + Created with Sketch. + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/button/discount/comet.svg b/new-lamassu-admin/src/styling/icons/button/discount/comet.svg new file mode 100644 index 00000000..ac2ab03c --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/button/discount/comet.svg @@ -0,0 +1,8 @@ + + + icon/button/loyalty/comet + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/button/discount/white.svg b/new-lamassu-admin/src/styling/icons/button/discount/white.svg new file mode 100644 index 00000000..538dc4f6 --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/button/discount/white.svg @@ -0,0 +1,8 @@ + + + icon/button/loyalty/white + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/button/discount/zodiac.svg b/new-lamassu-admin/src/styling/icons/button/discount/zodiac.svg new file mode 100644 index 00000000..e7a46dc3 --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/button/discount/zodiac.svg @@ -0,0 +1,8 @@ + + + icon/button/loyalty/zodiac + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/circle buttons/customer-list-view/white.svg b/new-lamassu-admin/src/styling/icons/circle buttons/customer-list-view/white.svg new file mode 100644 index 00000000..f9188caa --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/circle buttons/customer-list-view/white.svg @@ -0,0 +1,10 @@ + + + icon/sf-small/listing/white + + + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/circle buttons/customer-list-view/zodiac.svg b/new-lamassu-admin/src/styling/icons/circle buttons/customer-list-view/zodiac.svg new file mode 100644 index 00000000..b8aa5902 --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/circle buttons/customer-list-view/zodiac.svg @@ -0,0 +1,10 @@ + + + icon/sf-small/listing/zodiac + + + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/circle buttons/overview/comet.svg b/new-lamassu-admin/src/styling/icons/circle buttons/overview/comet.svg new file mode 100644 index 00000000..46a0342c --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/circle buttons/overview/comet.svg @@ -0,0 +1,10 @@ + + + icon/sf-small/overview/comet + + + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/circle buttons/overview/white.svg b/new-lamassu-admin/src/styling/icons/circle buttons/overview/white.svg new file mode 100644 index 00000000..3af8ca54 --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/circle buttons/overview/white.svg @@ -0,0 +1,10 @@ + + + icon/sf-small/overview/white + + + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/circle buttons/overview/zodiac.svg b/new-lamassu-admin/src/styling/icons/circle buttons/overview/zodiac.svg new file mode 100644 index 00000000..112c8d25 --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/circle buttons/overview/zodiac.svg @@ -0,0 +1,10 @@ + + + icon/sf-small/overview/zodiac + + + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/customer-nav/data/comet.svg b/new-lamassu-admin/src/styling/icons/customer-nav/data/comet.svg new file mode 100644 index 00000000..471c383b --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/customer-nav/data/comet.svg @@ -0,0 +1,9 @@ + + + icon/customer-nav/data/comet + + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/customer-nav/data/white.svg b/new-lamassu-admin/src/styling/icons/customer-nav/data/white.svg new file mode 100644 index 00000000..20cf2885 --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/customer-nav/data/white.svg @@ -0,0 +1,9 @@ + + + icon/customer-nav/data/white + + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/customer-nav/data/zodiac.svg b/new-lamassu-admin/src/styling/icons/customer-nav/data/zodiac.svg new file mode 100644 index 00000000..ffc069f2 --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/customer-nav/data/zodiac.svg @@ -0,0 +1,9 @@ + + + icon/customer-nav/data/zodiac + + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/customer-nav/overview/comet.svg b/new-lamassu-admin/src/styling/icons/customer-nav/overview/comet.svg new file mode 100644 index 00000000..c0ef3b45 --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/customer-nav/overview/comet.svg @@ -0,0 +1,10 @@ + + + icon/customer-nav/overview/comet + + + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/customer-nav/overview/white.svg b/new-lamassu-admin/src/styling/icons/customer-nav/overview/white.svg new file mode 100644 index 00000000..87c8dc82 --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/customer-nav/overview/white.svg @@ -0,0 +1,10 @@ + + + icon/customer-nav/overview/white + + + + + + + \ No newline at end of file diff --git a/new-lamassu-admin/src/styling/icons/customer-nav/overview/zodiac.svg b/new-lamassu-admin/src/styling/icons/customer-nav/overview/zodiac.svg new file mode 100644 index 00000000..9e2819a5 --- /dev/null +++ b/new-lamassu-admin/src/styling/icons/customer-nav/overview/zodiac.svg @@ -0,0 +1,10 @@ + + + icon/customer-nav/overview/zodiac + + + + + + + \ No newline at end of file