Der eigene CC steht in der eigenen Kette

Ein CC landete unter "Frueher genutzt", obwohl er dem Spieler gehoert - seine
Mitgliedschaft daran war beendet, und danach allein richtete sich die
Einordnung. Damit stand sein eigener CC in einem Abschnitt, der ausdruecklich
fuer fremde gedacht ist, und liess sich aus der Ferne kaum in eine Kette
ziehen.

Jetzt entscheidet bei einem eigenen CC der Besitz: Wem er gehoert, dem gehoert
er, auch wenn die Mitgliedschaft beendet wurde. Es bleibt seine Geschichte.
Bei fremden CCs entscheidet weiterhin die Mitgliedschaft.

Zwei Dinge fielen dabei auf:

- Beim Ziehen scrollt der Browser nicht von selbst. Wer einen Eintrag von
  ganz unten in eine Kette weiter oben bringen wollte, sah das Ziel gar
  nicht. Jetzt scrollt die Seite, solange am Rand gezogen wird.
- Der Besitzer konnte sich an seinem eigenen CC nicht ohne neue Buchung
  wieder eintragen, obwohl seine Buchung seit dem Anlegen daran haengt. Fuer
  ihn ist die Guthaben-Angabe jetzt freigestellt; von einem Fremden wird sie
  weiterhin verlangt.
This commit is contained in:
2026-09-21 19:53:29 +02:00
parent f0213fe4bc
commit e57bfbabc7
4 changed files with 91 additions and 3 deletions
+46 -2
View File
@@ -1,4 +1,4 @@
import { useState } from 'react';
import { useEffect, useState } from 'react';
import MemberList from './MemberList';
import Notice from './Notice';
import { ApiError, api } from '../lib/api';
@@ -50,8 +50,20 @@ function eigeneMitgliedschaft(character: Character, playerId: number) {
return (character.members ?? []).find((m) => m.playerId === playerId);
}
/// Ein Platz, den der Spieler gerade belegt oder auf den er zurückkehren kann.
/**
* Ein Eintrag, der zu seinen Ketten gehört.
*
* Wem der CC gehört, dem gehört er - auch wenn seine Mitgliedschaft daran
* beendet wurde, etwa weil er sich aus einer Gruppe herausredesignt hat, die
* an seinem eigenen CC hing. Es bleibt seine Geschichte und sein Platz.
*
* Bei fremden CCs entscheidet die Mitgliedschaft: wer noch drin ist oder
* zurückkehren kann, hat dort einen Platz. Wer endgültig raus ist, findet
* den CC unter "Früher genutzt".
*/
function istSeinPlatz(character: Character, playerId: number): boolean {
if (character.playerId === playerId) return true;
const eigene = eigeneMitgliedschaft(character, playerId);
if (!eigene) return false;
return eigene.leftAt === null || eigene.inactiveReason !== null;
@@ -121,6 +133,38 @@ export default function ChainView({
}) {
const [ziehe, setZiehe] = useState<Character | null>(null);
const [ueber, setUeber] = useState<string | null>(null);
/**
* Während des Ziehens am Rand scrollen.
*
* Ein Browser scrollt beim Ziehen nicht von selbst. Wer einen Eintrag von
* ganz unten in eine Kette weiter oben bringen will, käme sonst nicht hin -
* er sieht das Ziel gar nicht.
*/
useEffect(() => {
if (!ziehe) return;
const RAND = 120;
const SCHRITT = 18;
let richtung = 0;
let timer: number | null = null;
const beiBewegung = (event: DragEvent) => {
if (event.clientY < RAND) richtung = -1;
else if (event.clientY > window.innerHeight - RAND) richtung = 1;
else richtung = 0;
};
timer = window.setInterval(() => {
if (richtung !== 0) window.scrollBy(0, richtung * SCHRITT);
}, 16);
document.addEventListener('dragover', beiBewegung);
return () => {
document.removeEventListener('dragover', beiBewegung);
if (timer !== null) window.clearInterval(timer);
};
}, [ziehe]);
// Eine Meldung zum Ziehen gehört neben die Ketten, nicht an den Seitenkopf:
// wer unten zieht, sieht dort oben nichts.
const [meldung, setMeldung] = useState<string | null>(null);