Merge pull request #2916 from worryzyy/feature/add-quota-amount-input

feat(user): add currency amount input with auto quota conversion
This commit is contained in:
Weilei
2026-02-12 14:48:32 +08:00
committed by GitHub
parent eecec32819
commit 11d5f2ac12
6 changed files with 72 additions and 9 deletions

View File

@@ -25,7 +25,12 @@ import {
showSuccess,
renderQuota,
renderQuotaWithPrompt,
getCurrencyConfig,
} from '../../../../helpers';
import {
quotaToDisplayAmount,
displayAmountToQuota,
} from '../../../../helpers/quota';
import { useIsMobile } from '../../../../hooks/common/useIsMobile';
import {
Button,
@@ -60,6 +65,7 @@ const EditUserModal = (props) => {
const [loading, setLoading] = useState(true);
const [addQuotaModalOpen, setIsModalOpen] = useState(false);
const [addQuotaLocal, setAddQuotaLocal] = useState('');
const [addAmountLocal, setAddAmountLocal] = useState('');
const isMobile = useIsMobile();
const [groupOptions, setGroupOptions] = useState([]);
const formApiRef = useRef(null);
@@ -367,8 +373,12 @@ const EditUserModal = (props) => {
onOk={() => {
addLocalQuota();
setIsModalOpen(false);
setAddQuotaLocal('');
setAddAmountLocal('');
}}
onCancel={() => {
setIsModalOpen(false);
}}
onCancel={() => setIsModalOpen(false)}
closable={null}
title={
<div className='flex items-center'>
@@ -387,14 +397,48 @@ const EditUserModal = (props) => {
);
})()}
</div>
<InputNumber
placeholder={t('需要添加的额度(支持负数)')}
value={addQuotaLocal}
onChange={setAddQuotaLocal}
style={{ width: '100%' }}
showClear
step={500000}
/>
{getCurrencyConfig().type !== 'TOKENS' && (
<div className='mb-3'>
<div className='mb-1'>
<Text size='small'>{t('金额')}</Text>
<Text size='small' type='tertiary'> ({t('仅用于换算,实际保存的是额度')})</Text>
</div>
<InputNumber
prefix={getCurrencyConfig().symbol}
placeholder={t('输入金额')}
value={addAmountLocal}
precision={2}
onChange={(val) => {
setAddAmountLocal(val);
setAddQuotaLocal(
val != null && val !== '' ? displayAmountToQuota(Math.abs(val)) * Math.sign(val) : '',
);
}}
style={{ width: '100%' }}
showClear
/>
</div>
)}
<div>
<div className='mb-1'>
<Text size='small'>{t('额度')}</Text>
</div>
<InputNumber
placeholder={t('输入额度')}
value={addQuotaLocal}
onChange={(val) => {
setAddQuotaLocal(val);
setAddAmountLocal(
val != null && val !== ''
? Number((quotaToDisplayAmount(Math.abs(val)) * Math.sign(val)).toFixed(2))
: '',
);
}}
style={{ width: '100%' }}
showClear
step={500000}
/>
</div>
</Modal>
</>
);

View File

@@ -2603,6 +2603,10 @@
"频率限制的周期(分钟)": "Rate limit period (minutes)",
"颜色": "Color",
"额度": "Quota",
"输入额度": "Enter quota",
"金额": "Amount",
"输入金额": "Enter amount",
"仅用于换算,实际保存的是额度": "For conversion only, quota is what gets saved",
"额度必须大于0": "Quota must be greater than 0",
"额度提醒阈值": "Quota reminder threshold",
"额度查询接口返回令牌额度而非用户额度": "Displays token quota instead of user quota",

View File

@@ -2566,6 +2566,10 @@
"频率限制的周期(分钟)": "Période de limitation de débit (minutes)",
"颜色": "Couleur",
"额度": "Quota",
"输入额度": "Entrer le quota",
"金额": "Montant",
"输入金额": "Entrer le montant",
"仅用于换算,实际保存的是额度": "Uniquement pour la conversion, c'est le quota qui est enregistré",
"额度必须大于0": "Le quota doit être supérieur à 0",
"额度提醒阈值": "Seuil de rappel de quota",
"额度查询接口返回令牌额度而非用户额度": "Affiche le quota de jetons au lieu du quota utilisateur",

View File

@@ -2549,6 +2549,10 @@
"频率限制的周期(分钟)": "レート制限の期間(分)",
"颜色": "カラー",
"额度": "クォータ",
"输入额度": "クォータを入力",
"金额": "金額",
"输入金额": "金額を入力",
"仅用于换算,实际保存的是额度": "換算用のみ、実際に保存されるのはクォータです",
"额度必须大于0": "クォータは0より大きい必要があります",
"额度提醒阈值": "クォータアラートしきい値",
"额度查询接口返回令牌额度而非用户额度": "クォータ取得APIは、ユーザークォータではなくトークンクォータを返します",

View File

@@ -2579,6 +2579,10 @@
"频率限制的周期(分钟)": "Период ограничения частоты (минуты)",
"颜色": "Цвет",
"额度": "Квота",
"输入额度": "Введите квоту",
"金额": "Сумма",
"输入金额": "Введите сумму",
"仅用于换算,实际保存的是额度": "Только для пересчёта, сохраняется квота",
"额度必须大于0": "Квота должна быть больше 0",
"额度提醒阈值": "Порог напоминания о квоте",
"额度查询接口返回令牌额度而非用户额度": "Интерфейс запроса квоты возвращает квоту токенов, а не квоту пользователя",

View File

@@ -3130,6 +3130,9 @@
"频率限制的周期(分钟)": "Chu kỳ giới hạn tần suất (phút)",
"颜色": "Màu sắc",
"额度": "Hạn ngạch",
"输入额度": "Nhập hạn ngạch",
"输入金额": "Nhập số tiền",
"仅用于换算,实际保存的是额度": "Chỉ dùng để quy đổi, giá trị lưu thực tế là hạn ngạch",
"额度必须大于0": "Hạn ngạch phải lớn hơn 0",
"额度提醒阈值": "Ngưỡng nhắc nhở hạn ngạch",
"额度查询接口返回令牌额度而非用户额度": "Giao diện truy vấn hạn ngạch trả về hạn ngạch mã thông báo thay vì hạn ngạch người dùng",