diff --git a/docs/settings-partial-save.md b/docs/settings-partial-save.md new file mode 100644 index 0000000..6e745a5 --- /dev/null +++ b/docs/settings-partial-save.md @@ -0,0 +1,60 @@ +# Settings Partial Save Feature + +## Overview + +The settings system now implements partial save functionality to prevent unintended overwrites of configuration values. + +## How It Works + +1. **Field Whitelist**: Only fields exposed in the UI can be modified +2. **Deep Merge**: Updates are merged with existing config, preserving unmodified fields +3. **Backup & Rollback**: Config is backed up before save; failures trigger automatic rollback + +## Editable Fields + +Currently editable via UI: +- `erp.url` - ERP system URL +- `erp.username` - ERP login username +- `erp.password` - ERP login password + +## Adding New Editable Fields + +To add a new field to the UI: + +1. Add field to whitelist in `src/main/services/config/config-manager.ts`: + +```typescript +const UI_EDITABLE_FIELDS: string[] = [ + 'erp.url', + 'erp.username', + 'erp.password', + 'database.dbType', // Add new field here +] +``` + +2. Add UI input in `src/renderer/src/pages/SettingsPage.tsx` +3. Update `handleSaveSettings` to include the new field + +## API + +### savePartialSettings(settings: Partial) + +Saves only the provided fields, preserving all existing configuration. + +**Returns:** `{ success: boolean, error?: string }` + +**Validation:** +- Checks whitelist before applying changes +- Returns error for unauthorized fields + +## Error Handling + +- **Unauthorized field**: Returns error message listing invalid fields +- **Save failure**: Automatically restores from backup +- **Backup failure**: Logs warning, continues with save + +## Backup File + +Location: `.env.backup` (in project root) + +Created before every save operation. Used for rollback on failure.