@flowselections/floriday-klanten-module 1.0.0

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.
Files changed (71) hide show
  1. package/dist-lib/_core-safelist.d.ts +2 -0
  2. package/dist-lib/_core-safelist.d.ts.map +1 -0
  3. package/dist-lib/_core-safelist.js +15 -0
  4. package/dist-lib/components/CustomerAvatar.d.ts +7 -0
  5. package/dist-lib/components/CustomerAvatar.d.ts.map +1 -0
  6. package/dist-lib/components/CustomerAvatar.js +18 -0
  7. package/dist-lib/components/TemplatePage.d.ts +2 -0
  8. package/dist-lib/components/TemplatePage.d.ts.map +1 -0
  9. package/dist-lib/components/TemplatePage.js +4 -0
  10. package/dist-lib/components/settings/CustomerFieldsCard.d.ts +2 -0
  11. package/dist-lib/components/settings/CustomerFieldsCard.d.ts.map +1 -0
  12. package/dist-lib/components/settings/CustomerFieldsCard.js +59 -0
  13. package/dist-lib/index.d.ts +5 -0
  14. package/dist-lib/index.d.ts.map +1 -0
  15. package/dist-lib/index.js +32 -0
  16. package/dist-lib/integrations/supabase/auth-attacher.d.ts +2 -0
  17. package/dist-lib/integrations/supabase/auth-attacher.d.ts.map +1 -0
  18. package/dist-lib/integrations/supabase/auth-attacher.js +12 -0
  19. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1560 -0
  20. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -0
  21. package/dist-lib/integrations/supabase/auth-middleware.js +52 -0
  22. package/dist-lib/integrations/supabase/client.d.ts +1556 -0
  23. package/dist-lib/integrations/supabase/client.d.ts.map +1 -0
  24. package/dist-lib/integrations/supabase/client.js +28 -0
  25. package/dist-lib/integrations/supabase/client.server.d.ts +1556 -0
  26. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -0
  27. package/dist-lib/integrations/supabase/client.server.js +50 -0
  28. package/dist-lib/integrations/supabase/types.d.ts +1656 -0
  29. package/dist-lib/integrations/supabase/types.d.ts.map +1 -0
  30. package/dist-lib/integrations/supabase/types.js +8 -0
  31. package/dist-lib/lib/accounting/exact/client.server.d.ts +37 -0
  32. package/dist-lib/lib/accounting/exact/client.server.d.ts.map +1 -0
  33. package/dist-lib/lib/accounting/exact/client.server.js +160 -0
  34. package/dist-lib/lib/accounting/exact/mapping.d.ts +39 -0
  35. package/dist-lib/lib/accounting/exact/mapping.d.ts.map +1 -0
  36. package/dist-lib/lib/accounting/exact/mapping.js +45 -0
  37. package/dist-lib/lib/accounting/exact/sync.server.d.ts +4 -0
  38. package/dist-lib/lib/accounting/exact/sync.server.d.ts.map +1 -0
  39. package/dist-lib/lib/accounting/exact/sync.server.js +181 -0
  40. package/dist-lib/lib/accounting/floriday/sync.server.d.ts +3 -0
  41. package/dist-lib/lib/accounting/floriday/sync.server.d.ts.map +1 -0
  42. package/dist-lib/lib/accounting/floriday/sync.server.js +17 -0
  43. package/dist-lib/lib/accounting/registry.server.d.ts +4 -0
  44. package/dist-lib/lib/accounting/registry.server.d.ts.map +1 -0
  45. package/dist-lib/lib/accounting/registry.server.js +9 -0
  46. package/dist-lib/lib/accounting/types.d.ts +24 -0
  47. package/dist-lib/lib/accounting/types.d.ts.map +1 -0
  48. package/dist-lib/lib/accounting/types.js +4 -0
  49. package/dist-lib/lib/accounting.functions.d.ts +4682 -0
  50. package/dist-lib/lib/accounting.functions.d.ts.map +1 -0
  51. package/dist-lib/lib/accounting.functions.js +50 -0
  52. package/dist-lib/lib/crypto.server.d.ts +10 -0
  53. package/dist-lib/lib/crypto.server.d.ts.map +1 -0
  54. package/dist-lib/lib/crypto.server.js +61 -0
  55. package/dist-lib/lib/customer-schemas.d.ts +53 -0
  56. package/dist-lib/lib/customer-schemas.d.ts.map +1 -0
  57. package/dist-lib/lib/customer-schemas.js +31 -0
  58. package/dist-lib/lib/customers.functions.d.ts +15904 -0
  59. package/dist-lib/lib/customers.functions.d.ts.map +1 -0
  60. package/dist-lib/lib/customers.functions.js +251 -0
  61. package/dist-lib/lib/floriday.server.d.ts +55 -0
  62. package/dist-lib/lib/floriday.server.d.ts.map +1 -0
  63. package/dist-lib/lib/floriday.server.js +765 -0
  64. package/dist-lib/lib/utils.d.ts +3 -0
  65. package/dist-lib/lib/utils.d.ts.map +1 -0
  66. package/dist-lib/lib/utils.js +5 -0
  67. package/dist-lib/lib/validationSchemas.d.ts +15 -0
  68. package/dist-lib/lib/validationSchemas.d.ts.map +1 -0
  69. package/dist-lib/lib/validationSchemas.js +25 -0
  70. package/dist-lib/styles.css +1 -0
  71. package/package.json +74 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_core-safelist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_core-safelist.d.ts","sourceRoot":"","sources":["../src/_core-safelist.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ // Forceert Tailwind classes die uit @flowselections/core komen maar niet
