Kundenansicht der Mitarbeiter: Einschalten gesperrt statt 403-Text nach dem Tipp

Die Hülle reicht viewAs der Sitzung an die Einschalt-Option der Module durch
(News, Terminplaner, Webshop, Buchungskalender, Zeiten), auch wenn ein Modul es
nicht nennt. In Entdecken ist der Einschalten-Knopf gesperrt, daneben steht
"In der Kundenansicht nicht möglich." Meine bleibt bei gesperrtem Knopf auf der
Bestätigungsseite (jetzt gepinnt).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-16 19:30:26 +00:00
1 parent 0df96611dc
commit 524ac64d20
5 files changed
+57 -4

No files matched your search

+32
View File
@@ -292,3 +292,35 @@ test('wechselFunktion: nicht, wenn die Website die Funktion schon hat, die Websi
assert.deepEqual(u.gegangen, [])
}
}))
test('Mitarbeiter-Kundenansicht (me.viewAs), Entdecken: jeder Einschalten-Knopf ist gesperrt, der Hinweis steht daneben, der Tipp geht nirgends hin', mit(async (fx) => {
const u = umgebung(fx, { d: daten({ abo: { produkt: 'wartung' } }), me: { viewAs: true } })
await u.zeige(ENTDECKEN)
const karten = fx.alle(u.wurzel, 'section[data-fn]')
assert.ok(karten.length >= 5)
for (const karte of karten) {
const knopf = fx.finde(karte, '[data-aktion="einschalten"]')
if (!knopf) continue // Funktion nur für Betriebe: dort steht ohnehin ein Hinweis statt des Knopfes
assert.equal(knopf.disabled, true, karte.getAttribute('data-fn'))
assert.match(fx.text(karte), /In der Kundenansicht nicht möglich\./, karte.getAttribute('data-fn'))
await fx.klick(knopf)
}
assert.deepEqual(u.gegangen, [])
assert.equal(fx.finde(u.wurzel, 'section.kn-fn-einschalten'), null)
// ohne Kundenansicht bleibt der Knopf frei und ohne Hinweis
const frei = umgebung(fx, { d: daten({ abo: { produkt: 'wartung' } }) })
await frei.zeige(ENTDECKEN)
assert.equal(fx.finde(frei.wurzel, 'section[data-fn="news"] [data-aktion="einschalten"]').disabled, false)
assert.doesNotMatch(fx.text(frei.wurzel), /In der Kundenansicht nicht möglich/)
}))
test('Mitarbeiter-Kundenansicht, Meine: eine angenommene Anfrage öffnet die Bestätigung mit gesperrtem Knopf und Hinweis, ohne Abruf zum Einschalten', mit(async (fx) => {
const u = umgebung(fx, { d: daten({ projekte: [projekt('p1', 'Bäckerei', { shop: feature('off', { anfrageStatus: 'angenommen' }) })] }), me: { viewAs: true } })
await u.zeige(MEINE)
await fx.klick(fx.finde(fx.finde(u.wurzel, 'li[data-fn="shop"]'), 'button'))
const knopf = fx.finde(u.wurzel, 'section.kn-fn-einschalten [data-aktion="einschalten"]')
assert.equal(knopf.disabled, true)
assert.match(fx.text(u.wurzel), /In der Kundenansicht kann nichts eingeschaltet werden\./)
await fx.klick(knopf)
assert.equal(u.aufrufe.some(([m]) => m === 'POST'), false)
}))
+15
View File
@@ -121,3 +121,18 @@ test('Zähler: Verträge laden beim Betreten und bei kn:zaehler-neu (document) n
b.doc.dispatchEvent(new CustomEvent('kn:zaehler-neu', { detail: { was: 'vertraege' } })); await b.fx.ruhe(); assert.equal(n('/api/invoices'), i0 + 2)
await b.zeige('#chat', 'tab'); assert.equal(chatTab(), null)
})
test('Option einschalten in der Mitarbeiter-Kundenansicht: die Hülle reicht viewAs true durch, auch wenn das Modul es nicht nennt; sonst bleibt die Option unverändert', async () => {
const MODULE = { news: ['/funktionen.js', 'initNews'], termine: ['/termine.js', 'initTermine'], webshop: ['/shop.js', 'initShop'], buchungen: ['/buchungen.js', 'initBuchungen'], zeiten: ['/zeiten.js', 'initZeiten'] }
for (const [etage, [, init]] of Object.entries(MODULE)) {
const aufrufe = []
const lade = async (p) => (p === '/neu/funktion-einschalten.js' ? { zeigeEinschalten: (platz, o) => aufrufe.push(['zeige', o]) } : { [init]: (root, opt) => aufrufe.push(['init', opt]) })
await boot({ hash: `#${etage}`, karte: { ...KARTE_KUNDE, '/api/auth/me': ME_VIEW }, lade })
const einschalten = aufrufe.find((a) => a[0] === 'init')[1].einschalten
const platz = { id: 'platz' }
await einschalten(platz, { key: etage, projectId: 'p1' })
assert.deepEqual(aufrufe.at(-1), ['zeige', { key: etage, projectId: 'p1', viewAs: true }], `${etage}: viewAs fehlt im Aufruf`)
await einschalten(platz, { key: etage, projectId: 'p1', viewAs: false })
assert.equal(aufrufe.at(-1)[1].viewAs, true, `${etage}: ein viewAs false des Moduls darf die Sperre nicht aufheben`)
}
})