feat(opportunities): Papierkorb statt endgueltigem Loeschen
Das Loeschsymbol gab es in der Kachelansicht schon, es war aber bis zum
Ueberfahren durchsichtig - ein Knopf, den man nur findet, wenn man ihn kennt.
Jetzt ist er sichtbar, in der Liste ebenso, und die Pipeline-Karte hat ihn
ueberhaupt zum ersten Mal.
Geloescht wird nicht mehr endgueltig: DELETE setzt deleted_at, die Zeile bleibt.
An einer Opportunity haengen Ansprechpartner, Verlauf und Mailzuordnungen, und
ein Fehlklick soll das nicht kosten. Der Papierkorb ist ein Unterpunkt unter
Opportunities und zeigt, wann und von wem geloescht wurde und wie lange der
Eintrag noch liegt. Zurueckholen darf, wer auch loeschen darf; das Leeren jeder
Angemeldete - was dort liegt, hat schon jemand mit den noetigen Rechten
weggeworfen. Beides fragt vorher nach.
Nach 90 Tagen raeumt das Backend selbst auf, beim Abruf der Liste und hoechstens
einmal pro Stunde je Prozess - dasselbe Muster wie in der Akquise. Ein eigener
Zeitplan waere eine weitere Stelle, die ausfallen kann, und die Abfragen filtern
Faelliges ohnehin heraus.
Im Papierkorb liegende Opportunities sind aus allen Listen, Summen und
Zuordnungsdialogen heraus und lassen sich nicht bearbeiten (409) - erst
zurueckholen, dann aendern.
Nebenbei: der Header bekommt seinen Titel jetzt ueber viewTitle(). Der
Ansichtsname musste eindeutig sein ("Opportunity-Papierkorb", weil die Mails
schon einen Papierkorb haben), angezeigt wird beides als "Papierkorb".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
2717462c3a
commit
1ac0e2d2c7
@@ -2,6 +2,7 @@ export type ViewState =
|
||||
| 'Akquise'
|
||||
| 'Archiv'
|
||||
| 'Opportunities'
|
||||
| 'Opportunity-Papierkorb'
|
||||
| 'Interviews'
|
||||
| 'Kontakte'
|
||||
| 'Aus Mails'
|
||||
@@ -53,6 +54,24 @@ export const MAIL_VIEWS: ViewState[] = ['Mails', 'Papierkorb'];
|
||||
*/
|
||||
export const ACQUISITION_VIEWS: ViewState[] = ['Akquise', 'Archiv'];
|
||||
|
||||
/**
|
||||
* Opportunities mit ihrem Papierkorb. Der Wert heisst "Opportunity-Papierkorb",
|
||||
* weil die Mails schon einen "Papierkorb" haben und der Ansichtsname eindeutig
|
||||
* sein muss; angezeigt wird beides als "Papierkorb" (siehe VIEW_TITLES).
|
||||
*/
|
||||
export const OPPORTUNITY_VIEWS: ViewState[] = ['Opportunities', 'Opportunity-Papierkorb'];
|
||||
|
||||
/**
|
||||
* Abweichende Beschriftung einer Ansicht. Ohne Eintrag ist der Name der Ansicht
|
||||
* gleichzeitig ihr Titel - das gilt fuer alle bis auf die, deren Name nur
|
||||
* intern eindeutig sein muss.
|
||||
*/
|
||||
export const VIEW_TITLES: Partial<Record<ViewState, string>> = {
|
||||
'Opportunity-Papierkorb': 'Papierkorb',
|
||||
};
|
||||
|
||||
export const viewTitle = (view: ViewState): string => VIEW_TITLES[view] ?? view;
|
||||
|
||||
export type Role = 'admin' | 'user';
|
||||
|
||||
export interface AppUser {
|
||||
@@ -236,6 +255,9 @@ export interface Opportunity {
|
||||
notes: string | null;
|
||||
owner_id: number | null;
|
||||
created_by: number | null;
|
||||
/** Gesetzt = liegt im Papierkorb; nach 90 Tagen wird sie dort geloescht. */
|
||||
deleted_at: string | null;
|
||||
deleted_by: number | null;
|
||||
created_at?: string;
|
||||
updated_at?: string;
|
||||
/** Angereichert vom Backend */
|
||||
@@ -243,6 +265,7 @@ export interface Opportunity {
|
||||
owner_name?: string | null;
|
||||
owner_color?: string | null;
|
||||
owner_avatar?: string | null;
|
||||
deleted_by_name?: string | null;
|
||||
contacts: OpportunityContact[];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user