Registrierungscodes: genau ein aktiver Code pro Wohnung (v1.35)
Build & Deploy / deploy (push) Successful in 28s
Build & Deploy / deploy (push) Successful in 28s
- Backend: POST /api/codes erfordert Wohnung, erzeugt genau 1 Code, ersetzt vorher alle unbenutzten Codes der Wohnung - Frontend: Anzahl-Selektor entfernt, Button ohne Wohnwahl deaktiviert, Hinweistext angepasst
This commit is contained in:
@@ -233,7 +233,7 @@ export default function BenutzerVerwaltung() {
|
||||
const { benutzer, codes, units, setAktiv, setPasswort, weiseEinheitZu, setzeBenutzerEmail, generiereCodes, loescheBenutzer, me } = useStore()
|
||||
const [suche, setSuche] = useState('')
|
||||
const [gruppe, setGruppe] = useState<'alle' | BenutzerRolle>('alle')
|
||||
const [anzahl, setAnzahl] = useState(5)
|
||||
|
||||
const [codeEinheit, setCodeEinheit] = useState('')
|
||||
const [kopiert, setKopiert] = useState<string | null>(null)
|
||||
|
||||
@@ -309,24 +309,16 @@ export default function BenutzerVerwaltung() {
|
||||
<option key={u.id} value={u.id}>{u.building}, Whg. {u.number}</option>
|
||||
))}
|
||||
</select>
|
||||
<select
|
||||
value={anzahl}
|
||||
onChange={(e) => setAnzahl(Number(e.target.value))}
|
||||
className="rounded-md border border-input bg-background px-3 py-1.5 text-sm"
|
||||
aria-label="Anzahl Codes"
|
||||
>
|
||||
{[1, 5, 10, 20].map((n) => (
|
||||
<option key={n} value={n}>{n}</option>
|
||||
))}
|
||||
</select>
|
||||
<Button
|
||||
onClick={async () => {
|
||||
const neu = await generiereCodes(anzahl, codeEinheit || null)
|
||||
if (!codeEinheit) return
|
||||
const neu = await generiereCodes(codeEinheit)
|
||||
if (neu.length > 0) kopieren(neu[0].code)
|
||||
}}
|
||||
disabled={!codeEinheit}
|
||||
className="gap-2 bg-amber-500 text-slate-900 hover:bg-amber-400"
|
||||
>
|
||||
<RefreshCcw className="h-4 w-4" /> Codes erzeugen
|
||||
<RefreshCcw className="h-4 w-4" /> Code erzeugen
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -358,7 +350,8 @@ export default function BenutzerVerwaltung() {
|
||||
</div>
|
||||
)}
|
||||
<p className="mt-2 text-xs text-slate-400">
|
||||
Mieter registrieren sich auf der Startseite mit einem Code – der Code wird dabei verbraucht
|
||||
Pro Wohnung gibt es immer genau einen aktiven Code – ein neu erzeugter Code ersetzt den bisherigen.
|
||||
Mieter registrieren sich auf der Startseite mit dem Code; der Code wird dabei verbraucht
|
||||
und die Wohnung automatisch zugeordnet.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
+4
-3
@@ -136,7 +136,8 @@ interface Store extends Bootstrap {
|
||||
sendeBenutzerEmail: (id: string, betreff: string, text: string) => Promise<string | null>
|
||||
/** E-Mail-Adresse eines Benutzers pflegen (Verwaltung, v1.22) */
|
||||
setzeBenutzerEmail: (id: string, email: string) => Promise<string | null>
|
||||
generiereCodes: (anzahl: number, einheitId: string | null) => Promise<RegistrierungsCode[]>
|
||||
/** Erzeugt genau einen Registrierungscode pro Wohnung (v1.35) */
|
||||
generiereCodes: (einheitId: string) => Promise<RegistrierungsCode[]>
|
||||
// ── Zählerstände (Verwaltung pflegt, Mieter lesen) ──────
|
||||
addZaehler: (z: {
|
||||
nummer: string
|
||||
@@ -453,8 +454,8 @@ export function StoreProvider({ children }: { children: ReactNode }) {
|
||||
return fehlerNachricht(e)
|
||||
}
|
||||
},
|
||||
async generiereCodes(anzahl, einheitId) {
|
||||
const { codes } = await apiPost<{ codes: RegistrierungsCode[] }>('/api/codes', { anzahl, einheitId })
|
||||
async generiereCodes(einheitId) {
|
||||
const { codes } = await apiPost<{ codes: RegistrierungsCode[] }>('/api/codes', { einheitId })
|
||||
await ladeAlles()
|
||||
return codes
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user