2
+ // voorkomen in de eigen broncode van deze module.
3
+ // Zonder dit bestand worden deze classes weggeoptimaliseerd op de
4
+ // Lovable productie build.
5
+ const _safelist = [
6
+ // Layout — Sidebar en shell structuur
7
+ 'h-full', 'flex-col', 'flex-1', 'min-h-screen', 'ml-64', 'pt-16',
8
+ 'items-start', 'items-center', 'justify-between', 'border-t',
9
+ 'w-64', 'h-screen', 'h-20', 'overflow-y-auto',
10
+ // Grid — InstellingenPage
11
+ 'grid', 'lg:grid-cols-2', 'gap-6', 'p-6', 'space-y-6',
12
+ // Toggle/Switch — aan/uit zichtbaarheid
13
+ 'data-[state=checked]:bg-primary', 'data-[state=unchecked]:bg-input',
14
+ ];
15
+ export {};
@@ -0,0 +1,7 @@
1
+ export declare function CustomerAvatar({ logoUrl, name, size, className, }: {
2
+ logoUrl?: string | null;
3
+ name?: string | null;
4
+ size?: "sm" | "md" | "lg";
5
+ className?: string;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=CustomerAvatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomerAvatar.d.ts","sourceRoot":"","sources":["../../src/components/CustomerAvatar.tsx"],"names":[],"mappings":"AAYA,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,IAAI,EACJ,IAAW,EACX,SAAS,GACV,EAAE;IACD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BA0BA"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "@/lib/utils";
3
+ function initials(name) {
4
+ if (!name)
5
+ return "?";
6
+ return name
7
+ .split(/\s+/)
8
+ .filter(Boolean)
9
+ .slice(0, 2)
10
+ .map((w) => w[0]?.toUpperCase() ?? "")
11
+ .join("") || "?";
12
+ }
13
+ export function CustomerAvatar({ logoUrl, name, size = "md", className, }) {
14
+ const sizeClass = size === "sm" ? "h-8 w-8 text-xs" : size === "lg" ? "h-16 w-16 text-lg" : "h-10 w-10 text-sm";
15
+ return (_jsx("div", { className: cn("relative shrink-0 overflow-hidden rounded-full bg-muted flex items-center justify-center font-medium text-muted-foreground border border-border", sizeClass, className), children: logoUrl ? (_jsx("img", { src: logoUrl, alt: name ?? "", className: "h-full w-full object-cover", onError: (e) => {
16
+ e.currentTarget.style.display = "none";
17
+ } })) : (_jsx("span", { children: initials(name) })) }));
18
+ }
@@ -0,0 +1,2 @@
1
+ export declare function TemplatePage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=TemplatePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplatePage.d.ts","sourceRoot":"","sources":["../../src/components/TemplatePage.tsx"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,gCAS3B"}
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function TemplatePage() {
3
+ return (_jsxs("div", { className: "p-6", children: [_jsx("h1", { className: "text-2xl font-semibold", children: "Module pagina" }), _jsx("p", { className: "text-muted-foreground mt-2", children: "Vervang dit component met de pagina's van jouw module." })] }));
4
+ }
@@ -0,0 +1,2 @@
1
+ export declare function CustomerFieldsCard(): import("react").JSX.Element;
2
+ //# sourceMappingURL=CustomerFieldsCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomerFieldsCard.d.ts","sourceRoot":"","sources":["../../../src/components/settings/CustomerFieldsCard.tsx"],"names":[],"mappings":"AAUA,wBAAgB,kBAAkB,gCA2FjC"}
@@ -0,0 +1,59 @@
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, supabase, toast, } from "@flowselections/core";
4
+ import { Plus, Trash2, Users } from "lucide-react";
5
+ export function CustomerFieldsCard() {
6
+ const [fields, setFields] = useState([]);
7
+ const [options, setOptions] = useState([]);
8
+ const [newOption, setNewOption] = useState("");
9
+ const [newField, setNewField] = useState("");
10
+ const load = async () => {
11
+ const [{ data: f }, { data: o }] = await Promise.all([
12
+ supabase.from("customer_field_settings").select("*").order("sort_order"),
13
+ supabase.from("customer_field_options").select("*").order("sort_order"),
14
+ ]);
15
+ setFields(f ?? []);
16
+ setOptions(o ?? []);
17
+ };
18
+ useEffect(() => { load(); }, []);
19
+ const classField = fields.find((f) => f.field_key === "customer_class");
20
+ const classOptions = options.filter((o) => o.field_setting_id === classField?.id);
21
+ const addClass = async () => {
22
+ if (!classField || !newOption.trim())
23
+ return;
24
+ const { error } = await supabase.from("customer_field_options").insert({
25
+ field_setting_id: classField.id, label: newOption.trim(), sort_order: classOptions.length,
26
+ });
27
+ if (error)
28
+ return toast.error(error.message);
29
+ setNewOption("");
30
+ toast.success("Klantklasse toegevoegd");
31
+ load();
32
+ };
33
+ const delOption = async (id) => {
34
+ const { error } = await supabase.from("customer_field_options").delete().eq("id", id);
35
+ if (error)
36
+ return toast.error(error.message);
37
+ load();
38
+ };
39
+ const addField = async () => {
40
+ if (!newField.trim())
41
+ return;
42
+ const key = newField.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_");
43
+ const { error } = await supabase.from("customer_field_settings").insert({
44
+ field_key: key, field_label: newField.trim(), field_type: "text", is_custom: true, sort_order: fields.length,
45
+ });
46
+ if (error)
47
+ return toast.error(error.message);
48
+ setNewField("");
49
+ toast.success("Veld toegevoegd");
50
+ load();
51
+ };
52
+ const delField = async (id) => {
53
+ const { error } = await supabase.from("customer_field_settings").delete().eq("id", id);
54
+ if (error)
55
+ return toast.error(error.message);
56
+ load();
57
+ };
58
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Users, { className: "h-5 w-5 text-primary" }), _jsx(CardTitle, { children: "Klantenmodule" })] }), _jsx(CardDescription, { children: "Beheer klantklassen en extra velden voor klanten" })] }), _jsxs(CardContent, { className: "space-y-6", children: [_jsxs("div", { children: [_jsx(Label, { className: "text-sm font-medium", children: "Klantklassen" }), _jsxs("div", { className: "space-y-2 mt-2", children: [classOptions.map((o) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { value: o.label, disabled: true, className: "flex-1" }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => delOption(o.id), children: _jsx(Trash2, { className: "h-4 w-4" }) })] }, o.id))), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { value: newOption, onChange: (e) => setNewOption(e.target.value), placeholder: "Nieuwe klantklasse (bv. D)" }), _jsx(Button, { onClick: addClass, size: "sm", children: _jsx(Plus, { className: "h-4 w-4" }) })] })] })] }), _jsxs("div", { children: [_jsx(Label, { className: "text-sm font-medium", children: "Extra (custom) velden" }), _jsxs("div", { className: "space-y-2 mt-2", children: [fields.filter((f) => f.is_custom).map((f) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { value: f.field_label, disabled: true, className: "flex-1" }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => delField(f.id), children: _jsx(Trash2, { className: "h-4 w-4" }) })] }, f.id))), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { value: newField, onChange: (e) => setNewField(e.target.value), placeholder: "Naam van nieuw veld" }), _jsx(Button, { onClick: addField, size: "sm", children: _jsx(Plus, { className: "h-4 w-4" }) })] })] })] })] })] }));
59
+ }
@@ -0,0 +1,5 @@
1
+ import type { FlowModule } from "@flowselections/core";
2
+ export * from "./_core-safelist";
3
+ export * from "./components/TemplatePage";
4
+ export declare const myModule: FlowModule;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAE1C,eAAO,MAAM,QAAQ,EAAE,UAYtB,CAAC"}
@@ -0,0 +1,32 @@
1
+ // ============================================================================
2
+ // src/index.ts — MODULE CONTRACT
3
+ // ============================================================================
4
+ // This is the most important file in your module.
5
+ // The shell repo reads this file to know:
6
+ // - What nav item to show in the sidebar
7
+ // - What settings cards to add to the settings page
8
+ // - Your module's identity (id, name, version)
9
+ //
10
+ // WHAT TO DO:
11
+ // 1. Replace all PLACEHOLDER values below with your module's real values
12
+ // 2. Import your real settings card components (if any)
13
+ // 3. Add your nav item — use `children` if you need a dropdown
14
+ // 4. Done! You don't need to touch any other file for registration.
15
+ // ============================================================================
16
+ import { Users } from "lucide-react";
17
+ import { CustomerFieldsCard } from "./components/settings/CustomerFieldsCard";
18
+ export * from "./_core-safelist";
19
+ export * from "./components/TemplatePage";
20
+ export const myModule = {
21
+ id: "customers",
22
+ name: "Klanten",
23
+ version: "1.0.0",
24
+ nav: {
25
+ label: "Klanten",
26
+ href: "/klanten",
27
+ icon: Users,
28
+ },
29
+ settingsCards: [
30
+ { component: CustomerFieldsCard, order: 10 },
31
+ ],
32
+ };
@@ -0,0 +1,2 @@
1
+ export declare const attachSupabaseAuth: import("@tanstack/start-client-core").FunctionMiddlewareAfterClient<{}, unknown, undefined, undefined, undefined>;
2
+ //# sourceMappingURL=auth-attacher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-attacher.d.ts","sourceRoot":"","sources":["../../../src/integrations/supabase/auth-attacher.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,mHAQ9B,CAAA"}
@@ -0,0 +1,12 @@
1
+ // This file is automatically generated. Do not edit it directly.
2
+ import { createMiddleware } from '@tanstack/react-start';
3
+ import { supabase } from './client';
4
+ // Must be registered as a global `functionMiddleware` in `src/start.ts`; otherwise
5
+ // the browser never attaches the bearer token to serverFn RPCs.
6
+ export const attachSupabaseAuth = createMiddleware({ type: 'function' }).client(async ({ next }) => {
7
+ const { data } = await supabase.auth.getSession();
8
+ const token = data.session?.access_token;
9
+ return next({
10
+ headers: token ? { Authorization: `Bearer ${token}` } : {},
11
+ });
12
+ });