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:
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user