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
@@ -1,5 +1,12 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { ACQUISITION_VIEWS, CONTACT_VIEWS, MAIL_VIEWS, SCANNER_VIEWS, type ViewState } from '../types';
|
||||
import {
|
||||
ACQUISITION_VIEWS,
|
||||
CONTACT_VIEWS,
|
||||
MAIL_VIEWS,
|
||||
OPPORTUNITY_VIEWS,
|
||||
SCANNER_VIEWS,
|
||||
type ViewState,
|
||||
} from '../types';
|
||||
import { UserAvatar } from './ui/UserAvatar';
|
||||
import { useAuth } from '../lib/auth';
|
||||
|
||||
@@ -73,6 +80,23 @@ const ACQUISITION_GROUP: MenuGroup = {
|
||||
const TRASH_ICON =
|
||||
'M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16';
|
||||
|
||||
const OPPORTUNITY_ICON =
|
||||
'M9 17V7m4 10V11m4 6v-3m4 7H5a2 2 0 01-2-2V5a2 2 0 012-2h14a2 2 0 012 2v14a2 2 0 01-2 2z';
|
||||
|
||||
/**
|
||||
* Opportunities mit ihrem Papierkorb. Geloeschte Opportunities liegen dort 90
|
||||
* Tage, damit ein Fehlklick nicht Verlauf, Ansprechpartner und Mailbezuege
|
||||
* kostet.
|
||||
*/
|
||||
const OPPORTUNITIES_GROUP: MenuGroup = {
|
||||
item: { name: 'Opportunities', icon: OPPORTUNITY_ICON },
|
||||
views: OPPORTUNITY_VIEWS,
|
||||
children: [
|
||||
{ name: 'Opportunities', label: 'Alle', icon: OPPORTUNITY_ICON },
|
||||
{ name: 'Opportunity-Papierkorb', label: 'Papierkorb', icon: TRASH_ICON },
|
||||
],
|
||||
};
|
||||
|
||||
/**
|
||||
* Mails. Darunter klappt der Papierkorb auf: Mails, die im CRM geloescht wurden.
|
||||
* Im Postfach bleiben sie stehen - der Abgleich holt sie aber nicht wieder.
|
||||
@@ -119,10 +143,7 @@ const SCANNER_GROUP: MenuGroup = {
|
||||
// Einstellungen bleibt separat am unteren Rand.
|
||||
const CATEGORY_ENTRIES: (MenuItem | MenuGroup)[] = [
|
||||
ACQUISITION_GROUP,
|
||||
{
|
||||
name: 'Opportunities',
|
||||
icon: 'M9 17V7m4 10V11m4 6v-3m4 7H5a2 2 0 01-2-2V5a2 2 0 012-2h14a2 2 0 012 2v14a2 2 0 01-2 2z',
|
||||
},
|
||||
OPPORTUNITIES_GROUP,
|
||||
{
|
||||
// Der Terminkalender heisst im CRM "Interviews": genutzt wird er fuer
|
||||
// Gespraechstermine, nicht als allgemeiner Kalender.
|
||||
|
||||
Reference in New Issue
Block a user