INSIGHT-MVP/packages/frontend/src/admin/AdminCrmSettingsPage.module.css
Thomas Reitz de4af77c5c feat: CRM Berechtigungsmodell — konfigurierbares Sichtbarkeitsmodell (OWN/TEAM/ALL)
Implementiert pro-Entity Sichtbarkeitssteuerung für Companies, Contacts, Deals
und Activities mit Rollen-basierter Zugriffskontrolle (ADMIN sieht alles,
TEAM_LEAD mindestens Team-Sicht, READONLY nur Lesezugriff).

- JWT Payload um tenantRole + department erweitert (Core + CRM)
- Team-Members-Endpoint im Core Service (GET /users/team-members)
- VisibilityModule mit Redis-Cache (CRM Service)
- ReadonlyGuard als globaler Guard (CRM Service)
- buildVisibilityFilter Utility für Prisma WHERE-Filterung
- Admin-Einstellungsseite /admin/crm-settings (Frontend)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 22:20:53 +01:00

180 lines
2.3 KiB
CSS

.container {
max-width: 800px;
}
.header {
margin-bottom: 24px;
}
.header h2 {
font-size: 1.25rem;
font-weight: 600;
color: #111827;
margin: 0 0 8px 0;
}
.subtitle {
font-size: 0.875rem;
color: #6b7280;
margin: 0;
line-height: 1.5;
}
.card {
background: #fff;
border: 1px solid #e5e7eb;
border-radius: 8px;
overflow: hidden;
}
.table {
width: 100%;
border-collapse: collapse;
}
.table thead {
background: #f9fafb;
}
.table th {
padding: 12px 16px;
text-align: left;
font-size: 0.8125rem;
font-weight: 600;
color: #374151;
border-bottom: 1px solid #e5e7eb;
}
.table td {
padding: 16px;
border-bottom: 1px solid #f3f4f6;
}
.table tr:last-child td {
border-bottom: none;
}
.entityCol {
width: 180px;
}
.levelCol {
width: auto;
}
.levelHeader {
display: flex;
flex-direction: column;
gap: 2px;
}
.levelDesc {
font-weight: 400;
font-size: 0.6875rem;
color: #9ca3af;
line-height: 1.3;
}
.entityLabel {
font-weight: 500;
color: #111827;
font-size: 0.875rem;
}
.radioCell {
text-align: center;
}
.radioLabel {
display: inline-flex;
align-items: center;
gap: 6px;
cursor: pointer;
}
.radio {
width: 16px;
height: 16px;
accent-color: #1a56db;
cursor: pointer;
}
.radioText {
font-size: 0.8125rem;
color: #374151;
}
.info {
display: flex;
gap: 12px;
margin-top: 20px;
padding: 16px;
background: #eff6ff;
border: 1px solid #bfdbfe;
border-radius: 8px;
font-size: 0.8125rem;
color: #1e40af;
line-height: 1.5;
}
.info svg {
flex-shrink: 0;
margin-top: 2px;
color: #3b82f6;
}
.infoList {
margin: 6px 0 0 0;
padding-left: 18px;
}
.infoList li {
margin-bottom: 2px;
}
.actions {
display: flex;
align-items: center;
gap: 12px;
margin-top: 24px;
}
.saveButton {
padding: 10px 24px;
background: #1a56db;
color: #fff;
border: none;
border-radius: 6px;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: background 0.15s;
}
.saveButton:hover:not(:disabled) {
background: #1e429f;
}
.saveButton:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.successMsg {
font-size: 0.8125rem;
color: #059669;
font-weight: 500;
}
.errorMsg {
font-size: 0.8125rem;
color: #dc2626;
font-weight: 500;
}
.loading {
padding: 40px;
text-align: center;
color: #6b7280;
font-size: 0.875rem;
}