@mdguggenbichler/slugbase-core 0.0.22 → 0.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/routes/admin/settings.ts"],"names":[],"mappings":"AAQA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAgOxB,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/routes/admin/settings.ts"],"names":[],"mappings":"AAQA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAiPxB,eAAe,MAAM,CAAC"}
@@ -52,6 +52,23 @@ router.get('/ai', async (req, res) => {
52
52
  res.status(500).json({ error: error.message });
53
53
  }
54
54
  });
55
+ /** GET /admin/settings/smtp — SMTP keys only (for Settings page; no ai_* or other keys). */
56
+ router.get('/smtp', async (req, res) => {
57
+ try {
58
+ const tenantId = getTenantId(req);
59
+ const smtpKeys = ['smtp_enabled', 'smtp_host', 'smtp_port', 'smtp_secure', 'smtp_user', 'smtp_password', 'smtp_from', 'smtp_from_name'];
60
+ const settingsObj = {};
61
+ for (const key of smtpKeys) {
62
+ const row = await queryOne('SELECT value FROM system_config WHERE key = ? AND tenant_id = ?', [key, tenantId]);
63
+ const val = row ? row.value : '';
64
+ settingsObj[key] = key === 'smtp_password' && val ? '***SET***' : (val || '');
65
+ }
66
+ res.json(settingsObj);
67
+ }
68
+ catch (error) {
69
+ res.status(500).json({ error: error.message });
70
+ }
71
+ });
55
72
  router.get('/ai/models', async (req, res) => {
56
73
  try {
57
74
  const tenantId = getTenantId(req);
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/routes/admin/settings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/routes/admin/settings.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,17 @@
1
- import React, { useState, useEffect } from 'react';
1
+ import { useState, useEffect } from 'react';
2
2
  import { useTranslation } from 'react-i18next';
3
3
  import { useAuth } from '../../contexts/AuthContext';
4
4
  import api from '../../api/client';
5
5
  import { useToast } from '../ui/Toast';
6
- import { Save, Plus, Trash2, Settings as SettingsIcon, Mail, Send } from 'lucide-react';
6
+ import { Save, Mail, Send } from 'lucide-react';
7
7
  import Button from '../ui/Button';
8
- import ConfirmDialog from '../ui/ConfirmDialog';
9
- import { useConfirmDialog } from '../../hooks/useConfirmDialog';
10
8
  import { PageLoadingSkeleton } from '../ui/PageLoadingSkeleton';
11
9
 
12
10
  export default function AdminSettings() {
13
11
  const { t } = useTranslation();
14
12
  const { user } = useAuth();
15
- const { showConfirm, dialogState } = useConfirmDialog();
16
13
  const { showToast } = useToast();
17
- const [settings, setSettings] = useState<Record<string, string>>({});
18
14
  const [loading, setLoading] = useState(true);
19
- const [newKey, setNewKey] = useState('');
20
- const [newValue, setNewValue] = useState('');
21
-
22
- // SMTP settings state
23
15
  const [smtpSettings, setSmtpSettings] = useState({
24
16
  enabled: false,
25
17
  host: '',
@@ -34,94 +26,45 @@ export default function AdminSettings() {
34
26
  const [testingEmail, setTestingEmail] = useState(false);
35
27
 
36
28
  useEffect(() => {
37
- loadSettings();
29
+ loadSmtpSettings();
38
30
  }, []);
39
31
 
40
- const loadSettings = async () => {
32
+ const loadSmtpSettings = async () => {
41
33
  try {
42
- const response = await api.get('/admin/settings');
43
- const allSettings = response.data;
44
- setSettings(allSettings);
45
-
46
- // Load SMTP settings
47
- // Check if password is set (backend returns '***SET***' if password exists)
48
- const hasPassword = allSettings.smtp_password === '***SET***';
34
+ const response = await api.get<Record<string, string>>('/admin/settings/smtp');
35
+ const data = response.data;
36
+ const hasPassword = data.smtp_password === '***SET***';
49
37
  setPasswordIsSet(hasPassword);
50
-
51
38
  setSmtpSettings({
52
- enabled: allSettings.smtp_enabled === 'true',
53
- host: allSettings.smtp_host || '',
54
- port: parseInt(allSettings.smtp_port || '587'),
55
- secure: allSettings.smtp_secure === 'true',
56
- user: allSettings.smtp_user || '',
57
- password: hasPassword ? '••••••••••••••••' : '', // Show masked password if set, empty if not
58
- from: allSettings.smtp_from || '',
59
- fromName: allSettings.smtp_from_name || 'SlugBase',
39
+ enabled: data.smtp_enabled === 'true',
40
+ host: data.smtp_host || '',
41
+ port: parseInt(data.smtp_port || '587'),
42
+ secure: data.smtp_secure === 'true',
43
+ user: data.smtp_user || '',
44
+ password: hasPassword ? '••••••••••••••••' : '',
45
+ from: data.smtp_from || '',
46
+ fromName: data.smtp_from_name || 'SlugBase',
60
47
  });
61
48
  } catch (error) {
62
- console.error('Failed to load settings:', error);
49
+ console.error('Failed to load SMTP settings:', error);
50
+ showToast(t('common.error'), 'error');
63
51
  } finally {
64
52
  setLoading(false);
65
53
  }
66
54
  };
67
55
 
68
- const handleSave = async (key: string, value: string) => {
69
- try {
70
- await api.post('/admin/settings', { key, value });
71
- setSettings({ ...settings, [key]: value });
72
- showToast(t('common.success'), 'success');
73
- } catch (error: any) {
74
- showToast(error.response?.data?.error || t('common.error'), 'error');
75
- }
76
- };
77
-
78
- const handleAdd = async (e: React.FormEvent) => {
79
- e.preventDefault();
80
- if (!newKey) return;
81
- try {
82
- await api.post('/admin/settings', { key: newKey, value: newValue });
83
- setSettings({ ...settings, [newKey]: newValue });
84
- setNewKey('');
85
- setNewValue('');
86
- showToast(t('common.success'), 'success');
87
- } catch (error: any) {
88
- showToast(error.response?.data?.error || t('common.error'), 'error');
89
- }
90
- };
91
-
92
- const handleDelete = (key: string) => {
93
- showConfirm(
94
- t('admin.confirmDeleteSetting'),
95
- t('admin.confirmDeleteSetting'),
96
- async () => {
97
- try {
98
- await api.delete(`/admin/settings/${key}`);
99
- const newSettings = { ...settings };
100
- delete newSettings[key];
101
- setSettings(newSettings);
102
- showToast(t('common.success'), 'success');
103
- } catch (error: any) {
104
- showToast(error.response?.data?.error || t('common.error'), 'error');
105
- }
106
- },
107
- { variant: 'danger', confirmText: t('common.delete'), cancelText: t('common.cancel') }
108
- );
109
- };
110
-
111
56
  const handleSMTPSave = async () => {
112
57
  try {
113
- // If password field contains the masked string, don't send it (keep existing password)
114
- const settingsToSave: any = { ...smtpSettings };
58
+ const settingsToSave: Record<string, unknown> = { ...smtpSettings };
115
59
  if (settingsToSave.password === '••••••••••••••••') {
116
- // Password is masked, don't send it to keep existing password
117
60
  delete settingsToSave.password;
118
61
  }
119
-
120
62
  await api.post('/admin/settings/smtp', settingsToSave);
121
63
  showToast(t('common.success'), 'success');
122
- await loadSettings();
123
- } catch (error: any) {
124
- showToast(error.response?.data?.error || t('common.error'), 'error');
64
+ await loadSmtpSettings();
65
+ } catch (error: unknown) {
66
+ const e = error as { response?: { data?: { error?: string } } };
67
+ showToast(e?.response?.data?.error || t('common.error'), 'error');
125
68
  }
126
69
  };
127
70
 
@@ -134,8 +77,9 @@ export default function AdminSettings() {
134
77
  try {
135
78
  await api.post('/admin/settings/smtp/test', { email: user.email });
136
79
  showToast(t('smtp.testSent'), 'success');
137
- } catch (error: any) {
138
- showToast(error.response?.data?.error || t('smtp.testFailed'), 'error');
80
+ } catch (error: unknown) {
81
+ const e = error as { response?: { data?: { error?: string } } };
82
+ showToast(e?.response?.data?.error || t('smtp.testFailed'), 'error');
139
83
  } finally {
140
84
  setTestingEmail(false);
141
85
  }
@@ -145,14 +89,8 @@ export default function AdminSettings() {
145
89
  return <PageLoadingSkeleton lines={8} />;
146
90
  }
147
91
 
148
- // Filter out SMTP settings from general settings display
149
- const generalSettings = Object.fromEntries(
150
- Object.entries(settings).filter(([key]) => !key.startsWith('smtp_'))
151
- );
152
-
153
92
  return (
154
93
  <div className="space-y-6">
155
- {/* SMTP Settings Section */}
156
94
  <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm p-4">
157
95
  <div className="flex items-center gap-2 mb-6">
158
96
  <Mail className="h-5 w-5 text-gray-400 dark:text-gray-500" />
@@ -181,233 +119,139 @@ export default function AdminSettings() {
181
119
  </div>
182
120
 
183
121
  <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
184
- <div>
185
- <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
186
- {t('smtp.host')}
187
- </label>
188
- <input
189
- type="text"
190
- className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
191
- placeholder={t('smtp.hostPlaceholder')}
192
- value={smtpSettings.host}
193
- onChange={(e) => setSmtpSettings({ ...smtpSettings, host: e.target.value })}
194
- />
195
- </div>
196
- <div>
197
- <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
198
- {t('smtp.port')}
199
- </label>
200
- <input
201
- type="number"
202
- className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
203
- placeholder={t('smtp.portPlaceholder')}
204
- value={smtpSettings.port}
205
- onChange={(e) => setSmtpSettings({ ...smtpSettings, port: parseInt(e.target.value) || 587 })}
206
- />
207
- </div>
208
- <div>
209
- <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
210
- {t('smtp.user')}
211
- </label>
212
- <input
213
- type="text"
214
- className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
215
- placeholder={t('smtp.userPlaceholder')}
216
- value={smtpSettings.user}
217
- onChange={(e) => setSmtpSettings({ ...smtpSettings, user: e.target.value })}
218
- />
219
- </div>
220
- <div>
221
- <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
222
- {t('smtp.password')}
223
- </label>
224
- <input
225
- type="password"
226
- className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
227
- placeholder={passwordIsSet ? t('smtp.passwordPlaceholder') : t('smtp.passwordPlaceholder')}
228
- value={smtpSettings.password}
229
- onChange={(e) => {
230
- // If user starts typing, clear the masked password
231
- const newValue = e.target.value;
232
- if (passwordIsSet && smtpSettings.password === '••••••••••••••••' && newValue.length > 0) {
233
- // User is typing, clear the masked value
234
- setSmtpSettings({ ...smtpSettings, password: newValue });
235
- setPasswordIsSet(false);
236
- } else {
237
- setSmtpSettings({ ...smtpSettings, password: newValue });
238
- if (newValue.length > 0) {
239
- setPasswordIsSet(true);
240
- }
241
- }
242
- }}
243
- onFocus={() => {
244
- // Clear masked password when field is focused
245
- if (smtpSettings.password === '••••••••••••••••') {
246
- setSmtpSettings({ ...smtpSettings, password: '' });
247
- setPasswordIsSet(false);
248
- }
249
- }}
250
- />
251
- <p className="mt-1 text-xs text-gray-500 dark:text-gray-400">
252
- {passwordIsSet ? t('smtp.passwordChangeHint') : t('admin.leaveBlank')}
253
- </p>
254
- </div>
255
- <div>
256
- <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
257
- {t('smtp.from')}
258
- </label>
259
- <input
260
- type="email"
261
- className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
262
- placeholder={t('smtp.fromPlaceholder')}
263
- value={smtpSettings.from}
264
- onChange={(e) => setSmtpSettings({ ...smtpSettings, from: e.target.value })}
265
- />
266
- </div>
267
- <div>
268
- <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
269
- {t('smtp.fromName')}
270
- </label>
271
- <input
272
- type="text"
273
- className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
274
- placeholder={t('smtp.fromNamePlaceholder')}
275
- value={smtpSettings.fromName}
276
- onChange={(e) => setSmtpSettings({ ...smtpSettings, fromName: e.target.value })}
277
- />
278
- </div>
279
- </div>
280
-
281
- <div className="flex items-center gap-3 pt-2">
282
- <input
283
- type="checkbox"
284
- id="smtp-secure"
285
- checked={smtpSettings.secure}
286
- onChange={(e) => setSmtpSettings({ ...smtpSettings, secure: e.target.checked })}
287
- className="w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed"
288
- />
289
- <label htmlFor="smtp-secure" className="text-sm font-medium text-gray-900 dark:text-white">
290
- {t('smtp.secure')}
291
- </label>
292
- </div>
293
-
294
- <div className="flex items-center gap-4 pt-4 border-t border-gray-200 dark:border-gray-700">
295
- <div className="flex-1">
296
- <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
297
- {t('smtp.testEmail')}
298
- </label>
299
- <div className="px-4 py-2.5 text-sm text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-700/50 border border-gray-300 dark:border-gray-600 rounded-lg">
300
- {user?.email || t('common.loading')}
301
- </div>
302
- </div>
303
- <div className="pt-6">
304
- <Button
305
- variant="ghost"
306
- icon={Send}
307
- onClick={handleTestEmail}
308
- disabled={testingEmail || !user?.email}
309
- >
310
- {t('smtp.sendTest')}
311
- </Button>
312
- </div>
313
- </div>
314
-
315
- <div className="pt-4">
316
- <Button variant="primary" icon={Save} onClick={handleSMTPSave} >
317
- {t('smtp.save')}
318
- </Button>
319
- </div>
320
- </div>
321
- </div>
322
-
323
- {/* General Settings Section */}
324
- <div>
325
- <h2 className="text-lg font-semibold text-gray-900 dark:text-white">{t('admin.settings')}</h2>
326
- <p className="mt-1 text-sm text-gray-500 dark:text-gray-400">
327
- {Object.keys(generalSettings).length} {Object.keys(generalSettings).length === 1 ? t('common.setting') : t('common.settings')}
328
- </p>
329
- </div>
330
-
331
- {/* Existing Settings */}
332
- {Object.keys(generalSettings).length > 0 && (
333
- <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm overflow-hidden">
334
- <div className="divide-y divide-gray-200 dark:divide-gray-700">
335
- {Object.entries(generalSettings).map(([key, value]) => (
336
- <div key={key} className="px-6 py-4 hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors">
337
- <div className="flex items-center justify-between gap-4">
338
- <div className="flex-1 min-w-0">
339
- <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
340
- {key}
341
- </label>
342
- <input
343
- type="text"
344
- className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors"
345
- value={value}
346
- onChange={(e) => setSettings({ ...settings, [key]: e.target.value })}
347
- />
348
- </div>
349
- <div className="flex items-center gap-2">
350
- <Button
351
- variant="ghost"
352
- size="sm"
353
- icon={Save}
354
- onClick={() => handleSave(key, settings[key])}
355
- />
356
- <Button
357
- variant="danger"
358
- size="sm"
359
- icon={Trash2}
360
- onClick={() => handleDelete(key)}
361
- />
362
- </div>
363
- </div>
364
- </div>
365
- ))}
366
- </div>
367
- </div>
368
- )}
369
-
370
- {/* Add New Setting */}
371
- <div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm p-4">
372
- <div className="flex items-center gap-2 mb-4">
373
- <SettingsIcon className="h-5 w-5 text-gray-400 dark:text-gray-500" />
374
- <h3 className="text-lg font-semibold text-gray-900 dark:text-white">
375
- {t('admin.addSetting')}
376
- </h3>
377
- </div>
378
- <form onSubmit={handleAdd} className="space-y-4">
379
- <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
380
122
  <div>
381
123
  <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
382
- {t('admin.settingKey')}
124
+ {t('smtp.host')}
125
+ </label>
126
+ <input
127
+ type="text"
128
+ className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
129
+ placeholder={t('smtp.hostPlaceholder')}
130
+ value={smtpSettings.host}
131
+ onChange={(e) => setSmtpSettings({ ...smtpSettings, host: e.target.value })}
132
+ />
133
+ </div>
134
+ <div>
135
+ <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
136
+ {t('smtp.port')}
137
+ </label>
138
+ <input
139
+ type="number"
140
+ className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
141
+ placeholder={t('smtp.portPlaceholder')}
142
+ value={smtpSettings.port}
143
+ onChange={(e) => setSmtpSettings({ ...smtpSettings, port: parseInt(e.target.value) || 587 })}
144
+ />
145
+ </div>
146
+ <div>
147
+ <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
148
+ {t('smtp.user')}
383
149
  </label>
384
150
  <input
385
151
  type="text"
386
- required
387
- className="w-full px-4 py-2.5 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors"
388
- value={newKey}
389
- onChange={(e) => setNewKey(e.target.value)}
152
+ className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
153
+ placeholder={t('smtp.userPlaceholder')}
154
+ value={smtpSettings.user}
155
+ onChange={(e) => setSmtpSettings({ ...smtpSettings, user: e.target.value })}
156
+ />
157
+ </div>
158
+ <div>
159
+ <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
160
+ {t('smtp.password')}
161
+ </label>
162
+ <input
163
+ type="password"
164
+ className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
165
+ placeholder={passwordIsSet ? t('smtp.passwordPlaceholder') : t('smtp.passwordPlaceholder')}
166
+ value={smtpSettings.password}
167
+ onChange={(e) => {
168
+ const newValue = e.target.value;
169
+ if (passwordIsSet && smtpSettings.password === '••••••••••••••••' && newValue.length > 0) {
170
+ setSmtpSettings({ ...smtpSettings, password: newValue });
171
+ setPasswordIsSet(false);
172
+ } else {
173
+ setSmtpSettings({ ...smtpSettings, password: newValue });
174
+ setPasswordIsSet(newValue.length > 0);
175
+ }
176
+ }}
177
+ onFocus={() => {
178
+ if (smtpSettings.password === '••••••••••••••••') {
179
+ setSmtpSettings({ ...smtpSettings, password: '' });
180
+ setPasswordIsSet(false);
181
+ }
182
+ }}
390
183
  />
184
+ <p className="mt-1 text-xs text-gray-500 dark:text-gray-400">
185
+ {passwordIsSet ? t('smtp.passwordChangeHint') : t('admin.leaveBlank')}
186
+ </p>
391
187
  </div>
392
188
  <div>
393
189
  <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
394
- {t('admin.settingValue')}
190
+ {t('smtp.from')}
191
+ </label>
192
+ <input
193
+ type="email"
194
+ className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
195
+ placeholder={t('smtp.fromPlaceholder')}
196
+ value={smtpSettings.from}
197
+ onChange={(e) => setSmtpSettings({ ...smtpSettings, from: e.target.value })}
198
+ />
199
+ </div>
200
+ <div>
201
+ <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
202
+ {t('smtp.fromName')}
395
203
  </label>
396
204
  <input
397
205
  type="text"
398
- className="w-full px-4 py-2.5 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors"
399
- value={newValue}
400
- onChange={(e) => setNewValue(e.target.value)}
206
+ className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
207
+ placeholder={t('smtp.fromNamePlaceholder')}
208
+ value={smtpSettings.fromName}
209
+ onChange={(e) => setSmtpSettings({ ...smtpSettings, fromName: e.target.value })}
401
210
  />
402
211
  </div>
403
212
  </div>
404
- <Button type="submit" variant="primary" icon={Plus}>
405
- {t('admin.addSetting')}
406
- </Button>
407
- </form>
408
- </div>
409
213
 
410
- <ConfirmDialog {...dialogState} />
214
+ <div className="flex items-center gap-3 pt-2">
215
+ <input
216
+ type="checkbox"
217
+ id="smtp-secure"
218
+ checked={smtpSettings.secure}
219
+ onChange={(e) => setSmtpSettings({ ...smtpSettings, secure: e.target.checked })}
220
+ className="w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed"
221
+ />
222
+ <label htmlFor="smtp-secure" className="text-sm font-medium text-gray-900 dark:text-white">
223
+ {t('smtp.secure')}
224
+ </label>
225
+ </div>
226
+
227
+ <div className="flex items-center gap-4 pt-4 border-t border-gray-200 dark:border-gray-700">
228
+ <div className="flex-1">
229
+ <label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
230
+ {t('smtp.testEmail')}
231
+ </label>
232
+ <div className="px-4 py-2.5 text-sm text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-700/50 border border-gray-300 dark:border-gray-600 rounded-lg">
233
+ {user?.email || t('common.loading')}
234
+ </div>
235
+ </div>
236
+ <div className="pt-6">
237
+ <Button
238
+ variant="ghost"
239
+ icon={Send}
240
+ onClick={handleTestEmail}
241
+ disabled={testingEmail || !user?.email}
242
+ >
243
+ {t('smtp.sendTest')}
244
+ </Button>
245
+ </div>
246
+ </div>
247
+
248
+ <div className="pt-4">
249
+ <Button variant="primary" icon={Save} onClick={handleSMTPSave}>
250
+ {t('smtp.save')}
251
+ </Button>
252
+ </div>
253
+ </div>
254
+ </div>
411
255
  </div>
412
256
  );
413
257
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mdguggenbichler/slugbase-core",
3
- "version": "0.0.22",
3
+ "version": "0.0.23",
4
4
  "description": "SlugBase core: backend and frontend entrypoints for self-hosted and cloud apps",
5
5
  "type": "module",
6
6
  "exports": {