feat: bill picker available on cashout and commission screens
This commit is contained in:
parent
c2e8ed612b
commit
3572d27551
10 changed files with 86 additions and 44 deletions
|
|
@ -18,12 +18,12 @@ export default {
|
||||||
const justifyContent = textAlign === 'right' ? 'end' : textAlign
|
const justifyContent = textAlign === 'right' ? 'end' : textAlign
|
||||||
return {
|
return {
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
alignItems: 'baseline',
|
alignItems: 'center',
|
||||||
justifyContent
|
justifyContent
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
suffix: {
|
suffix: {
|
||||||
marginLeft: 7
|
margin: [[0, 0, 0, 7]]
|
||||||
},
|
},
|
||||||
size: ({ size }) => bySize(size),
|
size: ({ size }) => bySize(size),
|
||||||
bold
|
bold
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ const AutocompleteFormik = ({ options, onChange, ...props }) => {
|
||||||
setFieldValue(name, item)
|
setFieldValue(name, item)
|
||||||
}}
|
}}
|
||||||
onBlur={innerOnBlur}
|
onBlur={innerOnBlur}
|
||||||
value={value}
|
value={value || ''}
|
||||||
error={error}
|
error={error}
|
||||||
open={open}
|
open={open}
|
||||||
options={innerOptions}
|
options={innerOptions}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,9 @@ const useStyles = makeStyles({
|
||||||
switchLabel: {
|
switchLabel: {
|
||||||
margin: 6,
|
margin: 6,
|
||||||
width: 24
|
width: 24
|
||||||
|
},
|
||||||
|
autoComplete: {
|
||||||
|
width: '100%'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -114,7 +117,7 @@ const CashOut = ({ name: SCREEN_KEY }) => {
|
||||||
error={error?.message}
|
error={error?.message}
|
||||||
validationSchema={DenominationsSchema}
|
validationSchema={DenominationsSchema}
|
||||||
disableRowEdit={R.compose(R.not, R.path(['active']))}
|
disableRowEdit={R.compose(R.not, R.path(['active']))}
|
||||||
elements={getElements(machines, locale)}
|
elements={getElements(machines, locale, classes)}
|
||||||
/>
|
/>
|
||||||
{R.isEmpty(machines) && <EmptyTable message="No machines so far" />}
|
{R.isEmpty(machines) && <EmptyTable message="No machines so far" />}
|
||||||
{wizard && (
|
{wizard && (
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import * as Yup from 'yup'
|
||||||
import Modal from 'src/components/Modal'
|
import Modal from 'src/components/Modal'
|
||||||
import { Autocomplete } from 'src/components/inputs/formik'
|
import { Autocomplete } from 'src/components/inputs/formik'
|
||||||
import denominations from 'src/utils/bill-denominations'
|
import denominations from 'src/utils/bill-denominations'
|
||||||
|
import { getBillOptions } from 'src/utils/bill-options'
|
||||||
import { toNamespace } from 'src/utils/config'
|
import { toNamespace } from 'src/utils/config'
|
||||||
|
|
||||||
import WizardSplash from './WizardSplash'
|
import WizardSplash from './WizardSplash'
|
||||||
|
|
@ -15,22 +16,13 @@ const LAST_STEP = 3
|
||||||
const MODAL_WIDTH = 554
|
const MODAL_WIDTH = 554
|
||||||
const MODAL_HEIGHT = 520
|
const MODAL_HEIGHT = 520
|
||||||
|
|
||||||
const getOptions = R.curry((locale, denomiations) => {
|
|
||||||
const currency = R.prop('fiatCurrency')(locale)
|
|
||||||
return R.compose(
|
|
||||||
R.map(code => ({ code, display: code })),
|
|
||||||
R.keys,
|
|
||||||
R.path([currency])
|
|
||||||
)(denomiations)
|
|
||||||
})
|
|
||||||
|
|
||||||
const Wizard = ({ machine, locale, onClose, save, error }) => {
|
const Wizard = ({ machine, locale, onClose, save, error }) => {
|
||||||
const [{ step, config }, setState] = useState({
|
const [{ step, config }, setState] = useState({
|
||||||
step: 0,
|
step: 0,
|
||||||
config: { active: true }
|
config: { active: true }
|
||||||
})
|
})
|
||||||
|
|
||||||
const options = getOptions(locale, denominations)
|
const options = getBillOptions(locale, denominations)
|
||||||
|
|
||||||
const title = `Enable cash-out`
|
const title = `Enable cash-out`
|
||||||
const isLastStep = step === LAST_STEP
|
const isLastStep = step === LAST_STEP
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
|
import * as R from 'ramda'
|
||||||
import * as Yup from 'yup'
|
import * as Yup from 'yup'
|
||||||
|
|
||||||
import { NumberInput } from 'src/components/inputs/formik'
|
import { Autocomplete, NumberInput } from 'src/components/inputs/formik'
|
||||||
import { bold } from 'src/styling/helpers'
|
import { bold } from 'src/styling/helpers'
|
||||||
|
import denominations from 'src/utils/bill-denominations'
|
||||||
|
import { getBillOptions } from 'src/utils/bill-options'
|
||||||
import { CURRENCY_MAX } from 'src/utils/constants'
|
import { CURRENCY_MAX } from 'src/utils/constants'
|
||||||
|
|
||||||
const DenominationsSchema = Yup.object().shape({
|
const DenominationsSchema = Yup.object().shape({
|
||||||
|
|
@ -17,7 +20,18 @@ const DenominationsSchema = Yup.object().shape({
|
||||||
.max(CURRENCY_MAX)
|
.max(CURRENCY_MAX)
|
||||||
})
|
})
|
||||||
|
|
||||||
const getElements = (machines, { fiatCurrency } = {}) => {
|
const getElements = (machines, locale = {}, classes) => {
|
||||||
|
const options = getBillOptions(locale, denominations)
|
||||||
|
const cassetteProps =
|
||||||
|
options?.length > 0
|
||||||
|
? {
|
||||||
|
options: options,
|
||||||
|
labelProp: 'display',
|
||||||
|
valueProp: 'code',
|
||||||
|
className: classes.autoComplete
|
||||||
|
}
|
||||||
|
: { decimalPlaces: 0 }
|
||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
name: 'id',
|
name: 'id',
|
||||||
|
|
@ -33,25 +47,23 @@ const getElements = (machines, { fiatCurrency } = {}) => {
|
||||||
stripe: true,
|
stripe: true,
|
||||||
width: 250,
|
width: 250,
|
||||||
textAlign: 'right',
|
textAlign: 'right',
|
||||||
input: NumberInput,
|
view: it => it,
|
||||||
inputProps: {
|
input: options?.length > 0 ? Autocomplete : NumberInput,
|
||||||
decimalPlaces: 0
|
inputProps: cassetteProps,
|
||||||
},
|
suffix: R.prop('fiatCurrency')(locale),
|
||||||
suffix: fiatCurrency,
|
|
||||||
bold: bold
|
bold: bold
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'bottom',
|
name: 'bottom',
|
||||||
header: 'Cassette 2 (Bottom)',
|
header: 'Cassette 2 (Bottom)',
|
||||||
size: 'sm',
|
|
||||||
stripe: true,
|
stripe: true,
|
||||||
textAlign: 'right',
|
textAlign: 'right',
|
||||||
width: 250,
|
width: 250,
|
||||||
input: NumberInput,
|
view: it => it,
|
||||||
inputProps: {
|
input: options?.length > 0 ? Autocomplete : NumberInput,
|
||||||
decimalPlaces: 0
|
inputProps: cassetteProps,
|
||||||
},
|
suffix: R.prop('fiatCurrency')(locale),
|
||||||
suffix: fiatCurrency
|
bold: bold
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,13 @@ import CommissionsList from './components/CommissionsList'
|
||||||
const styles = {
|
const styles = {
|
||||||
listViewButton: {
|
listViewButton: {
|
||||||
marginLeft: 4
|
marginLeft: 4
|
||||||
|
},
|
||||||
|
autoComplete: {
|
||||||
|
width: '100%'
|
||||||
|
},
|
||||||
|
bold: {
|
||||||
|
fontWeight: 'bold',
|
||||||
|
height: 200
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -121,11 +128,13 @@ const Commissions = ({ name: SCREEN_KEY }) => {
|
||||||
{!showMachines && (
|
{!showMachines && (
|
||||||
<CommissionsDetails
|
<CommissionsDetails
|
||||||
config={config}
|
config={config}
|
||||||
|
locale={localeConfig}
|
||||||
currency={currency}
|
currency={currency}
|
||||||
data={data}
|
data={data}
|
||||||
error={error}
|
error={error}
|
||||||
save={save}
|
save={save}
|
||||||
saveOverrides={saveOverrides}
|
saveOverrides={saveOverrides}
|
||||||
|
classes={classes}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{showMachines && (
|
{showMachines && (
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import {
|
||||||
} from 'src/pages/Commissions/helper'
|
} from 'src/pages/Commissions/helper'
|
||||||
|
|
||||||
const CommissionsDetails = memo(
|
const CommissionsDetails = memo(
|
||||||
({ config, currency, data, error, save, saveOverrides }) => {
|
({ config, locale, currency, data, error, save, saveOverrides, classes }) => {
|
||||||
const [isEditingDefault, setEditingDefault] = useState(false)
|
const [isEditingDefault, setEditingDefault] = useState(false)
|
||||||
const [isEditingOverrides, setEditingOverrides] = useState(false)
|
const [isEditingOverrides, setEditingOverrides] = useState(false)
|
||||||
|
|
||||||
|
|
@ -43,7 +43,7 @@ const CommissionsDetails = memo(
|
||||||
save={save}
|
save={save}
|
||||||
validationSchema={schema}
|
validationSchema={schema}
|
||||||
data={R.of(commission)}
|
data={R.of(commission)}
|
||||||
elements={mainFields(currency)}
|
elements={mainFields(currency, locale, classes)}
|
||||||
setEditing={onEditingDefault}
|
setEditing={onEditingDefault}
|
||||||
forceDisable={isEditingOverrides}
|
forceDisable={isEditingOverrides}
|
||||||
/>
|
/>
|
||||||
|
|
@ -65,7 +65,13 @@ const CommissionsDetails = memo(
|
||||||
data
|
data
|
||||||
)}
|
)}
|
||||||
data={orderedCommissionsOverrides}
|
data={orderedCommissionsOverrides}
|
||||||
elements={overrides(data, currency, orderedCommissionsOverrides)}
|
elements={overrides(
|
||||||
|
data,
|
||||||
|
currency,
|
||||||
|
orderedCommissionsOverrides,
|
||||||
|
locale,
|
||||||
|
classes
|
||||||
|
)}
|
||||||
setEditing={onEditingOverrides}
|
setEditing={onEditingOverrides}
|
||||||
forceDisable={isEditingDefault}
|
forceDisable={isEditingDefault}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,10 @@ import React from 'react'
|
||||||
import { v4 } from 'uuid'
|
import { v4 } from 'uuid'
|
||||||
import * as Yup from 'yup'
|
import * as Yup from 'yup'
|
||||||
|
|
||||||
import { NumberInput } from 'src/components/inputs/formik'
|
import { Autocomplete, NumberInput } from 'src/components/inputs/formik'
|
||||||
import Autocomplete from 'src/components/inputs/formik/Autocomplete.js'
|
|
||||||
import { bold } from 'src/styling/helpers'
|
import { bold } from 'src/styling/helpers'
|
||||||
import { ReactComponent as TxInIcon } from 'src/styling/icons/direction/cash-in.svg'
|
import { ReactComponent as TxInIcon } from 'src/styling/icons/direction/cash-in.svg'
|
||||||
import { ReactComponent as TxOutIcon } from 'src/styling/icons/direction/cash-out.svg'
|
import { ReactComponent as TxOutIcon } from 'src/styling/icons/direction/cash-out.svg'
|
||||||
import { primaryColor, secondaryColorDark } from 'src/styling/variables'
|
|
||||||
import { CURRENCY_MAX } from 'src/utils/constants'
|
import { CURRENCY_MAX } from 'src/utils/constants'
|
||||||
|
|
||||||
const ALL_MACHINES = {
|
const ALL_MACHINES = {
|
||||||
|
|
@ -145,10 +143,12 @@ const getOverridesFields = (getData, currency, auxElements) => {
|
||||||
{
|
{
|
||||||
name: 'minimumTx',
|
name: 'minimumTx',
|
||||||
display: 'Minimun Tx',
|
display: 'Minimun Tx',
|
||||||
width: 144,
|
width: 169,
|
||||||
input: NumberInput,
|
size: 'lg',
|
||||||
doubleHeader: 'Cash-in only',
|
doubleHeader: 'Cash-in only',
|
||||||
textAlign: 'right',
|
textAlign: 'center',
|
||||||
|
editingAlign: 'right',
|
||||||
|
input: NumberInput,
|
||||||
suffix: currency,
|
suffix: currency,
|
||||||
bold: bold,
|
bold: bold,
|
||||||
inputProps: {
|
inputProps: {
|
||||||
|
|
@ -445,9 +445,9 @@ const getListCommissionsSchema = () => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const getTextStyle = (obj, isEditing) => {
|
// const getTextStyle = (obj, isEditing) => {
|
||||||
return { color: obj.default ? primaryColor : secondaryColorDark }
|
// return { color: obj.default ? primaryColor : secondaryColorDark }
|
||||||
}
|
// }
|
||||||
|
|
||||||
const commissionsList = (auxData, currency, auxElements) => {
|
const commissionsList = (auxData, currency, auxElements) => {
|
||||||
const getData = R.path(R.__, auxData)
|
const getData = R.path(R.__, auxData)
|
||||||
|
|
@ -482,7 +482,7 @@ const getListCommissionsFields = (getData, currency, defaults) => {
|
||||||
input: NumberInput,
|
input: NumberInput,
|
||||||
textAlign: 'right',
|
textAlign: 'right',
|
||||||
suffix: '%',
|
suffix: '%',
|
||||||
textStyle: obj => getTextStyle(obj),
|
// textStyle: obj => getTextStyle(obj),
|
||||||
inputProps: {
|
inputProps: {
|
||||||
decimalPlaces: 3
|
decimalPlaces: 3
|
||||||
}
|
}
|
||||||
|
|
@ -496,7 +496,7 @@ const getListCommissionsFields = (getData, currency, defaults) => {
|
||||||
textAlign: 'right',
|
textAlign: 'right',
|
||||||
greenText: true,
|
greenText: true,
|
||||||
suffix: '%',
|
suffix: '%',
|
||||||
textStyle: obj => getTextStyle(obj),
|
// textStyle: obj => getTextStyle(obj),
|
||||||
inputProps: {
|
inputProps: {
|
||||||
decimalPlaces: 3
|
decimalPlaces: 3
|
||||||
}
|
}
|
||||||
|
|
@ -509,7 +509,7 @@ const getListCommissionsFields = (getData, currency, defaults) => {
|
||||||
doubleHeader: 'Cash-in only',
|
doubleHeader: 'Cash-in only',
|
||||||
textAlign: 'right',
|
textAlign: 'right',
|
||||||
suffix: currency,
|
suffix: currency,
|
||||||
textStyle: obj => getTextStyle(obj),
|
// textStyle: obj => getTextStyle(obj),
|
||||||
inputProps: {
|
inputProps: {
|
||||||
decimalPlaces: 2
|
decimalPlaces: 2
|
||||||
}
|
}
|
||||||
|
|
@ -522,7 +522,7 @@ const getListCommissionsFields = (getData, currency, defaults) => {
|
||||||
doubleHeader: 'Cash-in only',
|
doubleHeader: 'Cash-in only',
|
||||||
textAlign: 'right',
|
textAlign: 'right',
|
||||||
suffix: currency,
|
suffix: currency,
|
||||||
textStyle: obj => getTextStyle(obj),
|
// textStyle: obj => getTextStyle(obj),
|
||||||
inputProps: {
|
inputProps: {
|
||||||
decimalPlaces: 2
|
decimalPlaces: 2
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,11 @@ import { mainFields, defaults, schema } from 'src/pages/Commissions/helper'
|
||||||
import { fromNamespace, toNamespace, namespaces } from 'src/utils/config'
|
import { fromNamespace, toNamespace, namespaces } from 'src/utils/config'
|
||||||
|
|
||||||
const useStyles = makeStyles(styles)
|
const useStyles = makeStyles(styles)
|
||||||
|
const useCommissionStyles = makeStyles({
|
||||||
|
autoComplete: {
|
||||||
|
width: '100%'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const GET_DATA = gql`
|
const GET_DATA = gql`
|
||||||
query getData {
|
query getData {
|
||||||
|
|
@ -26,6 +31,7 @@ const SAVE_CONFIG = gql`
|
||||||
|
|
||||||
function Commissions({ isActive, doContinue }) {
|
function Commissions({ isActive, doContinue }) {
|
||||||
const classes = useStyles()
|
const classes = useStyles()
|
||||||
|
const commissionClasses = useCommissionStyles()
|
||||||
const { data } = useQuery(GET_DATA)
|
const { data } = useQuery(GET_DATA)
|
||||||
|
|
||||||
const [saveConfig] = useMutation(SAVE_CONFIG, {
|
const [saveConfig] = useMutation(SAVE_CONFIG, {
|
||||||
|
|
@ -41,6 +47,8 @@ function Commissions({ isActive, doContinue }) {
|
||||||
fromNamespace(namespaces.LOCALE)(data?.config)
|
fromNamespace(namespaces.LOCALE)(data?.config)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const locale = fromNamespace(namespaces.LOCALE)(data?.config)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classes.wrapper}>
|
<div className={classes.wrapper}>
|
||||||
<TitleSection title="Commissions" />
|
<TitleSection title="Commissions" />
|
||||||
|
|
@ -56,7 +64,7 @@ function Commissions({ isActive, doContinue }) {
|
||||||
save={save}
|
save={save}
|
||||||
validationSchema={schema}
|
validationSchema={schema}
|
||||||
data={[]}
|
data={[]}
|
||||||
elements={mainFields(currency)}
|
elements={mainFields(currency, locale, commissionClasses)}
|
||||||
/>
|
/>
|
||||||
</Section>
|
</Section>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
12
new-lamassu-admin/src/utils/bill-options.js
Normal file
12
new-lamassu-admin/src/utils/bill-options.js
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
import * as R from 'ramda'
|
||||||
|
|
||||||
|
const getBillOptions = R.curry((locale, denomiations) => {
|
||||||
|
const currency = R.prop('fiatCurrency')(locale)
|
||||||
|
return R.compose(
|
||||||
|
R.map(code => ({ code, display: code })),
|
||||||
|
R.keys,
|
||||||
|
R.path([currency])
|
||||||
|
)(denomiations)
|
||||||
|
})
|
||||||
|
|
||||||
|
export { getBillOptions }
|
||||||
Loading…
Add table
Add a link
Reference in a new issue