@flowselections/mailbox-orders 1.0.9 → 1.0.11
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.
- package/dist-lib/components/MailboxAuthBanner.d.ts +16 -0
- package/dist-lib/components/MailboxAuthBanner.d.ts.map +1 -0
- package/dist-lib/components/MailboxAuthBanner.js +14 -0
- package/dist-lib/components/MailboxProcessedPage.d.ts.map +1 -1
- package/dist-lib/components/MailboxProcessedPage.js +10 -2
- package/dist-lib/components/MailboxProposalsPage.d.ts +16 -0
- package/dist-lib/components/MailboxProposalsPage.d.ts.map +1 -1
- package/dist-lib/components/MailboxProposalsPage.js +520 -108
- package/dist-lib/components/SearchableSelect.d.ts +1 -0
- package/dist-lib/components/SearchableSelect.d.ts.map +1 -1
- package/dist-lib/components/SearchableSelect.js +2 -1
- package/dist-lib/components/settings/MailboxAiPromptCard.d.ts +2 -0
- package/dist-lib/components/settings/MailboxAiPromptCard.d.ts.map +1 -0
- package/dist-lib/components/settings/MailboxAiPromptCard.js +39 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +2 -0
- package/dist-lib/integrations/supabase/auth-attacher.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/auth-attacher.js +5 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +2 -11202
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/auth-middleware.js +8 -7
- package/dist-lib/integrations/supabase/client.d.ts +16689 -7180
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +16691 -7181
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +16944 -7220
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +63 -1
- package/dist-lib/lib/ai-config.server.d.ts +60 -0
- package/dist-lib/lib/ai-config.server.d.ts.map +1 -0
- package/dist-lib/lib/ai-config.server.js +112 -0
- package/dist-lib/lib/delivery-date.d.ts +37 -0
- package/dist-lib/lib/delivery-date.d.ts.map +1 -0
- package/dist-lib/lib/delivery-date.js +96 -0
- package/dist-lib/lib/load-carriers.d.ts +26 -0
- package/dist-lib/lib/load-carriers.d.ts.map +1 -0
- package/dist-lib/lib/load-carriers.js +73 -0
- package/dist-lib/lib/mailbox-ai-prompt.d.ts +9 -0
- package/dist-lib/lib/mailbox-ai-prompt.d.ts.map +1 -0
- package/dist-lib/lib/mailbox-ai-prompt.js +30 -0
- package/dist-lib/lib/mailbox-ai-settings.functions.d.ts +23 -0
- package/dist-lib/lib/mailbox-ai-settings.functions.d.ts.map +1 -0
- package/dist-lib/lib/mailbox-ai-settings.functions.js +58 -0
- package/dist-lib/lib/mailbox-ai.server.d.ts +56 -4
- package/dist-lib/lib/mailbox-ai.server.d.ts.map +1 -1
- package/dist-lib/lib/mailbox-ai.server.js +329 -6
- package/dist-lib/lib/mailbox-body.d.ts +7 -0
- package/dist-lib/lib/mailbox-body.d.ts.map +1 -0
- package/dist-lib/lib/mailbox-body.js +38 -0
- package/dist-lib/lib/mailbox-ingest.server.d.ts +89 -0
- package/dist-lib/lib/mailbox-ingest.server.d.ts.map +1 -0
- package/dist-lib/lib/mailbox-ingest.server.js +928 -0
- package/dist-lib/lib/mailbox-template.functions.d.ts +7 -67213
- package/dist-lib/lib/mailbox-template.functions.d.ts.map +1 -1
- package/dist-lib/lib/mailbox.functions.d.ts +130 -190511
- package/dist-lib/lib/mailbox.functions.d.ts.map +1 -1
- package/dist-lib/lib/mailbox.functions.js +641 -274
- package/package.json +4 -3
- package/dist-lib/components/CartAssignmentWizard.d.ts +0 -6
- package/dist-lib/components/CartAssignmentWizard.d.ts.map +0 -1
- package/dist-lib/components/CartAssignmentWizard.js +0 -199
- package/dist-lib/components/MailboxInboxPage.d.ts +0 -2
- package/dist-lib/components/MailboxInboxPage.d.ts.map +0 -1
- package/dist-lib/components/MailboxInboxPage.js +0 -120
- package/dist-lib/components/settings/ImapAccountsCard.d.ts +0 -2
- package/dist-lib/components/settings/ImapAccountsCard.d.ts.map +0 -1
- package/dist-lib/components/settings/ImapAccountsCard.js +0 -136
- package/dist-lib/components/settings/ImapProfilesCard.d.ts +0 -2
- package/dist-lib/components/settings/ImapProfilesCard.d.ts.map +0 -1
- package/dist-lib/components/settings/ImapProfilesCard.js +0 -101
- package/dist-lib/components/settings/MailboxSettingsCard.d.ts +0 -2
- package/dist-lib/components/settings/MailboxSettingsCard.d.ts.map +0 -1
- package/dist-lib/components/settings/MailboxSettingsCard.js +0 -85
- package/dist-lib/lib/imap.functions.d.ts +0 -32852
- package/dist-lib/lib/imap.functions.d.ts.map +0 -1
- package/dist-lib/lib/imap.functions.js +0 -235
- package/dist-lib/lib/mailbox-auto.server.d.ts +0 -9
- package/dist-lib/lib/mailbox-auto.server.d.ts.map +0 -1
- package/dist-lib/lib/mailbox-auto.server.js +0 -198
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useState } from "react";
|
|
3
|
-
import { Card, CardContent, CardDescription, CardHeader, CardTitle, Button, Input, Label, Switch, Badge, Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, toast, } from "@flowselections/core";
|
|
4
|
-
import { Inbox, Plus, Pencil, Trash2, RefreshCw, PlayCircle } from "lucide-react";
|
|
5
|
-
import { listImapAccounts, listImapProfiles, upsertImapProfile, deleteImapProfile, setProfileAccount, pollImapProfile, } from "../../lib/imap.functions";
|
|
6
|
-
const emptyProfile = {
|
|
7
|
-
id: undefined,
|
|
8
|
-
profile_key: "",
|
|
9
|
-
name: "",
|
|
10
|
-
account_id: null,
|
|
11
|
-
folder: "INBOX",
|
|
12
|
-
polling_enabled: false,
|
|
13
|
-
};
|
|
14
|
-
export function ImapProfilesCard() {
|
|
15
|
-
const [profiles, setProfiles] = useState([]);
|
|
16
|
-
const [accounts, setAccounts] = useState([]);
|
|
17
|
-
const [loading, setLoading] = useState(true);
|
|
18
|
-
const [editing, setEditing] = useState(null);
|
|
19
|
-
const [saving, setSaving] = useState(false);
|
|
20
|
-
const [pollingId, setPollingId] = useState(null);
|
|
21
|
-
const reload = async () => {
|
|
22
|
-
setLoading(true);
|
|
23
|
-
try {
|
|
24
|
-
const [p, a] = await Promise.all([listImapProfiles(), listImapAccounts()]);
|
|
25
|
-
setProfiles(Array.isArray(p?.items) ? p.items : []);
|
|
26
|
-
setAccounts(Array.isArray(a?.items) ? a.items : []);
|
|
27
|
-
}
|
|
28
|
-
finally {
|
|
29
|
-
setLoading(false);
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
useEffect(() => { reload(); }, []);
|
|
33
|
-
const handleSave = async () => {
|
|
34
|
-
if (!editing)
|
|
35
|
-
return;
|
|
36
|
-
setSaving(true);
|
|
37
|
-
try {
|
|
38
|
-
await upsertImapProfile({ data: { ...editing } });
|
|
39
|
-
toast.success("Profiel opgeslagen");
|
|
40
|
-
setEditing(null);
|
|
41
|
-
reload();
|
|
42
|
-
}
|
|
43
|
-
catch (e) {
|
|
44
|
-
toast.error(e?.message ?? "Opslaan mislukt");
|
|
45
|
-
}
|
|
46
|
-
finally {
|
|
47
|
-
setSaving(false);
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
const handleDelete = async (id) => {
|
|
51
|
-
if (!confirm("Profiel verwijderen?"))
|
|
52
|
-
return;
|
|
53
|
-
try {
|
|
54
|
-
await deleteImapProfile({ data: { id } });
|
|
55
|
-
toast.success("Verwijderd");
|
|
56
|
-
reload();
|
|
57
|
-
}
|
|
58
|
-
catch (e) {
|
|
59
|
-
toast.error(e?.message ?? "Verwijderen mislukt");
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
const handleChangeAccount = async (profile_id, account_id) => {
|
|
63
|
-
try {
|
|
64
|
-
await setProfileAccount({ data: { profile_id, account_id: account_id === "__none__" ? null : account_id } });
|
|
65
|
-
reload();
|
|
66
|
-
}
|
|
67
|
-
catch (e) {
|
|
68
|
-
toast.error(e?.message ?? "Wijzigen mislukt");
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
const handlePoll = async (id) => {
|
|
72
|
-
setPollingId(id);
|
|
73
|
-
try {
|
|
74
|
-
const res = await pollImapProfile({ data: { profile_id: id } });
|
|
75
|
-
if (res?.ok)
|
|
76
|
-
toast.success(`${res.inserted ?? 0} nieuwe e-mail(s) opgehaald`);
|
|
77
|
-
else
|
|
78
|
-
toast.error(res?.error ?? "Ophalen mislukt");
|
|
79
|
-
reload();
|
|
80
|
-
}
|
|
81
|
-
finally {
|
|
82
|
-
setPollingId(null);
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
const handleTogglePolling = async (p, v) => {
|
|
86
|
-
try {
|
|
87
|
-
await upsertImapProfile({ data: {
|
|
88
|
-
id: p.id, profile_key: p.profile_key, name: p.name,
|
|
89
|
-
account_id: p.account_id, folder: p.folder, polling_enabled: v,
|
|
90
|
-
} });
|
|
91
|
-
reload();
|
|
92
|
-
}
|
|
93
|
-
catch (e) {
|
|
94
|
-
toast.error(e?.message ?? "Wijzigen mislukt");
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Inbox, { className: "h-5 w-5 text-primary" }), _jsx(CardTitle, { children: "IMAP Profielen" })] }), _jsx(CardDescription, { children: "Profielen zijn de logische \"rol\" waar modules aan koppelen (bv. Orders, Offertes, Support). Wissel hier het achterliggende account zonder dat modules iets merken." })] }), _jsxs("div", { className: "flex gap-2", children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: reload, disabled: loading, children: [_jsx(RefreshCw, { className: `h-4 w-4 mr-2 ${loading ? "animate-spin" : ""}` }), "Vernieuwen"] }), _jsxs(Button, { size: "sm", onClick: () => setEditing({ ...emptyProfile }), children: [_jsx(Plus, { className: "h-4 w-4 mr-2" }), "Profiel toevoegen"] })] })] }), _jsx(CardContent, { children: loading ? (_jsx("div", { className: "text-sm text-muted-foreground", children: "Laden..." })) : profiles.length === 0 ? (_jsx("div", { className: "text-sm text-muted-foreground", children: "Nog geen profielen." })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Profiel" }), _jsx(TableHead, { children: "Sleutel" }), _jsx(TableHead, { children: "Account" }), _jsx(TableHead, { children: "Map" }), _jsx(TableHead, { children: "Auto" }), _jsx(TableHead, { children: "Laatste sync" }), _jsx(TableHead, { className: "text-right", children: "Acties" })] }) }), _jsx(TableBody, { children: profiles.map((p) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium", children: p.name }), _jsx(TableCell, { children: _jsx("code", { className: "text-xs", children: p.profile_key }) }), _jsx(TableCell, { children: _jsxs(Select, { value: p.account_id ?? "__none__", onValueChange: (v) => handleChangeAccount(p.id, v), children: [_jsx(SelectTrigger, { className: "h-8 w-[220px]", children: _jsx(SelectValue, { placeholder: "Geen account" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "__none__", children: "\u2014 Geen \u2014" }), accounts.map((a) => (_jsx(SelectItem, { value: a.id, children: a.name }, a.id)))] })] }) }), _jsx(TableCell, { className: "text-muted-foreground text-xs", children: p.folder }), _jsx(TableCell, { children: _jsx(Switch, { checked: p.polling_enabled, onCheckedChange: (v) => handleTogglePolling(p, v) }) }), _jsxs(TableCell, { className: "text-xs", children: [p.last_polled_at ? new Date(p.last_polled_at).toLocaleString("nl-NL") : "—", p.last_error ? _jsx(Badge, { variant: "destructive", className: "ml-2", title: p.last_error, children: "Fout" }) : null] }), _jsx(TableCell, { className: "text-right", children: _jsxs("div", { className: "flex gap-1 justify-end", children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: () => handlePoll(p.id), disabled: pollingId === p.id || !p.account_id, children: _jsx(PlayCircle, { className: `h-4 w-4 ${pollingId === p.id ? "animate-pulse" : ""}` }) }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setEditing({
|
|
98
|
-
id: p.id, profile_key: p.profile_key, name: p.name,
|
|
99
|
-
account_id: p.account_id, folder: p.folder, polling_enabled: p.polling_enabled,
|
|
100
|
-
}), children: _jsx(Pencil, { className: "h-4 w-4" }) }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => handleDelete(p.id), children: _jsx(Trash2, { className: "h-4 w-4 text-destructive" }) })] }) })] }, p.id))) })] })) }), _jsx(Dialog, { open: !!editing, onOpenChange: (o) => !o && setEditing(null), children: _jsxs(DialogContent, { className: "max-w-lg", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: editing?.id ? "Profiel bewerken" : "Nieuw profiel" }) }), editing && (_jsxs("div", { className: "grid grid-cols-2 gap-3", children: [_jsxs("div", { className: "space-y-1 col-span-2", children: [_jsx(Label, { children: "Naam" }), _jsx(Input, { value: editing.name, onChange: (e) => setEditing({ ...editing, name: e.target.value }), placeholder: "bv. Mailbox Orders" })] }), _jsxs("div", { className: "space-y-1 col-span-2", children: [_jsx(Label, { children: "Profielsleutel (uniek)" }), _jsx(Input, { value: editing.profile_key, onChange: (e) => setEditing({ ...editing, profile_key: e.target.value.toLowerCase().replace(/[^a-z0-9_]/g, "_") }), placeholder: "mailbox_orders", disabled: !!editing.id }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Modules verwijzen naar deze sleutel." })] }), _jsxs("div", { className: "space-y-1 col-span-2", children: [_jsx(Label, { children: "Gekoppeld account" }), _jsxs(Select, { value: editing.account_id ?? "__none__", onValueChange: (v) => setEditing({ ...editing, account_id: v === "__none__" ? null : v }), children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "__none__", children: "\u2014 Geen \u2014" }), accounts.map((a) => (_jsx(SelectItem, { value: a.id, children: a.name }, a.id)))] })] })] }), _jsxs("div", { className: "space-y-1 col-span-2", children: [_jsx(Label, { children: "Map" }), _jsx(Input, { value: editing.folder, onChange: (e) => setEditing({ ...editing, folder: e.target.value }) })] }), _jsxs("div", { className: "col-span-2 flex items-center justify-between", children: [_jsx(Label, { children: "Automatisch ophalen (elke 5 min)" }), _jsx(Switch, { checked: editing.polling_enabled, onCheckedChange: (v) => setEditing({ ...editing, polling_enabled: v }) })] })] })), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: () => setEditing(null), children: "Annuleren" }), _jsx(Button, { onClick: handleSave, disabled: saving, children: saving ? "Opslaan..." : "Opslaan" })] })] }) })] }));
|
|
101
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MailboxSettingsCard.d.ts","sourceRoot":"","sources":["../../../src/components/settings/MailboxSettingsCard.tsx"],"names":[],"mappings":"AAWA,wBAAgB,mBAAmB,gCA8IlC"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useState } from "react";
|
|
3
|
-
import { Card, CardContent, CardDescription, CardHeader, CardTitle, Button, Input, Label, Switch, toast, } from "@flowselections/core";
|
|
4
|
-
import { Mail, RefreshCw } from "lucide-react";
|
|
5
|
-
import { getMailboxSettings, saveMailboxSettings, testMailboxConnection, pollMailbox, } from "../../lib/mailbox.functions";
|
|
6
|
-
export function MailboxSettingsCard() {
|
|
7
|
-
const [form, setForm] = useState({
|
|
8
|
-
imap_host: "",
|
|
9
|
-
imap_port: 993,
|
|
10
|
-
imap_username: "",
|
|
11
|
-
imap_use_tls: true,
|
|
12
|
-
folder: "INBOX",
|
|
13
|
-
polling_enabled: false,
|
|
14
|
-
});
|
|
15
|
-
const [loading, setLoading] = useState(true);
|
|
16
|
-
const [saving, setSaving] = useState(false);
|
|
17
|
-
const [testing, setTesting] = useState(false);
|
|
18
|
-
const [polling, setPolling] = useState(false);
|
|
19
|
-
useEffect(() => {
|
|
20
|
-
(async () => {
|
|
21
|
-
try {
|
|
22
|
-
const res = await getMailboxSettings();
|
|
23
|
-
if (res?.settings) {
|
|
24
|
-
setForm({
|
|
25
|
-
imap_host: res.settings.imap_host ?? "",
|
|
26
|
-
imap_port: res.settings.imap_port ?? 993,
|
|
27
|
-
imap_username: res.settings.imap_username ?? "",
|
|
28
|
-
imap_use_tls: res.settings.imap_use_tls ?? true,
|
|
29
|
-
folder: res.settings.folder ?? "INBOX",
|
|
30
|
-
polling_enabled: res.settings.polling_enabled ?? false,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
finally {
|
|
35
|
-
setLoading(false);
|
|
36
|
-
}
|
|
37
|
-
})();
|
|
38
|
-
}, []);
|
|
39
|
-
const handleSave = async () => {
|
|
40
|
-
setSaving(true);
|
|
41
|
-
try {
|
|
42
|
-
await saveMailboxSettings({ data: form });
|
|
43
|
-
toast.success("Instellingen opgeslagen");
|
|
44
|
-
}
|
|
45
|
-
catch (e) {
|
|
46
|
-
toast.error(e?.message ?? "Opslaan mislukt");
|
|
47
|
-
}
|
|
48
|
-
finally {
|
|
49
|
-
setSaving(false);
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
const handleTest = async () => {
|
|
53
|
-
setTesting(true);
|
|
54
|
-
try {
|
|
55
|
-
const res = await testMailboxConnection();
|
|
56
|
-
if (res?.ok)
|
|
57
|
-
toast.success("Verbinding OK");
|
|
58
|
-
else
|
|
59
|
-
toast.error(res?.error ?? "Verbinding mislukt");
|
|
60
|
-
}
|
|
61
|
-
catch (e) {
|
|
62
|
-
toast.error(e?.message ?? "Verbinding mislukt");
|
|
63
|
-
}
|
|
64
|
-
finally {
|
|
65
|
-
setTesting(false);
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
const handlePoll = async () => {
|
|
69
|
-
setPolling(true);
|
|
70
|
-
try {
|
|
71
|
-
const res = await pollMailbox();
|
|
72
|
-
if (res?.ok)
|
|
73
|
-
toast.success(`${res.inserted ?? 0} nieuwe e-mail(s) opgehaald`);
|
|
74
|
-
else
|
|
75
|
-
toast.error(res?.error ?? "Ophalen mislukt");
|
|
76
|
-
}
|
|
77
|
-
catch (e) {
|
|
78
|
-
toast.error(e?.message ?? "Ophalen mislukt");
|
|
79
|
-
}
|
|
80
|
-
finally {
|
|
81
|
-
setPolling(false);
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Mail, { className: "h-5 w-5 text-primary" }), _jsx(CardTitle, { children: "Mailbox (IMAP)" })] }), _jsx(CardDescription, { children: "IMAP-mailbox waaruit bestel-e-mails worden opgehaald. Het wachtwoord staat als geheime sleutel opgeslagen." })] }), _jsx(CardContent, { className: "space-y-4", children: loading ? (_jsx("div", { className: "text-sm text-muted-foreground", children: "Laden..." })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "grid grid-cols-2 gap-3", children: [_jsxs("div", { className: "space-y-2 col-span-2", children: [_jsx(Label, { htmlFor: "host", children: "IMAP host" }), _jsx(Input, { id: "host", value: form.imap_host, onChange: (e) => setForm({ ...form, imap_host: e.target.value }), placeholder: "imap.example.com" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "port", children: "Poort" }), _jsx(Input, { id: "port", type: "number", value: form.imap_port, onChange: (e) => setForm({ ...form, imap_port: Number(e.target.value) }) })] }), _jsxs("div", { className: "space-y-2 flex flex-col", children: [_jsx(Label, { htmlFor: "tls", children: "TLS" }), _jsx(Switch, { id: "tls", checked: form.imap_use_tls, onCheckedChange: (v) => setForm({ ...form, imap_use_tls: v }) })] }), _jsxs("div", { className: "space-y-2 col-span-2", children: [_jsx(Label, { htmlFor: "user", children: "Gebruikersnaam" }), _jsx(Input, { id: "user", value: form.imap_username, onChange: (e) => setForm({ ...form, imap_username: e.target.value }), placeholder: "bestellingen@example.com" })] }), _jsxs("div", { className: "space-y-2 col-span-2", children: [_jsx(Label, { htmlFor: "folder", children: "Map" }), _jsx(Input, { id: "folder", value: form.folder, onChange: (e) => setForm({ ...form, folder: e.target.value }) })] }), _jsxs("div", { className: "space-y-2 col-span-2 flex items-center justify-between", children: [_jsx(Label, { htmlFor: "poll", children: "Automatisch ophalen (elke 5 min)" }), _jsx(Switch, { id: "poll", checked: form.polling_enabled, onCheckedChange: (v) => setForm({ ...form, polling_enabled: v }) })] })] }), _jsxs("div", { className: "flex gap-2 flex-wrap", children: [_jsx(Button, { onClick: handleSave, disabled: saving, children: saving ? "Opslaan..." : "Opslaan" }), _jsx(Button, { variant: "outline", onClick: handleTest, disabled: testing, children: testing ? "Testen..." : "Test verbinding" }), _jsxs(Button, { variant: "outline", onClick: handlePoll, disabled: polling, children: [_jsx(RefreshCw, { className: `h-4 w-4 mr-2 ${polling ? "animate-spin" : ""}` }), "Nu ophalen"] })] }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Het IMAP-wachtwoord is opgeslagen als geheime sleutel ", _jsx("code", { children: "MAILBOX_IMAP_PASSWORD" }), "."] })] })) })] }));
|
|
85
|
-
}
|