feat: AI Control Settings mit Category Control und Company Labels
MAJOR FEATURES: - AI Control Tab in Settings hinzugefügt mit vollständiger KI-Steuerung - Category Control: Benutzer können Kategorien aktivieren/deaktivieren und Aktionen pro Kategorie festlegen (Keep in Inbox, Archive & Mark Read, Star) - Company Labels: Automatische Erkennung bekannter Firmen (Amazon, Google, Microsoft, etc.) und optionale benutzerdefinierte Company Labels - Auto-Detect Companies Toggle: Automatische Label-Erstellung für bekannte Firmen UI/UX VERBESSERUNGEN: - Sorting Rules Tab entfernt (war zu verwirrend) - Save Buttons nach oben rechts verschoben (Category Control und Company Labels) - Company Labels Section: Custom Labels sind jetzt in einem ausklappbaren Details-Element (Optional) - Verbesserte Beschreibungen und Klarheit in der UI BACKEND ÄNDERUNGEN: - Neue API Endpoints: /api/preferences/ai-control (GET/POST) und /api/preferences/company-labels (GET/POST/DELETE) - AI Sorter Service erweitert: detectCompany(), matchesCompanyLabel(), getCategoryAction(), getEnabledCategories() - Database Service: Default-Werte und Merge-Logik für erweiterte User Preferences - Email Routes: Integration der neuen AI Control Einstellungen in Gmail und Outlook Sortierung - Label-Erstellung: Nur für enabledCategories, Custom Company Labels mit orange Farbe (#ff9800) FRONTEND ÄNDERUNGEN: - Neue TypeScript Types: client/src/types/settings.ts (AIControlSettings, CompanyLabel, CategoryInfo, KnownCompany) - Settings.tsx: Komplett überarbeitet mit AI Control Tab, Category Toggles, Company Labels Management - API Client erweitert: getAIControlSettings(), saveAIControlSettings(), getCompanyLabels(), saveCompanyLabel(), deleteCompanyLabel() - Debug-Logs hinzugefügt für Troubleshooting (main.tsx, App.tsx, Settings.tsx) BUGFIXES: - JSX Syntax-Fehler behoben: Fehlende schließende </div> Tags in Company Labels Section - TypeScript Typ-Fehler behoben: saved.data null-check für Company Labels - Struktur-Fehler behoben: Conditional Blocks korrekt verschachtelt TECHNISCHE DETAILS: - 9 Kategorien verfügbar: VIP, Clients, Invoices, Newsletter, Promotions, Social, Security, Calendar, Review - Company Labels unterstützen Bedingungen wie 'from:amazon.com OR from:amazon.de' - Priorisierung: 1) Custom Company Labels, 2) Auto-Detected Companies, 3) AI Categorization - Deaktivierte Kategorien werden automatisch als 'review' kategorisiert
This commit is contained in:
@@ -286,14 +286,44 @@ export const subscriptions = {
|
||||
* User preferences operations
|
||||
*/
|
||||
export const userPreferences = {
|
||||
/**
|
||||
* Get default preferences structure
|
||||
*/
|
||||
getDefaults() {
|
||||
return {
|
||||
vipSenders: [],
|
||||
enabledCategories: ['vip', 'customers', 'invoices', 'newsletters', 'promotions', 'social', 'security', 'calendar', 'review'],
|
||||
categoryActions: {},
|
||||
companyLabels: [],
|
||||
autoDetectCompanies: true,
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Merge preferences with defaults
|
||||
*/
|
||||
mergeWithDefaults(preferences) {
|
||||
const defaults = this.getDefaults()
|
||||
return {
|
||||
...defaults,
|
||||
...preferences,
|
||||
vipSenders: preferences.vipSenders || defaults.vipSenders,
|
||||
enabledCategories: preferences.enabledCategories || defaults.enabledCategories,
|
||||
categoryActions: preferences.categoryActions || defaults.categoryActions,
|
||||
companyLabels: preferences.companyLabels || defaults.companyLabels,
|
||||
autoDetectCompanies: preferences.autoDetectCompanies !== undefined ? preferences.autoDetectCompanies : defaults.autoDetectCompanies,
|
||||
}
|
||||
},
|
||||
|
||||
async getByUser(userId) {
|
||||
const pref = await db.findOne(Collections.USER_PREFERENCES, [
|
||||
Query.equal('userId', userId),
|
||||
])
|
||||
if (pref?.preferencesJson) {
|
||||
return { ...pref, preferences: JSON.parse(pref.preferencesJson) }
|
||||
const parsed = JSON.parse(pref.preferencesJson)
|
||||
return { ...pref, preferences: this.mergeWithDefaults(parsed) }
|
||||
}
|
||||
return pref
|
||||
return { ...pref, preferences: this.getDefaults() }
|
||||
},
|
||||
|
||||
async upsert(userId, preferences) {
|
||||
@@ -301,7 +331,14 @@ export const userPreferences = {
|
||||
Query.equal('userId', userId),
|
||||
])
|
||||
|
||||
const data = { preferencesJson: JSON.stringify(preferences) }
|
||||
// Merge with existing preferences if updating
|
||||
let mergedPreferences = preferences
|
||||
if (existing?.preferencesJson) {
|
||||
const existingPrefs = JSON.parse(existing.preferencesJson)
|
||||
mergedPreferences = { ...existingPrefs, ...preferences }
|
||||
}
|
||||
|
||||
const data = { preferencesJson: JSON.stringify(mergedPreferences) }
|
||||
|
||||
if (existing) {
|
||||
return db.update(Collections.USER_PREFERENCES, existing.$id, data)
|
||||
|
||||
Reference in New Issue
Block a user