Add Auto/Manual mode select for IMAP delimiter

This commit is contained in:
Laurent Dinclaux
2026-02-10 18:14:03 +11:00
parent 36b9b3e35f
commit 39fe417104
9 changed files with 60 additions and 8 deletions

View File

@@ -43,9 +43,14 @@ $(function() {
});
});
// Delimiter blur handler
$("INPUT[name='_ident_switch.form.imap.delimiter']").on('blur', function() {
plugin_switchIdent_clearIfDefault($(this));
// Delimiter mode handler
$("SELECT[name='_ident_switch.form.imap.delimiter_mode']").on('change', function() {
if ($(this).val() === 'manual') {
$('#ident-switch-delimiter-input').show();
} else {
$('#ident-switch-delimiter-input').hide();
$("INPUT[name='_ident_switch.form.imap.delimiter']").val('');
}
});
});
@@ -113,6 +118,9 @@ function plugin_switchIdent_processPreconfig() {
$("SELECT[name='_ident_switch.form.smtp.security']").prop("disabled", true);
$("INPUT[name='_ident_switch.form.smtp.port']").prop("disabled", true);
$("SELECT[name='_ident_switch.form.imap.delimiter_mode']").prop("disabled", true);
$("INPUT[name='_ident_switch.form.imap.delimiter']").prop("disabled", true);
$("INPUT[name='_ident_switch.form.sieve.host']").prop("disabled", true);
$("SELECT[name='_ident_switch.form.sieve.security']").prop("disabled", true);
$("INPUT[name='_ident_switch.form.sieve.port']").prop("disabled", true);

View File

@@ -54,7 +54,7 @@ class IdentSwitchForm
$prefix . 'port' => ['type' => 'text', 'size' => 5, 'placeholder' => 993],
$prefix . 'username' => ['type' => 'text', 'size' => 64, 'placeholder' => $record['email'] ?? ''],
$prefix . 'password' => ['type' => 'password', 'size' => 64],
$prefix . 'delimiter' => ['type' => 'text', 'size' => 1, 'placeholder' => 'Auto'],
$prefix . 'delimiter' => ['value' => $this->build_delimiter_field($prefix, $record)],
];
}
@@ -169,6 +169,31 @@ class IdentSwitchForm
return $select->show($current) . $warning;
}
/**
* Build the delimiter field with Auto/Manual mode select.
*
* @param string $prefix Form field prefix (e.g. 'ident_switch.form.imap.').
* @param array $record Identity record data.
* @return string Rendered HTML select + text input.
*/
private function build_delimiter_field(string $prefix, array &$record): string
{
$delimValue = $record[$prefix . 'delimiter'] ?? '';
$mode = ($delimValue !== '' && $delimValue !== null) ? 'manual' : 'auto';
$select = new html_select(['name' => "_{$prefix}delimiter_mode"]);
$select->add($this->plugin->gettext('form.imap.delimiter.auto'), 'auto');
$select->add($this->plugin->gettext('form.imap.delimiter.manual'), 'manual');
$hidden = $mode === 'auto' ? ' style="display:none"' : '';
$input = new html_inputfield(['name' => "_{$prefix}delimiter", 'size' => 1]);
return $select->show($mode)
. ' <span id="ident-switch-delimiter-input"' . $hidden . '>'
. $input->show($delimValue)
. '</span>';
}
/**
* Parse scheme prefix from a host string.
*
@@ -531,10 +556,15 @@ class IdentSwitchForm
return $retVal;
}
$retVal['imap.delimiter'] = self::get_field_value('imap', 'delimiter');
if (strlen($retVal['imap.delimiter'] ?? '') > 1) {
$retVal['err'] = 'delim.long';
return $retVal;
$delimMode = self::get_field_value('imap', 'delimiter_mode');
if ($delimMode === 'manual') {
$retVal['imap.delimiter'] = self::get_field_value('imap', 'delimiter');
if (strlen($retVal['imap.delimiter'] ?? '') > 1) {
$retVal['err'] = 'delim.long';
return $retVal;
}
} else {
$retVal['imap.delimiter'] = null;
}
$retVal['imap.user'] = self::get_field_value('imap', 'username');

View File

@@ -37,6 +37,8 @@ $labels['form.imap.password'] = 'Passwort';
// Folder hierarchy delimiter
$labels['form.imap.delimiter'] = 'Ordnerhierarchie-Trennzeichen';
$labels['form.imap.delimiter.auto'] = 'Automatisch erkennen';
$labels['form.imap.delimiter.manual'] = 'Manuell';
// Value in \'Username\' field is too long (64 chars max).
$labels['err.user.long'] = 'Der Wert in Feld \'Benutzername\' ist zu lang (max. 64 Zeichen).';

View File

@@ -31,6 +31,8 @@ $labels['form.imap.port'] = 'Port';
// Folder hierarchy delimiter
$labels['form.imap.delimiter'] = 'Folder hierarchy delimiter';
$labels['form.imap.delimiter.auto'] = 'Auto-detect';
$labels['form.imap.delimiter.manual'] = 'Manual';
// Username
$labels['form.imap.username'] = 'Username';

View File

@@ -37,6 +37,8 @@ $labels['form.imap.password'] = 'Mot de passe';
// Folder hierarchy delimiter
$labels['form.imap.delimiter'] = 'Délimiteur de hiérarchie des dossiers';
$labels['form.imap.delimiter.auto'] = 'Auto-détection';
$labels['form.imap.delimiter.manual'] = 'Manuel';
// Value in \'Username\' field of IMAP section is too long (64 chars max).
$labels['err.user.long'] = 'La valeur du champ \'Nom d\'utilisateur\' de la section IMAP est trop longue (64 caractères max).';

View File

@@ -31,6 +31,8 @@ $labels['form.imap.port'] = 'Porta';
// Folder hierarchy delimiter
$labels['form.imap.delimiter'] = 'Delimitatore gerarchico delle cartelle';
$labels['form.imap.delimiter.auto'] = 'Rilevamento automatico';
$labels['form.imap.delimiter.manual'] = 'Manuale';
// Username
$labels['form.imap.username'] = 'Username';

View File

@@ -31,6 +31,8 @@ $labels['form.imap.port'] = 'Poortnummer';
// Folder hierarchy delimiter
$labels['form.imap.delimiter'] = 'Map hiërarchie scheidingsteken';
$labels['form.imap.delimiter.auto'] = 'Automatisch detecteren';
$labels['form.imap.delimiter.manual'] = 'Handmatig';
// Username
$labels['form.imap.username'] = 'Gebruikersnaam';

View File

@@ -31,6 +31,8 @@ $labels['form.imap.port'] = 'Порт';
// Folder hierarchy delimiter
$labels['form.imap.delimiter'] = 'Разделитель в иерархии папок';
$labels['form.imap.delimiter.auto'] = 'Автоопределение';
$labels['form.imap.delimiter.manual'] = 'Вручную';
// Username
$labels['form.imap.username'] = 'Имя пользователя';

View File

@@ -31,6 +31,8 @@ $labels['form.imap.port'] = 'Vrata';
// Folder hierarchy delimiter
$labels['form.imap.delimiter'] = 'Ločilo hierarhije map';
$labels['form.imap.delimiter.auto'] = 'Samodejno zaznavanje';
$labels['form.imap.delimiter.manual'] = 'Ročno';
// Username
$labels['form.imap.username'] = 'Uporabniško ime';