diff --git a/new-lamassu-admin/src/components/editableTable/Table.js b/new-lamassu-admin/src/components/editableTable/Table.js index 4a769ca5..734b3b40 100644 --- a/new-lamassu-admin/src/components/editableTable/Table.js +++ b/new-lamassu-admin/src/components/editableTable/Table.js @@ -54,8 +54,13 @@ const ETable = ({ }) => { const [editingId, setEditingId] = useState(null) const [adding, setAdding] = useState(false) + const [saving, setSaving] = useState(false) const innerSave = async value => { + if (saving) return + + setSaving(true) + const it = validationSchema.cast(value) const index = R.findIndex(R.propEq('id', it.id))(data) const list = index !== -1 ? R.update(index, it, data) : R.prepend(it, data) @@ -63,11 +68,16 @@ const ETable = ({ if (!R.equals(data[index], it)) { // no response means the save failed const response = await save({ [name]: list }, it) - if (!response) return + if (!response) { + setSaving(false) + return + } } setAdding(false) setEditingId(null) + setEditing && setEditing(false) + setSaving(false) } const onDelete = id => { @@ -86,7 +96,10 @@ const ETable = ({ setEditing && setEditing(it, true) } - const addField = () => setAdding(true) + const addField = () => { + setAdding(true) + setEditing && setEditing(true, true) + } const widthIfEditNull = enableDelete || enableToggle ? ACTION_COL_SIZE : ACTION_COL_SIZE * 2 @@ -128,10 +141,8 @@ const ETable = ({ return (
- {showButtonOnEmpty && ( - - {createText} - + {showButtonOnEmpty && canAdd && ( + {createText} )} {showTable && ( <> @@ -185,7 +196,9 @@ const ETable = ({ lastOfGroup={isLastOfGroup} editing={editingId === it.id} disabled={ - forceDisable || (editingId && editingId !== it.id) + forceDisable || + (editingId && editingId !== it.id) || + adding } /> diff --git a/new-lamassu-admin/src/pages/Commissions/Commissions.js b/new-lamassu-admin/src/pages/Commissions/Commissions.js index 35118799..159a6be4 100644 --- a/new-lamassu-admin/src/pages/Commissions/Commissions.js +++ b/new-lamassu-admin/src/pages/Commissions/Commissions.js @@ -1,7 +1,7 @@ import { useQuery, useMutation } from '@apollo/react-hooks' import gql from 'graphql-tag' import * as R from 'ramda' -import React from 'react' +import React, { useState } from 'react' import { Table as EditableTable } from 'src/components/editableTable' import Section from 'src/components/layout/Section' @@ -38,6 +38,8 @@ const SAVE_CONFIG = gql` ` const Commissions = ({ name: SCREEN_KEY }) => { + const [isEditingDefault, setEditingDefault] = useState(false) + const [isEditingOverrides, setEditingOverrides] = useState(false) const { data } = useQuery(GET_DATA) const [saveConfig] = useMutation(SAVE_CONFIG, { refetchQueries: () => ['getData'] @@ -61,6 +63,9 @@ const Commissions = ({ name: SCREEN_KEY }) => { return saveConfig({ variables: { config } }) } + const onEditingDefault = (it, editing) => setEditingDefault(editing) + const onEditingOverrides = (it, editing) => setEditingOverrides(editing) + return ( <> @@ -76,6 +81,8 @@ const Commissions = ({ name: SCREEN_KEY }) => { validationSchema={schema} data={R.of(commission)} elements={mainFields(currency)} + setEditing={onEditingDefault} + forceDisable={isEditingOverrides} />
@@ -91,6 +98,8 @@ const Commissions = ({ name: SCREEN_KEY }) => { validationSchema={OverridesSchema} data={commissionOverrides} elements={overrides(data, currency, commissionOverrides)} + setEditing={onEditingOverrides} + forceDisable={isEditingDefault} />
diff --git a/new-lamassu-admin/src/pages/Locales/Locales.js b/new-lamassu-admin/src/pages/Locales/Locales.js index 616ab86d..ea2ef082 100644 --- a/new-lamassu-admin/src/pages/Locales/Locales.js +++ b/new-lamassu-admin/src/pages/Locales/Locales.js @@ -89,6 +89,8 @@ const FiatCurrencyChangeAlert = ({ open, close, save }) => { } const Locales = ({ name: SCREEN_KEY }) => { + const [isEditingDefault, setEditingDefault] = useState(false) + const [isEditingOverrides, setEditingOverrides] = useState(false) const { data } = useQuery(GET_DATA) const [saveConfig] = useMutation(SAVE_CONFIG, { refetchQueries: () => ['getData'] @@ -119,6 +121,9 @@ const Locales = ({ name: SCREEN_KEY }) => { return saveConfig({ variables: { config } }) } + const onEditingDefault = (it, editing) => setEditingDefault(editing) + const onEditingOverrides = (it, editing) => setEditingOverrides(editing) + return ( <> { validationSchema={LocaleSchema} data={R.of(locale)} elements={mainFields(data)} + setEditing={onEditingDefault} + forceDisable={isEditingOverrides} />
@@ -151,8 +158,10 @@ const Locales = ({ name: SCREEN_KEY }) => { initialValues={overridesDefaults} save={saveOverrides} validationSchema={OverridesSchema} - data={localeOverrides} + data={localeOverrides ?? []} elements={overrides(data, localeOverrides)} + setEditing={onEditingOverrides} + forceDisable={isEditingDefault} />
diff --git a/new-lamassu-admin/src/pages/Notifications/Notifications.js b/new-lamassu-admin/src/pages/Notifications/Notifications.js index 454aba78..439a179d 100644 --- a/new-lamassu-admin/src/pages/Notifications/Notifications.js +++ b/new-lamassu-admin/src/pages/Notifications/Notifications.js @@ -95,7 +95,7 @@ const Notifications = ({ name: SCREEN_KEY }) => {
- +
diff --git a/new-lamassu-admin/src/pages/Notifications/components/SingleFieldEditableNumber.js b/new-lamassu-admin/src/pages/Notifications/components/SingleFieldEditableNumber.js index 355b817f..c36a1064 100644 --- a/new-lamassu-admin/src/pages/Notifications/components/SingleFieldEditableNumber.js +++ b/new-lamassu-admin/src/pages/Notifications/components/SingleFieldEditableNumber.js @@ -1,5 +1,5 @@ import { Form, Formik } from 'formik' -import React, { useContext } from 'react' +import React, { useContext, useState } from 'react' import * as Yup from 'yup' import PromptWhenDirty from 'src/components/PromptWhenDirty' @@ -17,6 +17,19 @@ const SingleFieldEditableNumber = ({ section, className }) => { + const [saving, setSaving] = useState(false) + + const innerSave = async (section, value) => { + if (saving) return + + setSaving(true) + + // no response means the save failed + await save(section, value) + + setSaving(false) + } + const { save, data, @@ -38,7 +51,7 @@ const SingleFieldEditableNumber = ({ enableReinitialize initialValues={{ [name]: (data && data[name]) ?? '' }} validationSchema={schema} - onSubmit={it => save(section, schema.cast(it))} + onSubmit={it => innerSave(section, schema.cast(it))} onReset={() => { setEditing(name, false) }}> diff --git a/new-lamassu-admin/src/pages/Notifications/sections/Setup.js b/new-lamassu-admin/src/pages/Notifications/sections/Setup.js index 7c405fd7..d5816c09 100644 --- a/new-lamassu-admin/src/pages/Notifications/sections/Setup.js +++ b/new-lamassu-admin/src/pages/Notifications/sections/Setup.js @@ -26,13 +26,13 @@ const sizes = { } const width = R.sum(R.values(sizes)) + channelSize -const Row = ({ namespace }) => { +const Row = ({ namespace, forceDisable }) => { const { data: rawData, save: rawSave } = useContext(NotificationsCtx) const save = R.compose(rawSave(null), toNamespace(namespace)) const data = fromNamespace(namespace)(rawData) - const disabled = !data || !data.active + const disabled = forceDisable || !data || !data.active const Cell = ({ name, disabled }) => { const value = !!(data && data[name]) @@ -58,7 +58,7 @@ const Row = ({ namespace }) => { - + ) } @@ -68,7 +68,7 @@ const useStyles = makeStyles({ width } }) -const Setup = () => { +const Setup = ({ forceDisable }) => { const classes = useStyles() return ( @@ -81,8 +81,8 @@ const Setup = () => { ))} - - + +
)