fix(domains): Neu-einlesen-Knopf nur fuer Verwalter sichtbar (WR-06)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-08 11:29:01 +02:00
parent 9eada2e082
commit e1dd996438
5 changed files with 34 additions and 21 deletions
@@ -230,14 +230,16 @@ export function ContactsTab({
<input type="checkbox" checked={grouped} onChange={(e) => setGrouped(e.target.checked)} />
{tc('groupByCustomer')}
</label>
<button
type="button"
className={SECONDARY_BUTTON}
disabled={loading}
onClick={() => void load(true)}
>
{t('refresh')}
</button>
{canManage && (
<button
type="button"
className={SECONDARY_BUTTON}
disabled={loading}
onClick={() => void load(true)}
>
{t('refresh')}
</button>
)}
{canManage && !creating && (
<button type="button" className={PRIMARY_BUTTON} onClick={() => setCreating(true)}>
{t('newContact')}
@@ -83,7 +83,14 @@ function DomainTable({ rows }: { rows: DomainsDomain[] }) {
* (ueber den Inhaber-Kontakt), Inhaber, Ablaufdatum und Status — filterbar und
* nach Kunde gruppierbar. Nur lesend; sichtbar fuer alle mit "Benutzen".
*/
export function DomainsTab({ customers }: { customers: DomainsCustomer[] }) {
export function DomainsTab({
customers,
canManage,
}: {
customers: DomainsCustomer[];
/** Nur Verwalter duerfen den Zwischenspeicher umgehen (Neuabruf bei AutoDNS). */
canManage: boolean;
}) {
const t = useTranslations('domains.domainList');
const tc = useTranslations('domains.common');
const [data, setData] = useState<DomainsDomainList | null>(null);
@@ -162,14 +169,16 @@ export function DomainsTab({ customers }: { customers: DomainsCustomer[] }) {
<input type="checkbox" checked={grouped} onChange={(e) => setGrouped(e.target.checked)} />
{tc('groupByCustomer')}
</label>
<button
type="button"
className={SECONDARY_BUTTON}
disabled={loading}
onClick={() => void load(true)}
>
{t('refresh')}
</button>
{canManage && (
<button
type="button"
className={SECONDARY_BUTTON}
disabled={loading}
onClick={() => void load(true)}
>
{t('refresh')}
</button>
)}
</div>
{error && (
@@ -384,8 +384,8 @@ describe('Reiter Domains, Kontakte und Kunden', () => {
expect(screen.queryByRole('button', { name: 'Neuer Kontakt' })).toBeNull();
expect(screen.queryByRole('button', { name: 'Zuordnen' })).toBeNull();
expect(screen.queryByRole('checkbox', { name: /auswählen/ })).toBeNull();
// Lesen darf jeder: neu einlesen steht allen zur Verfuegung.
expect(screen.getByRole('button', { name: 'Aus AutoDNS neu einlesen' })).toBeTruthy();
// Der Neuabruf bei AutoDNS ist Verwaltern vorbehalten (der Server ignoriert ihn sonst).
expect(screen.queryByRole('button', { name: 'Aus AutoDNS neu einlesen' })).toBeNull();
fireEvent.click(screen.getByRole('button', { name: 'Kunden' }));
await screen.findByText('Alpha GmbH');
@@ -104,7 +104,9 @@ export default function DomainsPage() {
{tabs.length > 0 && activeTab && (
<>
<TabBar tabs={tabs} active={activeTab} onChange={setTab} />
{activeTab === 'domains' && status?.configured && <DomainsTab customers={customers} />}
{activeTab === 'domains' && status?.configured && (
<DomainsTab customers={customers} canManage={canManage} />
)}
{activeTab === 'contacts' && status?.configured && (
<ContactsTab
customers={customers}