11 Commits

Author SHA1 Message Date
Milos Sen
f5c2e08f03 add sk translation 2026-08-09 04:44:20 +03:00
Milos Sen
42d4f44a70 rollback plugin name 1 2026-08-08 10:28:07 +03:00
Milos Sen
1a5b07273d change plugin name
Some checks failed
PHP Lint / lint (8.2) (pull_request) Has been cancelled
PHP Lint / lint (8.3) (pull_request) Has been cancelled
PHP Lint / lint (8.4) (pull_request) Has been cancelled
PHP CodeSniffer / phpcs (pull_request) Has been cancelled
2026-08-08 09:28:20 +03:00
Milos Sen
64d2ff3e98 change plugi name 2026-08-08 09:20:09 +03:00
Milos Sen
85a0d4f9ec change plugi name 2026-08-08 09:03:01 +03:00
Milos Sen
84c7b31dfb update comment 2026-08-08 06:53:11 +03:00
1499347b7b added workbench to list of skins 2026-08-07 19:41:40 +00:00
1d39bc03d8 Update SQL/postgres.initial.sql
makes the script safe to re-run against an already-migrated database
2026-08-06 05:10:47 +00:00
Laurent Dinclaux
8f45736b1b fix(skins): keep menu links visible and align native select look
The wrapper had width:100% which pushed the right-side menu links
(mail/contacts/settings/logout) out of #taskbar in Classic, and the
global custom select styling defeated Roundcube's native select
rendering — even when reset — because any background-image on a
<select> disables the native gradient/rounded corners.

- Scope the custom appearance/SVG-chevron CSS to Elastic and Larry
- Add a Classic-specific rule (width:auto, max-width, -2px nudge) that
  preserves Roundcube's native select look in #taskbar
- Drop the inline padding:0 imposed by the PHP renderer; let CSS own it
- Cap the Larry wrapper width to keep .button-logout in flow, and move
  the Larry-only styling out of the JS into the scoped CSS rule

Fixes #1
2026-05-12 17:02:32 +11:00
Laurent Dinclaux
8385197f11 chore: refresh composer.lock 2026-05-06 20:26:54 +11:00
Laurent Dinclaux
ca16e3ca39 ci: bump actions/checkout to v5 (Node 24) 2026-05-06 20:21:04 +11:00
10 changed files with 235 additions and 22 deletions

View File

@@ -13,7 +13,7 @@ jobs:
matrix: matrix:
php-version: ['8.2', '8.3', '8.4'] php-version: ['8.2', '8.3', '8.4']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- name: Setup PHP ${{ matrix.php-version }} - name: Setup PHP ${{ matrix.php-version }}
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2

View File

@@ -10,7 +10,7 @@ jobs:
phpcs: phpcs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2

View File

@@ -1,4 +1,13 @@
CREATE TABLE ident_switch -- Patched version of SQL/postgres.initial.sql for gecka/ident-switch.
-- Commit this into your Gitea fork at the same path, replacing the
-- upstream file. Only two changes from upstream:
-- 1. CREATE TABLE / CREATE INDEX -> IF NOT EXISTS
-- 2. INSERT INTO system -> upsert via ON CONFLICT
-- This makes the script safe to re-run against an already-migrated
-- database, which happens on every container restart unless
-- /var/www/html is persisted (composer re-installs "fresh" each time).
CREATE TABLE IF NOT EXISTS ident_switch
( (
id id
serial serial
@@ -82,8 +91,9 @@ CREATE TABLE ident_switch
UNIQUE (user_id, label) UNIQUE (user_id, label)
); );
CREATE INDEX IX_ident_switch_user_id ON ident_switch(user_id); CREATE INDEX IF NOT EXISTS IX_ident_switch_user_id ON ident_switch(user_id);
CREATE INDEX IX_ident_switch_iid ON ident_switch(iid); CREATE INDEX IF NOT EXISTS IX_ident_switch_iid ON ident_switch(iid);
CREATE INDEX IX_ident_switch_parent_id ON ident_switch(parent_id); CREATE INDEX IF NOT EXISTS IX_ident_switch_parent_id ON ident_switch(parent_id);
INSERT INTO system (name, value) VALUES ('ident_switch-version', '2026021000'); INSERT INTO system (name, value) VALUES ('ident_switch-version', '2026021000')
ON CONFLICT (name) DO UPDATE SET value = EXCLUDED.value;

