diff --git a/changelog.md b/changelog.md
index 29bc19e5..ce9f6b82 100644
--- a/changelog.md
+++ b/changelog.md
@@ -217,5 +217,4 @@
- BO : Fixed issue when a freshly installed module logged an account error before any API credentials were entered
- BO : Fixed issue when the "Could not reach your Saferpay account" warning kept showing after payment methods had loaded successfully
- Fixed issue when files removed in this version stayed on disk after an upgrade, leaving obsolete iframe checkout controllers reachable and re-creating obsolete menu tabs on module reset
-- FO : Fixed issue when the Saferpay Fields CVC field looked editable while the card number was incomplete, showing no cursor and accepting no input
-- FO : Fixed issue when the Saferpay Fields card form accepted clicks and keystrokes while it was still loading, so the first characters typed were invisible and appeared to be lost
+- BO : Fixed issue when a saved API password offered no visible way to enter a new one, and browser password manager icons covered the show/hide password control
diff --git a/src/Service/SettingsTranslationService.php b/src/Service/SettingsTranslationService.php
index dd7f1958..3a68bbf1 100644
--- a/src/Service/SettingsTranslationService.php
+++ b/src/Service/SettingsTranslationService.php
@@ -118,6 +118,8 @@ private function getApiCredentialsTranslations()
'enterApiPassword' => $this->module->l('Enter %s API password', self::FILE_NAME),
'hidePassword' => $this->module->l('Hide password', self::FILE_NAME),
'showPassword' => $this->module->l('Show password', self::FILE_NAME),
+ 'changePassword' => $this->module->l('Change password', self::FILE_NAME),
+ 'passwordSavedHint' => $this->module->l('Password saved. Click the pencil icon to enter a new one.', self::FILE_NAME),
'terminalId' => $this->module->l('Terminal ID', self::FILE_NAME),
'selectTerminal' => $this->module->l('Select a terminal', self::FILE_NAME),
'refreshTerminals' => $this->module->l('Refresh terminals', self::FILE_NAME),
diff --git a/views/js/admin/settings-app/src/components/settings/api-credentials.tsx b/views/js/admin/settings-app/src/components/settings/api-credentials.tsx
index 5c4cbe81..af037bc1 100644
--- a/views/js/admin/settings-app/src/components/settings/api-credentials.tsx
+++ b/views/js/admin/settings-app/src/components/settings/api-credentials.tsx
@@ -4,7 +4,7 @@ import { Label } from '@/components/ui/label'
import { Input } from '@/components/ui/input'
import { Button } from '@/components/ui/button'
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'
-import { AlertCircle, Eye, EyeOff, Key, Shield, Loader2, Info, CheckCircle2, Wand2, XCircle } from 'lucide-react'
+import { AlertCircle, Eye, EyeOff, Key, Shield, Loader2, Info, CheckCircle2, Wand2, XCircle, Pencil } from 'lucide-react'
import { useSettings } from '@/context/settings-context'
import { toast } from '@/hooks/use-toast'
import { t } from '@/utils/translations'
@@ -68,7 +68,6 @@ export function ApiCredentials() {
if (!hasCredentials) {
setCredentialStatus('idle')
setCredentialError('')
- setTerminals([])
return
}
@@ -195,6 +194,10 @@ export function ApiCredentials() {
placeholder={t('enterApiUsername', envLabel.toLowerCase())}
value={username}
onChange={(e) => setField('username', e.target.value)}
+ data-lpignore="true"
+ data-1p-ignore=""
+ data-bwignore="true"
+ data-form-type="other"
required
aria-required="true"
/>
@@ -210,10 +213,26 @@ export function ApiCredentials() {
placeholder={t('enterApiPassword', envLabel.toLowerCase())}
value={password}
onChange={(e) => setField('password', e.target.value)}
- className={isStoredPasswordMasked ? undefined : 'sp-pr-10'}
+ readOnly={isStoredPasswordMasked}
+ className="!sp-pr-10"
+ data-lpignore="true"
+ data-1p-ignore=""
+ data-bwignore="true"
+ data-form-type="other"
required
aria-required="true"
/>
+ {isStoredPasswordMasked && (
+
+ )}
{showPasswordToggle && (