From e918a62994d2b56cb95f5ae991aa53d1fa332bbc Mon Sep 17 00:00:00 2001 From: Jose Sousa Date: Tue, 17 Nov 2020 09:52:43 +0000 Subject: [PATCH] feat: commissions list --- .../buttons/SubpageButton.styles.js | 12 +- .../src/components/editableTable/Row.js | 13 +- .../src/components/inputs/base/Select.js | 10 +- .../src/pages/Commissions/Commissions.js | 133 +++++----- .../components/CommissionsDetails.js | 78 ++++++ .../Commissions/components/CommissionsList.js | 107 ++++++++ .../src/pages/Commissions/helper.js | 244 +++++++++++++++++- new-lamassu-admin/src/utils/string.js | 2 +- 8 files changed, 521 insertions(+), 78 deletions(-) create mode 100644 new-lamassu-admin/src/pages/Commissions/components/CommissionsDetails.js create mode 100644 new-lamassu-admin/src/pages/Commissions/components/CommissionsList.js diff --git a/new-lamassu-admin/src/components/buttons/SubpageButton.styles.js b/new-lamassu-admin/src/components/buttons/SubpageButton.styles.js index 6217f03e..8280c1f3 100644 --- a/new-lamassu-admin/src/components/buttons/SubpageButton.styles.js +++ b/new-lamassu-admin/src/components/buttons/SubpageButton.styles.js @@ -25,13 +25,11 @@ export default { } }, buttonIcon: { - '& svg': { - width: 16, - height: 16, - overflow: 'visible', - '& g': { - strokeWidth: 1.8 - } + width: 16, + height: 16, + overflow: 'visible', + '& g': { + strokeWidth: 1.8 } }, buttonIconActiveLeft: { diff --git a/new-lamassu-admin/src/components/editableTable/Row.js b/new-lamassu-admin/src/components/editableTable/Row.js index de1cc334..1db96b32 100644 --- a/new-lamassu-admin/src/components/editableTable/Row.js +++ b/new-lamassu-admin/src/components/editableTable/Row.js @@ -105,6 +105,7 @@ const ECol = ({ editing, focus, config, extraPaddingRight, extraPadding }) => { textAlign, suffix, SuffixComponent = TL2, + textStyle = it => {}, view = it => it?.toString(), inputProps = {} } = config @@ -144,9 +145,17 @@ const ECol = ({ editing, focus, config, extraPaddingRight, extraPadding }) => { )} {isEditing && !isField && } - {!isEditing && values && <>{view(values[name], values)}} + {!isEditing && values && ( +
+ {view(values[name], values)} +
+ )} {suffix && ( - {suffix} + + {suffix} + )} ) diff --git a/new-lamassu-admin/src/components/inputs/base/Select.js b/new-lamassu-admin/src/components/inputs/base/Select.js index 15901774..986f7306 100644 --- a/new-lamassu-admin/src/components/inputs/base/Select.js +++ b/new-lamassu-admin/src/components/inputs/base/Select.js @@ -4,7 +4,7 @@ import { useSelect } from 'downshift' import React from 'react' import { ReactComponent as Arrowdown } from 'src/styling/icons/action/arrow/regular.svg' -import { startCase } from 'src/utils/string' +import { toFirstUpper } from 'src/utils/string' import styles from './Select.styles' @@ -36,16 +36,18 @@ function Select({ label, items, ...props }) { return (
- +
    {isOpen && items.map((item, index) => (
  • - {startCase(item)} + {toFirstUpper(item)}
  • ))}
diff --git a/new-lamassu-admin/src/pages/Commissions/Commissions.js b/new-lamassu-admin/src/pages/Commissions/Commissions.js index 588e10bb..e8d1a91c 100644 --- a/new-lamassu-admin/src/pages/Commissions/Commissions.js +++ b/new-lamassu-admin/src/pages/Commissions/Commissions.js @@ -1,22 +1,17 @@ import { useQuery, useMutation } from '@apollo/react-hooks' +import { makeStyles, Box } from '@material-ui/core' import gql from 'graphql-tag' import * as R from 'ramda' import React, { useState } from 'react' -import { Table as EditableTable } from 'src/components/editableTable' -import Section from 'src/components/layout/Section' +import { SubpageButton } from 'src/components/buttons' import TitleSection from 'src/components/layout/TitleSection' +import { ReactComponent as ExeceptionViewIcon } from 'src/styling/icons/circle buttons/exception-view/white.svg' +import { ReactComponent as ListingViewIcon } from 'src/styling/icons/circle buttons/listing-view/zodiac.svg' import { fromNamespace, toNamespace, namespaces } from 'src/utils/config' -import { - mainFields, - overrides, - schema, - getOverridesSchema, - defaults, - overridesDefaults, - getOrder -} from './helper' +import CommissionsDetails from './components/CommissionsDetails' +import CommissionsList from './components/CommissionsList' const GET_DATA = gql` query getData { @@ -38,26 +33,46 @@ const SAVE_CONFIG = gql` } ` +const styles = { + titleWrapper: { + display: 'flex', + alignItems: 'center', + flexDirection: 'row' + }, + subpageButton: { + marginLeft: 12 + }, + colorLabel: { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + marginLeft: 'auto', + '& div': { + width: 12, + height: 12, + borderRadius: 3, + marginRight: 8, + backgroundColor: '#44e188' + } + } +} + +const useStyles = makeStyles(styles) + const Commissions = ({ name: SCREEN_KEY }) => { - const [isEditingDefault, setEditingDefault] = useState(false) - const [isEditingOverrides, setEditingOverrides] = useState(false) + const classes = useStyles() + + const [showMachines, setShowMachines] = useState(false) const { data } = useQuery(GET_DATA) const [saveConfig, { error }] = useMutation(SAVE_CONFIG, { refetchQueries: () => ['getData'] }) const config = data?.config && fromNamespace(SCREEN_KEY)(data.config) - const currency = R.path(['fiatCurrency'])( - fromNamespace(namespaces.LOCALE)(data?.config) - ) + const localeConfig = + data?.config && fromNamespace(namespaces.LOCALE)(data.config) - const commission = config && !R.isEmpty(config) ? config : defaults - const commissionOverrides = commission?.overrides ?? [] - - const orderedCommissionsOverrides = R.sortWith([ - R.ascend(getOrder), - R.ascend(R.prop('machine')) - ])(commissionOverrides) + const currency = R.path(['fiatCurrency'])(localeConfig) const save = it => { const config = toNamespace(SCREEN_KEY)(it.commissions[0]) @@ -69,51 +84,43 @@ const Commissions = ({ name: SCREEN_KEY }) => { return saveConfig({ variables: { config } }) } - const onEditingDefault = (it, editing) => setEditingDefault(editing) - const onEditingOverrides = (it, editing) => setEditingOverrides(editing) - return ( <> - -
- + + + List view + + {showMachines && ( +
+
+ Override value +
+ )} + + {!showMachines && ( + -
-
- -
+ )} ) } diff --git a/new-lamassu-admin/src/pages/Commissions/components/CommissionsDetails.js b/new-lamassu-admin/src/pages/Commissions/components/CommissionsDetails.js new file mode 100644 index 00000000..77153ee3 --- /dev/null +++ b/new-lamassu-admin/src/pages/Commissions/components/CommissionsDetails.js @@ -0,0 +1,78 @@ +import * as R from 'ramda' +import React, { useState, memo } from 'react' + +import { Table as EditableTable } from 'src/components/editableTable' +import Section from 'src/components/layout/Section' +import { + mainFields, + overrides, + schema, + getOverridesSchema, + defaults, + overridesDefaults, + getOrder +} from 'src/pages/Commissions/helper' + +const CommissionsDetails = memo( + ({ config, currency, data, error, save, saveOverrides }) => { + const [isEditingDefault, setEditingDefault] = useState(false) + const [isEditingOverrides, setEditingOverrides] = useState(false) + + const commission = config && !R.isEmpty(config) ? config : defaults + const commissionOverrides = commission?.overrides ?? [] + + const orderedCommissionsOverrides = R.sortWith([ + R.ascend(getOrder), + R.ascend(R.prop('machine')) + ])(commissionOverrides) + + const onEditingDefault = (it, editing) => setEditingDefault(editing) + const onEditingOverrides = (it, editing) => setEditingOverrides(editing) + + return ( + <> +
+ +
+
+ +
+ + ) + } +) + +export default CommissionsDetails diff --git a/new-lamassu-admin/src/pages/Commissions/components/CommissionsList.js b/new-lamassu-admin/src/pages/Commissions/components/CommissionsList.js new file mode 100644 index 00000000..3505698c --- /dev/null +++ b/new-lamassu-admin/src/pages/Commissions/components/CommissionsList.js @@ -0,0 +1,107 @@ +import { makeStyles } from '@material-ui/core' +import * as R from 'ramda' +import React, { memo, useState } from 'react' + +import { Table as EditableTable } from 'src/components/editableTable' +import { Select } from 'src/components/inputs' +import { + overridesDefaults, + getCommissions, + getMachineCoins, + getListCommissionsSchema, + commissionsList, + sortCommissionsBy, + filterCommissions, + SHOW_ALL, + ORDER_OPTIONS +} from 'src/pages/Commissions/helper' + +const styles = { + headerLine: { + display: 'flex', + justifyContent: '', + marginBottom: 24, + '& div': { + marginRight: 24 + } + }, + tableWrapper: { + flex: 1, + display: 'block', + overflowX: 'auto', + width: '100%', + maxHeight: '70vh' + } +} + +const useStyles = makeStyles(styles) + +const CommissionsList = memo( + ({ config, localeConfig, currency, data, error, saveOverrides }) => { + const classes = useStyles() + + const [machineFilter, setMachineFilter] = useState(SHOW_ALL) + const [coinFilter, setCoinFilter] = useState(SHOW_ALL) + const [orderProp, setOrderProp] = useState('Machine name') + + const cryptoCurrencies = R.prop('cryptoCurrencies', localeConfig) + + const machines = R.prop('machines', data) + const machinesIds = R.map(R.prop('deviceId'))(machines) + const machinesNames = R.map(R.prop('name'))(machines) + + const machinesCoins = R.map(m => + R.xprod([m], getMachineCoins(m, localeConfig)) + )(machinesIds) + + const machinesCoinsTuples = R.unnest(machinesCoins) + + const commissions = R.map(([deviceId, cryptoCode]) => + getCommissions(cryptoCode, deviceId, config) + )(machinesCoinsTuples) + + return ( +
+
+ +