View File

@@ -1,5 +1,5 @@
{ {
"name": "gecka/ident-switch", "name": "senior/ident-switch",
"type": "roundcube-plugin", "type": "roundcube-plugin",
"description": "This plugin allows users to switch between different accounts (including remote) in single Roundcube session.", "description": "This plugin allows users to switch between different accounts (including remote) in single Roundcube session.",
"homepage": "https://github.com/Gecka-Apps/roundcube-ident_switch", "homepage": "https://github.com/Gecka-Apps/roundcube-ident_switch",

4
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "46b2d3558cb304fde0539d1b85971382", "content-hash": "c1389b5e002c6014eeddc8105bf77db1",
"packages": [ "packages": [
{ {
"name": "roundcube/plugin-installer", "name": "roundcube/plugin-installer",
@@ -154,5 +154,5 @@
"ext-ctype": "*" "ext-ctype": "*"
}, },
"platform-dev": {}, "platform-dev": {},
"plugin-api-version": "2.6.0" "plugin-api-version": "2.9.0"
} }

View File

@@ -98,4 +98,4 @@ $config['ident_switch.preconfig_only'] = false;
* Useful for troubleshooting SMTP/Sieve routing and alias resolution. * Useful for troubleshooting SMTP/Sieve routing and alias resolution.
* Default: false. * Default: false.
*/ */
$config['ident_switch.debug'] = false; $config['ident_switch.debug'] = true;

View File

@@ -2,7 +2,7 @@
* ident_switch - Account switcher UI and new mail notifications. * ident_switch - Account switcher UI and new mail notifications.
* *
* Places the hidden <select> from the footer into the appropriate * Places the hidden <select> from the footer into the appropriate
* skin location (Larry, Classic, Elastic), shows it, and registers * skin location (Larry, Classic, Elastic, Workbench), shows it, and registers
* notification listeners for background mail checking. * notification listeners for background mail checking.
* *
* Copyright (C) 2016-2018 Boris Gulay * Copyright (C) 2016-2018 Boris Gulay
@@ -22,7 +22,6 @@ $(function() {
var $sw = $wrapper.find('#plugin-ident_switch-account'); var $sw = $wrapper.find('#plugin-ident_switch-account');
var placed = false; var placed = false;
switch (rcmail.env.skin) { switch (rcmail.env.skin) {
case 'larry': case 'larry':
placed = plugin_switchIdent_addCbLarry($wrapper, $sw); placed = plugin_switchIdent_addCbLarry($wrapper, $sw);
@@ -33,6 +32,9 @@ $(function() {
case 'elastic': case 'elastic':
placed = plugin_switchIdent_addCbElastic($wrapper, $sw); placed = plugin_switchIdent_addCbElastic($wrapper, $sw);
break; break;
case 'workbench':
placed = plugin_switchIdent_addCbElastic($wrapper, $sw);
break;
} }
if (!placed) { if (!placed) {
@@ -57,7 +59,7 @@ $(function() {
}); });
/** /**
* Place switcher in Larry skin: replace username in top-right corner. * Place switcher in Larry skin: replace username in top-right corner of #topline.
*/ */
function plugin_switchIdent_addCbLarry($wrapper, $sw) { function plugin_switchIdent_addCbLarry($wrapper, $sw) {
var $topRight = $('#topline .topright'); var $topRight = $('#topline .topright');
@@ -65,11 +67,6 @@ function plugin_switchIdent_addCbLarry($wrapper, $sw) {
return false; return false;
} }
$sw.css({
'font-weight': 'bold',
'text-overflow': 'ellipsis'
});
$topRight.find('.username').hide(); $topRight.find('.username').hide();
$topRight.prepend($wrapper); $topRight.prepend($wrapper);
return true; return true;

View File

@@ -15,8 +15,12 @@
width: 100%; width: 100%;
} }
/* Account switcher <select>: hide native arrow, show SVG chevron */ /* Account switcher <select>: hide native arrow, show SVG chevron.
.ident-switch-wrapper select { Scoped to Elastic (.header-title.username) and Larry (#topline .topright) where
the switcher replaces a styled header label; Classic uses Roundcube's native
select rendering instead (see #taskbar rule below). */
.header-title.username .ident-switch-wrapper select,
#topline .topright .ident-switch-wrapper select {
cursor: pointer; cursor: pointer;
-webkit-appearance: none; -webkit-appearance: none;
-moz-appearance: none; -moz-appearance: none;
@@ -53,6 +57,36 @@
display: none; display: none;
} }
/* Larry skin: blend the <select> into the dark #topline header (Larry styles a
<span> here, not a <select>, so without these the native white control sticks
out on the dark background). */
#topline .topright .ident-switch-wrapper {
width: auto;
}
#topline .topright .ident-switch-wrapper select {
background-color: transparent;
border: none;
box-shadow: none;
color: inherit;
font-weight: bold;
padding: 0 1.2em 0 0.25em;
text-overflow: ellipsis;
}
/* Classic skin: switcher is prepended inside #taskbar (right-aligned, nowrap, 24px tall).
Drop width:100% so it sits inline before the menu links instead of pushing them
off-screen. The select keeps Roundcube's default native rendering. */
#taskbar > .ident-switch-wrapper {
width: auto;
vertical-align: middle;
margin-right: 8px;
}
#taskbar > .ident-switch-wrapper select {
max-width: 180px;
position: relative;
top: -2px;
}
/* Unread badge */ /* Unread badge */
.ident-switch-badge { .ident-switch-badge {
flex-shrink: 0; flex-shrink: 0;

View File

@@ -222,7 +222,7 @@ class ident_switch extends rcube_plugin
$select = new html_select([ $select = new html_select([
'id' => 'plugin-ident_switch-account', 'id' => 'plugin-ident_switch-account',
'style' => 'display: none; padding: 0;', 'style' => 'display: none;',
'onchange' => 'plugin_switchIdent_switch(this.value);', 'onchange' => 'plugin_switchIdent_switch(this.value);',
]); ]);
$select->add($accNames, $accValues); $select->add($accNames, $accValues);

172
localization/sk_SK.inc Normal file
View File

@@ -0,0 +1,172 @@
<?php
/*
* Lokalizačný súbor pre plugin ident_switch
*/
$labels = array();
// Samostatný účet
$labels['form.caption'] = 'Samostatný účet';
$labels['form.description'] = 'Nakonfigurujte túto identitu ako samostatný účet s vlastnými pripojeniami na poštový server.';
$labels['form.preconfig_only_warning'] = 'Konfigurácia samostatného účtu nie je dostupná pre doménu %s.';
// Všeobecné
$labels['form.common.general'] = 'Všeobecné';
// Režim účtu
$labels['form.common.mode'] = 'Režim účtu';
$labels['form.common.mode.primary'] = 'Hlavný účet';
$labels['form.common.mode.separate'] = 'Samostatný účet';
$labels['form.common.mode.hint'] = 'Prepojte túto identitu s existujúcim účtom alebo ju nakonfigurujte ako samostatný účet s vlastným poštovým serverom.';
// Názov
$labels['form.common.label'] = 'Názov';
$labels['form.common.label.hint'] = 'Názov zobrazený v prepínači účtov. Ak je prázdne, použije sa e-mailová adresa.';
// Hodnota v poli 'Názov' je príliš dlhá (max. 32 znakov).
$labels['err.label.long'] = 'Hodnota v poli \'Názov\' je príliš dlhá (max. 32 znakov).';
// IMAP
$labels['form.imap.caption'] = 'IMAP';
// Server prichádzajúcej pošty
$labels['form.imap.host'] = 'Server prichádzajúcej pošty';
// Zabezpečenie
$labels['form.imap.security'] = 'Zabezpečenie';
// Port
$labels['form.imap.port'] = 'Port';
// Oddeľovač hierarchie priečinkov
$labels['form.imap.delimiter'] = 'Oddeľovač hierarchie priečinkov';
$labels['form.imap.delimiter.auto'] = 'Automaticky';
$labels['form.imap.delimiter.manual'] = 'Manuálne';
// Používateľské meno
$labels['form.imap.username'] = 'Používateľské meno';
// Heslo
$labels['form.imap.password'] = 'Heslo';
// Hodnota v poli 'Používateľské meno' je príliš dlhá (max. 64 znakov).
$labels['err.user.long'] = 'Hodnota v poli \'Používateľské meno\' je príliš dlhá (max. 64 znakov).';
// SMTP
$labels['form.smtp.caption'] = 'SMTP';
// Server odchádzajúcej pošty
$labels['form.smtp.host'] = 'Server odchádzajúcej pošty';
// Zabezpečenie
$labels['form.smtp.security'] = 'Zabezpečenie';
// Port
$labels['form.smtp.port'] = 'Port';
// Autorizácia
$labels['form.smtp.auth'] = 'Autorizácia';
// Ako IMAP
$labels['form.smtp.auth.imap'] = 'Ako IMAP';
// Žiadna
$labels['form.smtp.auth.none'] = 'Žiadna';
// Vlastná
$labels['form.smtp.auth.custom'] = 'Vlastná';
// Používateľské meno
$labels['form.smtp.username'] = 'Používateľské meno';
// Heslo
$labels['form.smtp.password'] = 'Heslo';
// Sieve
$labels['form.sieve.caption'] = 'Sieve';
// Názov hostiteľa servera
$labels['form.sieve.host'] = 'Názov hostiteľa servera';
// Zabezpečenie
$labels['form.sieve.security'] = 'Zabezpečenie';
// Port
$labels['form.sieve.port'] = 'Port';
// Autorizácia
$labels['form.sieve.auth'] = 'Autorizácia';
// Ako IMAP
$labels['form.sieve.auth.imap'] = 'Ako IMAP';
// Žiadna
$labels['form.sieve.auth.none'] = 'Žiadna';
// Vlastná
$labels['form.sieve.auth.custom'] = 'Vlastná';
// Používateľské meno
$labels['form.sieve.username'] = 'Používateľské meno';
// Heslo
$labels['form.sieve.password'] = 'Heslo';
// Upozornenia
$labels['form.notify.caption'] = 'Upozornenia';
// Kontrolovať novú poštu
$labels['form.notify.check'] = 'Kontrolovať novú poštu';
// Fokus / favicon
$labels['form.notify.basic'] = 'Fokus / favicon';
// Zvuk
$labels['form.notify.sound'] = 'Zvuk';
// Upozornenie na ploche
$labels['form.notify.desktop'] = 'Upozornenie na ploche';
// Použiť predvolené
$labels['form.notify.default'] = 'predvolené';
// Zapnuté
$labels['form.notify.on'] = 'Zapnuté';
// Vypnuté
$labels['form.notify.off'] = 'Vypnuté';
// Vyžaduje plugin newmail_notifier
$labels['form.notify.requires_newmail_notifier'] = 'Upozornenia vyžadujú plugin newmail_notifier. Prosím, povoľte ho alebo kontaktujte administrátora.';
// Možnosti zabezpečenia
$labels['form.security.none'] = 'Žiadne';
$labels['form.security.starttls'] = 'STARTTLS';
$labels['form.security.ssl'] = 'SSL/TLS';
$labels['form.security.none_warning'] = 'Nešifrované pripojenia nie sú bezpečné. Vaše prihlasovacie údaje a e-maily môžu byť zachytené. Vždy, keď je to možné, použite SSL/TLS alebo STARTTLS.';
// Chyby
// Hodnota v poli 'Názov hostiteľa servera' je príliš dlhá (max. 64 znakov).
$labels['err.host.long'] = 'Hodnota v poli \'Názov hostiteľa servera\' je príliš dlhá (max. 64 znakov).';
// Hodnota v poli 'Port' musí byť číslo.
$labels['err.port.num'] = 'Hodnota v poli \'Port\' musí byť číslo.';
// Hodnota v poli 'Port' musí byť medzi 1 a 65535.
$labels['err.port.range'] = 'Hodnota v poli \'Port\' musí byť medzi 1 a 65535.';
// Pripojenie IMAP zlyhalo.
$labels['err.imap.connect'] = 'Pripojenie IMAP zlyhalo. Skontrolujte adresu servera, port a prihlasovacie údaje.';
// Pripojenie SMTP zlyhalo.
$labels['err.smtp.connect'] = 'Pripojenie SMTP zlyhalo. Skontrolujte adresu servera, port a prihlasovacie údaje.';
// Pripojenie Sieve zlyhalo.
$labels['err.sieve.connect'] = 'Pripojenie Sieve zlyhalo. Skontrolujte adresu servera, port a prihlasovacie údaje.';