@mandaitor/react 0.1.1
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/LICENSE +21 -0
- package/README.md +74 -0
- package/dist/components/APIKeyManager.d.ts +4 -0
- package/dist/components/APIKeyManager.d.ts.map +1 -0
- package/dist/components/APIKeyManager.js +58 -0
- package/dist/components/APIKeyManager.js.map +1 -0
- package/dist/components/MandaitorProvider.d.ts +31 -0
- package/dist/components/MandaitorProvider.d.ts.map +1 -0
- package/dist/components/MandaitorProvider.js +29 -0
- package/dist/components/MandaitorProvider.js.map +1 -0
- package/dist/components/MandaitorProvider.stories.d.ts +12 -0
- package/dist/components/MandaitorProvider.stories.d.ts.map +1 -0
- package/dist/components/MandaitorProvider.stories.js +41 -0
- package/dist/components/MandaitorProvider.stories.js.map +1 -0
- package/dist/components/MandateCreator.d.ts +16 -0
- package/dist/components/MandateCreator.d.ts.map +1 -0
- package/dist/components/MandateCreator.js +58 -0
- package/dist/components/MandateCreator.js.map +1 -0
- package/dist/components/MandateCreator.stories.d.ts +14 -0
- package/dist/components/MandateCreator.stories.d.ts.map +1 -0
- package/dist/components/MandateCreator.stories.js +72 -0
- package/dist/components/MandateCreator.stories.js.map +1 -0
- package/dist/components/MandateManager.d.ts +22 -0
- package/dist/components/MandateManager.d.ts.map +1 -0
- package/dist/components/MandateManager.js +119 -0
- package/dist/components/MandateManager.js.map +1 -0
- package/dist/components/MandateManager.stories.d.ts +14 -0
- package/dist/components/MandateManager.stories.d.ts.map +1 -0
- package/dist/components/MandateManager.stories.js +47 -0
- package/dist/components/MandateManager.stories.js.map +1 -0
- package/dist/components/MandateVerifier.d.ts +18 -0
- package/dist/components/MandateVerifier.d.ts.map +1 -0
- package/dist/components/MandateVerifier.js +104 -0
- package/dist/components/MandateVerifier.js.map +1 -0
- package/dist/components/MandateVerifier.stories.d.ts +14 -0
- package/dist/components/MandateVerifier.stories.d.ts.map +1 -0
- package/dist/components/MandateVerifier.stories.js +41 -0
- package/dist/components/MandateVerifier.stories.js.map +1 -0
- package/dist/components/MandateViewer.d.ts +13 -0
- package/dist/components/MandateViewer.d.ts.map +1 -0
- package/dist/components/MandateViewer.js +83 -0
- package/dist/components/MandateViewer.js.map +1 -0
- package/dist/components/MandateViewer.stories.d.ts +14 -0
- package/dist/components/MandateViewer.stories.d.ts.map +1 -0
- package/dist/components/MandateViewer.stories.js +43 -0
- package/dist/components/MandateViewer.stories.js.map +1 -0
- package/dist/components/WidgetConfigDashboard.d.ts +2 -0
- package/dist/components/WidgetConfigDashboard.d.ts.map +1 -0
- package/dist/components/WidgetConfigDashboard.js +365 -0
- package/dist/components/WidgetConfigDashboard.js.map +1 -0
- package/dist/hooks/useMandaitorSDK.d.ts +13 -0
- package/dist/hooks/useMandaitorSDK.d.ts.map +1 -0
- package/dist/hooks/useMandaitorSDK.js +13 -0
- package/dist/hooks/useMandaitorSDK.js.map +1 -0
- package/dist/hooks/useMandate.d.ts +16 -0
- package/dist/hooks/useMandate.d.ts.map +1 -0
- package/dist/hooks/useMandate.js +42 -0
- package/dist/hooks/useMandate.js.map +1 -0
- package/dist/hooks/useMandates.d.ts +20 -0
- package/dist/hooks/useMandates.d.ts.map +1 -0
- package/dist/hooks/useMandates.js +69 -0
- package/dist/hooks/useMandates.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/package.json +74 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 Mandaitor
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# @mandaitor/react
|
|
2
|
+
|
|
3
|
+
React UI components and hooks for integrating Mandaitor delegation management into your application.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @mandaitor/react @mandaitor/sdk
|
|
11
|
+
# or
|
|
12
|
+
pnpm add @mandaitor/react @mandaitor/sdk
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Quick Start
|
|
16
|
+
|
|
17
|
+
Wrap your application with `MandaitorProvider` and use the pre-built components:
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { MandaitorProvider, MandateCreator, MandateViewer } from "@mandaitor/react";
|
|
21
|
+
|
|
22
|
+
function App() {
|
|
23
|
+
return (
|
|
24
|
+
<MandaitorProvider
|
|
25
|
+
apiKey="mk_live_..."
|
|
26
|
+
tenantId="tnt_acme_prod"
|
|
27
|
+
>
|
|
28
|
+
<MandateCreator />
|
|
29
|
+
<MandateViewer mandateId="mnd_abc123" />
|
|
30
|
+
</MandaitorProvider>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Components
|
|
36
|
+
|
|
37
|
+
| Component | Description |
|
|
38
|
+
|-----------|-------------|
|
|
39
|
+
| `MandaitorProvider` | Context provider that initialises the SDK client |
|
|
40
|
+
| `MandateCreator` | Form for creating new delegation mandates |
|
|
41
|
+
| `MandateViewer` | Read-only display of a single mandate with status |
|
|
42
|
+
| `MandateManager` | Full CRUD interface for managing mandates (list, revoke, suspend, reactivate) |
|
|
43
|
+
| `MandateVerifier` | Interactive verification form for testing delegation claims |
|
|
44
|
+
| `APIKeyManager` | API key display and management component |
|
|
45
|
+
| `WidgetConfigDashboard` | Dashboard for configuring the embeddable consent widget |
|
|
46
|
+
|
|
47
|
+
## Hooks
|
|
48
|
+
|
|
49
|
+
| Hook | Description |
|
|
50
|
+
|------|-------------|
|
|
51
|
+
| `useMandaitorSDK()` | Access the SDK client instance from context |
|
|
52
|
+
| `useMandate(id)` | Fetch and cache a single mandate |
|
|
53
|
+
| `useMandates(options?)` | Fetch and cache a paginated list of mandates |
|
|
54
|
+
|
|
55
|
+
## Storybook
|
|
56
|
+
|
|
57
|
+
Component stories are co-located with their components. Run Storybook from the monorepo root:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pnpm storybook
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Development
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Build
|
|
67
|
+
pnpm build
|
|
68
|
+
|
|
69
|
+
# Run unit tests
|
|
70
|
+
pnpm test:unit
|
|
71
|
+
|
|
72
|
+
# Run integration tests
|
|
73
|
+
pnpm test:integration
|
|
74
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"APIKeyManager.d.ts","sourceRoot":"","sources":["../../src/components/APIKeyManager.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,2CAiL/D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from "react";
|
|
3
|
+
export function ApiKeyManager({ tenantId }) {
|
|
4
|
+
const [keys, setKeys] = useState([]);
|
|
5
|
+
const [newKey, setNewKey] = useState(null);
|
|
6
|
+
const [creating, setCreating] = useState(false);
|
|
7
|
+
const [keyName, setKeyName] = useState("");
|
|
8
|
+
const [keyEnv, setKeyEnv] = useState("test");
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
fetchKeys();
|
|
11
|
+
}, []);
|
|
12
|
+
async function fetchKeys() {
|
|
13
|
+
const res = await fetch("/v1/tenant/api-keys", {
|
|
14
|
+
headers: { Authorization: `Bearer ${getToken()}` },
|
|
15
|
+
});
|
|
16
|
+
const data = (await res.json());
|
|
17
|
+
setKeys(data.keys || []);
|
|
18
|
+
}
|
|
19
|
+
async function createKey() {
|
|
20
|
+
setCreating(true);
|
|
21
|
+
try {
|
|
22
|
+
const res = await fetch("/v1/tenant/api-keys", {
|
|
23
|
+
method: "POST",
|
|
24
|
+
headers: {
|
|
25
|
+
"Content-Type": "application/json",
|
|
26
|
+
Authorization: `Bearer ${getToken()}`,
|
|
27
|
+
},
|
|
28
|
+
body: JSON.stringify({ name: keyName || "default", environment: keyEnv }),
|
|
29
|
+
});
|
|
30
|
+
const data = await res.json();
|
|
31
|
+
setNewKey(data);
|
|
32
|
+
setKeyName("");
|
|
33
|
+
fetchKeys();
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
setCreating(false);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function revokeKey(keyId) {
|
|
40
|
+
if (!confirm("Are you sure? This action cannot be undone."))
|
|
41
|
+
return;
|
|
42
|
+
await fetch(`/v1/tenant/api-keys/${keyId}`, {
|
|
43
|
+
method: "DELETE",
|
|
44
|
+
headers: { Authorization: `Bearer ${getToken()}` },
|
|
45
|
+
});
|
|
46
|
+
fetchKeys();
|
|
47
|
+
}
|
|
48
|
+
return (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("h2", { className: "text-xl font-bold", children: "API Keys" }), _jsxs("span", { className: "text-sm text-muted-foreground", children: ["Tenant: ", tenantId] })] }), _jsxs("div", { className: "p-4 rounded border border-border bg-card", children: [_jsx("h3", { className: "font-semibold mb-3", children: "Generate New Key" }), _jsxs("div", { className: "flex gap-3 items-end", children: [_jsxs("div", { className: "flex-1", children: [_jsx("label", { className: "text-sm text-muted-foreground", children: "Key Name" }), _jsx("input", { value: keyName, onChange: (e) => setKeyName(e.target.value), placeholder: "e.g., production-backend", className: "w-full mt-1 px-3 py-2 rounded border border-border bg-background" })] }), _jsxs("div", { children: [_jsx("label", { className: "text-sm text-muted-foreground", children: "Environment" }), _jsxs("select", { value: keyEnv, onChange: (e) => setKeyEnv(e.target.value), className: "w-full mt-1 px-3 py-2 rounded border border-border bg-background", children: [_jsx("option", { value: "test", children: "Test" }), _jsx("option", { value: "live", children: "Live" })] })] }), _jsx("button", { onClick: createKey, disabled: creating, className: "px-4 py-2 rounded font-semibold text-sm", style: { background: "#F5A623", color: "#0A1628" }, children: creating ? "Generating..." : "Generate Key" })] })] }), newKey && (_jsxs("div", { className: "p-4 rounded border-2 border-amber-500 bg-amber-500/5", children: [_jsx("div", { className: "flex items-center gap-2 mb-2", children: _jsx("span", { className: "font-bold text-amber-400", children: "New API Key Created" }) }), _jsx("p", { className: "text-sm text-red-400 font-semibold mb-2", children: "Copy this key now. It will not be shown again." }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("code", { className: "flex-1 p-3 rounded bg-background font-mono text-sm break-all", children: newKey.api_key }), _jsx("button", { onClick: () => navigator.clipboard.writeText(newKey.api_key), className: "px-3 py-2 rounded border border-border text-sm", children: "Copy" })] }), _jsx("button", { onClick: () => setNewKey(null), className: "mt-3 text-sm text-muted-foreground underline", children: "I have saved my key" })] })), _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-border", children: [_jsx("th", { className: "text-left py-2 px-3", children: "Name" }), _jsx("th", { className: "text-left py-2 px-3", children: "Key" }), _jsx("th", { className: "text-left py-2 px-3", children: "Environment" }), _jsx("th", { className: "text-left py-2 px-3", children: "Status" }), _jsx("th", { className: "text-left py-2 px-3", children: "Created" }), _jsx("th", { className: "text-left py-2 px-3", children: "Actions" })] }) }), _jsx("tbody", { children: keys.map((key) => (_jsxs("tr", { className: "border-b border-border/50", children: [_jsx("td", { className: "py-2 px-3", children: key.name }), _jsxs("td", { className: "py-2 px-3 font-mono", children: ["****", key.last_four] }), _jsx("td", { className: "py-2 px-3", children: _jsx("span", { className: `px-2 py-0.5 rounded text-xs ${key.environment === "live"
|
|
49
|
+
? "bg-green-500/10 text-green-400"
|
|
50
|
+
: "bg-blue-500/10 text-blue-400"}`, children: key.environment }) }), _jsx("td", { className: "py-2 px-3", children: _jsx("span", { className: `px-2 py-0.5 rounded text-xs ${key.status === "ACTIVE"
|
|
51
|
+
? "bg-green-500/10 text-green-400"
|
|
52
|
+
: "bg-red-500/10 text-red-400"}`, children: key.status }) }), _jsx("td", { className: "py-2 px-3 text-muted-foreground", children: new Date(key.created_at).toLocaleDateString() }), _jsx("td", { className: "py-2 px-3", children: key.status === "ACTIVE" && (_jsx("button", { onClick: () => revokeKey(key.key_id), className: "text-red-400 text-xs underline", children: "Revoke" })) })] }, key.key_id))) })] })] }));
|
|
53
|
+
}
|
|
54
|
+
function getToken() {
|
|
55
|
+
// In production: retrieve from Cognito session
|
|
56
|
+
return localStorage.getItem("mandata_token") || "";
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=APIKeyManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"APIKeyManager.js","sourceRoot":"","sources":["../../src/components/APIKeyManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { MandaitorClient } from "@mandaitor/sdk";
|
|
3
|
+
import { MandaitorConfigClient } from "@mandaitor/sdk";
|
|
4
|
+
export interface MandaitorContextValue {
|
|
5
|
+
client: MandaitorClient;
|
|
6
|
+
configClient: MandaitorConfigClient;
|
|
7
|
+
tenantId: string;
|
|
8
|
+
theme: MandaitorTheme;
|
|
9
|
+
}
|
|
10
|
+
export interface MandaitorTheme {
|
|
11
|
+
primaryColor: string;
|
|
12
|
+
fontFamily: string;
|
|
13
|
+
borderRadius: string;
|
|
14
|
+
mode: "light" | "dark";
|
|
15
|
+
}
|
|
16
|
+
export declare function useMandaitorContext(): MandaitorContextValue;
|
|
17
|
+
export interface MandaitorProviderProps {
|
|
18
|
+
tenantId: string;
|
|
19
|
+
apiUrl?: string;
|
|
20
|
+
apiKey?: string;
|
|
21
|
+
configAuthToken?: string;
|
|
22
|
+
auth?: {
|
|
23
|
+
type: "oidc" | "api_key";
|
|
24
|
+
issuer?: string;
|
|
25
|
+
clientId?: string;
|
|
26
|
+
};
|
|
27
|
+
theme?: Partial<MandaitorTheme>;
|
|
28
|
+
children: React.ReactNode;
|
|
29
|
+
}
|
|
30
|
+
export declare function MandaitorProvider({ tenantId, apiUrl, apiKey, configAuthToken, theme: themeOverrides, children, }: MandaitorProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
//# sourceMappingURL=MandaitorProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandaitorProvider.d.ts","sourceRoot":"","sources":["../../src/components/MandaitorProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,EAAE,qBAAqB,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;CACxB;AAID,wBAAgB,mBAAmB,0BAIlC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,eAAe,EACf,KAAK,EAAE,cAAc,EACrB,QAAQ,GACT,EAAE,sBAAsB,2CA+BxB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useMemo } from "react";
|
|
3
|
+
import { MandaitorClient } from "@mandaitor/sdk";
|
|
4
|
+
import { MandaitorConfigClient } from "@mandaitor/sdk";
|
|
5
|
+
const MandataContext = createContext(null);
|
|
6
|
+
export function useMandaitorContext() {
|
|
7
|
+
const ctx = useContext(MandataContext);
|
|
8
|
+
if (!ctx)
|
|
9
|
+
throw new Error("useMandaitorContext must be used within MandaitorProvider");
|
|
10
|
+
return ctx;
|
|
11
|
+
}
|
|
12
|
+
export function MandaitorProvider({ tenantId, apiUrl, apiKey, configAuthToken, theme: themeOverrides, children, }) {
|
|
13
|
+
const resolvedBaseUrl = apiUrl || "https://api.mandaitor.io/v1";
|
|
14
|
+
const client = useMemo(() => new MandaitorClient({
|
|
15
|
+
apiKey: apiKey || "",
|
|
16
|
+
tenantId,
|
|
17
|
+
baseUrl: resolvedBaseUrl,
|
|
18
|
+
}), [apiKey, tenantId, resolvedBaseUrl]);
|
|
19
|
+
const configClient = useMemo(() => new MandaitorConfigClient(resolvedBaseUrl, configAuthToken || ""), [resolvedBaseUrl, configAuthToken]);
|
|
20
|
+
const theme = {
|
|
21
|
+
primaryColor: "#F5A623",
|
|
22
|
+
fontFamily: "DM Sans, sans-serif",
|
|
23
|
+
borderRadius: "4px",
|
|
24
|
+
mode: "dark",
|
|
25
|
+
...themeOverrides,
|
|
26
|
+
};
|
|
27
|
+
return (_jsx(MandataContext.Provider, { value: { client, configClient, tenantId, theme }, children: children }));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=MandaitorProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandaitorProvider.js","sourceRoot":"","sources":["../../src/components/MandaitorProvider.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAgBvD,MAAM,cAAc,GAAG,aAAa,CAA+B,IAAI,CAAC,CAAC;AAEzE,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACvF,OAAO,GAAG,CAAC;AACb,CAAC;AAgBD,MAAM,UAAU,iBAAiB,CAAC,EAChC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,eAAe,EACf,KAAK,EAAE,cAAc,EACrB,QAAQ,GACe;IACvB,MAAM,eAAe,GAAG,MAAM,IAAI,6BAA6B,CAAC;IAEhE,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CACH,IAAI,eAAe,CAAC;QAClB,MAAM,EAAE,MAAM,IAAI,EAAE;QACpB,QAAQ;QACR,OAAO,EAAE,eAAe;KACzB,CAAC,EACJ,CAAC,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAC,CACpC,CAAC;IAEF,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,IAAI,qBAAqB,CAAC,eAAe,EAAE,eAAe,IAAI,EAAE,CAAC,EACvE,CAAC,eAAe,EAAE,eAAe,CAAC,CACnC,CAAC;IAEF,MAAM,KAAK,GAAmB;QAC5B,YAAY,EAAE,SAAS;QACvB,UAAU,EAAE,qBAAqB;QACjC,YAAY,EAAE,KAAK;QACnB,IAAI,EAAE,MAAM;QACZ,GAAG,cAAc;KAClB,CAAC;IAEF,OAAO,CACL,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,YACtE,QAAQ,GACe,CAC3B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { MandaitorProvider } from "./MandaitorProvider";
|
|
3
|
+
declare const meta: Meta<typeof MandaitorProvider>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof MandaitorProvider>;
|
|
6
|
+
/** Dark mode (default) */
|
|
7
|
+
export declare const DarkMode: Story;
|
|
8
|
+
/** Light mode */
|
|
9
|
+
export declare const LightMode: Story;
|
|
10
|
+
/** Custom branding */
|
|
11
|
+
export declare const CustomBranding: Story;
|
|
12
|
+
//# sourceMappingURL=MandaitorProvider.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandaitorProvider.stories.d.ts","sourceRoot":"","sources":["../../src/components/MandaitorProvider.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAuB,MAAM,qBAAqB,CAAC;AAmD7E,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,iBAAiB,CAMxC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEhD,0BAA0B;AAC1B,eAAO,MAAM,QAAQ,EAAE,KAWtB,CAAC;AAEF,iBAAiB;AACjB,eAAO,MAAM,SAAS,EAAE,KAavB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,cAAc,EAAE,KAgB5B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { MandaitorProvider, useMandaitorContext } from "./MandaitorProvider";
|
|
3
|
+
/** Helper component to display the provider context values */
|
|
4
|
+
function ContextDisplay() {
|
|
5
|
+
const { tenantId, theme } = useMandaitorContext();
|
|
6
|
+
return (_jsxs("div", { style: { fontFamily: theme.fontFamily }, children: [_jsx("h3", { style: { color: theme.primaryColor, marginBottom: 12 }, children: "MandaitorProvider Context" }), _jsx("table", { style: { fontSize: 13, borderCollapse: "collapse" }, children: _jsxs("tbody", { children: [_jsxs("tr", { children: [_jsx("td", { style: { padding: "4px 12px", opacity: 0.6 }, children: "Tenant ID" }), _jsx("td", { style: { padding: "4px 12px" }, children: _jsx("code", { children: tenantId }) })] }), _jsxs("tr", { children: [_jsx("td", { style: { padding: "4px 12px", opacity: 0.6 }, children: "Primary Color" }), _jsxs("td", { style: { padding: "4px 12px" }, children: [_jsx("span", { style: {
|
|
7
|
+
display: "inline-block",
|
|
8
|
+
width: 16,
|
|
9
|
+
height: 16,
|
|
10
|
+
background: theme.primaryColor,
|
|
11
|
+
borderRadius: 3,
|
|
12
|
+
verticalAlign: "middle",
|
|
13
|
+
marginRight: 8,
|
|
14
|
+
} }), theme.primaryColor] })] }), _jsxs("tr", { children: [_jsx("td", { style: { padding: "4px 12px", opacity: 0.6 }, children: "Font Family" }), _jsx("td", { style: { padding: "4px 12px" }, children: theme.fontFamily })] }), _jsxs("tr", { children: [_jsx("td", { style: { padding: "4px 12px", opacity: 0.6 }, children: "Border Radius" }), _jsx("td", { style: { padding: "4px 12px" }, children: theme.borderRadius })] }), _jsxs("tr", { children: [_jsx("td", { style: { padding: "4px 12px", opacity: 0.6 }, children: "Mode" }), _jsx("td", { style: { padding: "4px 12px" }, children: theme.mode })] })] }) })] }));
|
|
15
|
+
}
|
|
16
|
+
const meta = {
|
|
17
|
+
title: "Core/MandaitorProvider",
|
|
18
|
+
component: MandaitorProvider,
|
|
19
|
+
tags: ["autodocs"],
|
|
20
|
+
// Override the default decorator to avoid double-wrapping
|
|
21
|
+
decorators: [],
|
|
22
|
+
};
|
|
23
|
+
export default meta;
|
|
24
|
+
/** Dark mode (default) */
|
|
25
|
+
export const DarkMode = {
|
|
26
|
+
render: () => (_jsx(MandaitorProvider, { tenantId: "tnt_demo_dark", apiUrl: "https://mock.mandaitor.io/v1", apiKey: "mock_key", theme: { mode: "dark" }, children: _jsx(ContextDisplay, {}) })),
|
|
27
|
+
};
|
|
28
|
+
/** Light mode */
|
|
29
|
+
export const LightMode = {
|
|
30
|
+
render: () => (_jsx(MandaitorProvider, { tenantId: "tnt_demo_light", apiUrl: "https://mock.mandaitor.io/v1", apiKey: "mock_key", theme: { mode: "light", primaryColor: "#2563eb" }, children: _jsx("div", { style: { background: "#f8fafc", padding: 24, borderRadius: 8 }, children: _jsx(ContextDisplay, {}) }) })),
|
|
31
|
+
};
|
|
32
|
+
/** Custom branding */
|
|
33
|
+
export const CustomBranding = {
|
|
34
|
+
render: () => (_jsx(MandaitorProvider, { tenantId: "tnt_custom", apiUrl: "https://mock.mandaitor.io/v1", apiKey: "mock_key", theme: {
|
|
35
|
+
primaryColor: "#8b5cf6",
|
|
36
|
+
fontFamily: "Inter, sans-serif",
|
|
37
|
+
borderRadius: "12px",
|
|
38
|
+
mode: "dark",
|
|
39
|
+
}, children: _jsx(ContextDisplay, {}) })),
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=MandaitorProvider.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandaitorProvider.stories.js","sourceRoot":"","sources":["../../src/components/MandaitorProvider.stories.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,8DAA8D;AAC9D,SAAS,cAAc;IACrB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAClD,OAAO,CACL,eAAK,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,aAC1C,aAAI,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,EAAE,0CAAgC,EAC1F,gBAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,YACxD,4BACE,yBACE,aAAI,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,0BAAgB,EAChE,aAAI,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,YAChC,yBAAO,QAAQ,GAAQ,GACpB,IACF,EACL,yBACE,aAAI,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,8BAAoB,EACpE,cAAI,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,aAChC,eACE,KAAK,EAAE;gDACL,OAAO,EAAE,cAAc;gDACvB,KAAK,EAAE,EAAE;gDACT,MAAM,EAAE,EAAE;gDACV,UAAU,EAAE,KAAK,CAAC,YAAY;gDAC9B,YAAY,EAAE,CAAC;gDACf,aAAa,EAAE,QAAQ;gDACvB,WAAW,EAAE,CAAC;6CACf,GACD,EACD,KAAK,CAAC,YAAY,IAChB,IACF,EACL,yBACE,aAAI,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,4BAAkB,EAClE,aAAI,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,YAAG,KAAK,CAAC,UAAU,GAAM,IACxD,EACL,yBACE,aAAI,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,8BAAoB,EACpE,aAAI,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,YAAG,KAAK,CAAC,YAAY,GAAM,IAC1D,EACL,yBACE,aAAI,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,qBAAW,EAC3D,aAAI,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,YAAG,KAAK,CAAC,IAAI,GAAM,IAClD,IACC,GACF,IACJ,CACP,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAmC;IAC3C,KAAK,EAAE,wBAAwB;IAC/B,SAAS,EAAE,iBAAiB;IAC5B,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,0DAA0D;IAC1D,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,eAAe,IAAI,CAAC;AAGpB,0BAA0B;AAC1B,MAAM,CAAC,MAAM,QAAQ,GAAU;IAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,CACZ,KAAC,iBAAiB,IAChB,QAAQ,EAAC,eAAe,EACxB,MAAM,EAAC,8BAA8B,EACrC,MAAM,EAAC,UAAU,EACjB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAEvB,KAAC,cAAc,KAAG,GACA,CACrB;CACF,CAAC;AAEF,iBAAiB;AACjB,MAAM,CAAC,MAAM,SAAS,GAAU;IAC9B,MAAM,EAAE,GAAG,EAAE,CAAC,CACZ,KAAC,iBAAiB,IAChB,QAAQ,EAAC,gBAAgB,EACzB,MAAM,EAAC,8BAA8B,EACrC,MAAM,EAAC,UAAU,EACjB,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAEjD,cAAK,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,YACjE,KAAC,cAAc,KAAG,GACd,GACY,CACrB;CACF,CAAC;AAEF,sBAAsB;AACtB,MAAM,CAAC,MAAM,cAAc,GAAU;IACnC,MAAM,EAAE,GAAG,EAAE,CAAC,CACZ,KAAC,iBAAiB,IAChB,QAAQ,EAAC,YAAY,EACrB,MAAM,EAAC,8BAA8B,EACrC,MAAM,EAAC,UAAU,EACjB,KAAK,EAAE;YACL,YAAY,EAAE,SAAS;YACvB,UAAU,EAAE,mBAAmB;YAC/B,YAAY,EAAE,MAAM;YACpB,IAAI,EAAE,MAAM;SACb,YAED,KAAC,cAAc,KAAG,GACA,CACrB;CACF,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Subject, Mandate } from "@mandaitor/sdk";
|
|
2
|
+
export interface ActionOption {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface MandateCreatorProps {
|
|
8
|
+
defaultDelegate?: Subject;
|
|
9
|
+
defaultResources?: string[];
|
|
10
|
+
availableActions: ActionOption[];
|
|
11
|
+
onMandateCreated?: (mandate: Mandate) => void;
|
|
12
|
+
onError?: (error: Error) => void;
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function MandateCreator({ defaultDelegate, defaultResources, availableActions, onMandateCreated, onError, className, }: MandateCreatorProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=MandateCreator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateCreator.d.ts","sourceRoot":"","sources":["../../src/components/MandateCreator.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,EAAE,YAAY,EAAE,CAAC;IACjC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAC7B,eAAe,EACf,gBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EACP,SAAS,GACV,EAAE,mBAAmB,2CAyFrB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useCallback } from "react";
|
|
3
|
+
import { useMandaitorContext } from "./MandaitorProvider";
|
|
4
|
+
export function MandateCreator({ defaultDelegate, defaultResources = [], availableActions, onMandateCreated, onError, className, }) {
|
|
5
|
+
const { client, theme } = useMandaitorContext();
|
|
6
|
+
const [selectedActions, setSelectedActions] = useState([]);
|
|
7
|
+
const [expiresAt, setExpiresAt] = useState("");
|
|
8
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
9
|
+
const handleSubmit = useCallback(async () => {
|
|
10
|
+
if (selectedActions.length === 0)
|
|
11
|
+
return;
|
|
12
|
+
setIsSubmitting(true);
|
|
13
|
+
try {
|
|
14
|
+
const mandate = await client.createMandate({
|
|
15
|
+
principal: {
|
|
16
|
+
type: "NATURAL_PERSON",
|
|
17
|
+
subject_id: "current_user", // Resolved from auth context
|
|
18
|
+
},
|
|
19
|
+
delegate: defaultDelegate || {
|
|
20
|
+
type: "AGENT",
|
|
21
|
+
subject_id: "agent:default",
|
|
22
|
+
},
|
|
23
|
+
scope: {
|
|
24
|
+
actions: selectedActions,
|
|
25
|
+
resources: defaultResources,
|
|
26
|
+
effect: "ALLOW",
|
|
27
|
+
},
|
|
28
|
+
constraints: {
|
|
29
|
+
time: expiresAt ? { expires_at: expiresAt } : undefined,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
onMandateCreated?.(mandate);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
onError?.(err instanceof Error ? err : new Error(String(err)));
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
setIsSubmitting(false);
|
|
39
|
+
}
|
|
40
|
+
}, [client, selectedActions, defaultDelegate, defaultResources, expiresAt]);
|
|
41
|
+
// Render a form with action checkboxes, expiry date picker, and submit button
|
|
42
|
+
// Styled according to the theme from MandaitorProvider
|
|
43
|
+
return (_jsxs("div", { className: className, style: {
|
|
44
|
+
fontFamily: theme.fontFamily,
|
|
45
|
+
borderRadius: theme.borderRadius,
|
|
46
|
+
}, children: [_jsx("div", { style: { color: theme.primaryColor, fontWeight: 600, marginBottom: 12 }, children: "Create Delegation Mandate" }), availableActions.map((action) => (_jsxs("label", { style: { display: "block", marginBottom: 8 }, children: [_jsx("input", { type: "checkbox", checked: selectedActions.includes(action.id), onChange: (e) => {
|
|
47
|
+
const isChecked = e.target?.checked ?? false;
|
|
48
|
+
setSelectedActions((prev) => isChecked ? [...prev, action.id] : prev.filter((a) => a !== action.id));
|
|
49
|
+
} }), _jsx("span", { style: { marginLeft: 8 }, children: action.label })] }, action.id))), _jsx("input", { type: "datetime-local", value: expiresAt, onChange: (e) => setExpiresAt(e.target.value), placeholder: "Expiry date (optional)", style: { display: "block", marginTop: 12, marginBottom: 12 } }), _jsx("button", { onClick: handleSubmit, disabled: isSubmitting || selectedActions.length === 0, style: {
|
|
50
|
+
background: theme.primaryColor,
|
|
51
|
+
color: "#0A1628",
|
|
52
|
+
padding: "8px 16px",
|
|
53
|
+
borderRadius: theme.borderRadius,
|
|
54
|
+
fontWeight: 600,
|
|
55
|
+
opacity: isSubmitting ? 0.6 : 1,
|
|
56
|
+
}, children: isSubmitting ? "Creating..." : "Create Mandate" })] }));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=MandateCreator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateCreator.js","sourceRoot":"","sources":["../../src/components/MandateCreator.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { MandateCreator } from "./MandateCreator";
|
|
3
|
+
declare const meta: Meta<typeof MandateCreator>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof MandateCreator>;
|
|
6
|
+
/** Default state with available actions */
|
|
7
|
+
export declare const Default: Story;
|
|
8
|
+
/** With only two actions available */
|
|
9
|
+
export declare const LimitedActions: Story;
|
|
10
|
+
/** With a single action (minimal) */
|
|
11
|
+
export declare const SingleAction: Story;
|
|
12
|
+
/** No delegate pre-set (uses default) */
|
|
13
|
+
export declare const NoDefaultDelegate: Story;
|
|
14
|
+
//# sourceMappingURL=MandateCreator.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateCreator.stories.d.ts","sourceRoot":"","sources":["../../src/components/MandateCreator.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA0BlD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAQrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,cAAc,CAAC,CAAC;AAE7C,2CAA2C;AAC3C,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,sCAAsC;AACtC,eAAO,MAAM,cAAc,EAAE,KAU5B,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,YAAY,EAAE,KAK1B,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,iBAAiB,EAAE,KAK/B,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { MandateCreator } from "./MandateCreator";
|
|
2
|
+
const sampleActions = [
|
|
3
|
+
{
|
|
4
|
+
id: "construction.validation.approve",
|
|
5
|
+
label: "Approve Validation",
|
|
6
|
+
description: "Approve construction validation results",
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
id: "construction.validation.reject",
|
|
10
|
+
label: "Reject Validation",
|
|
11
|
+
description: "Reject construction validation results",
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
id: "construction.cost.approve_invoice",
|
|
15
|
+
label: "Approve Invoice",
|
|
16
|
+
description: "Approve cost invoices up to a specified limit",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
id: "construction.procurement.order",
|
|
20
|
+
label: "Place Order",
|
|
21
|
+
description: "Place procurement orders for materials",
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
const meta = {
|
|
25
|
+
title: "Widgets/MandateCreator",
|
|
26
|
+
component: MandateCreator,
|
|
27
|
+
tags: ["autodocs"],
|
|
28
|
+
argTypes: {
|
|
29
|
+
onMandateCreated: { action: "mandateCreated" },
|
|
30
|
+
onError: { action: "error" },
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
export default meta;
|
|
34
|
+
/** Default state with available actions */
|
|
35
|
+
export const Default = {
|
|
36
|
+
args: {
|
|
37
|
+
availableActions: sampleActions,
|
|
38
|
+
defaultDelegate: {
|
|
39
|
+
type: "AGENT",
|
|
40
|
+
subject_id: "monco:agent:validation-bot-v2",
|
|
41
|
+
display_name: "Validation Bot v2",
|
|
42
|
+
},
|
|
43
|
+
defaultResources: ["monco:project:*/zone:*/installation:*"],
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
/** With only two actions available */
|
|
47
|
+
export const LimitedActions = {
|
|
48
|
+
args: {
|
|
49
|
+
availableActions: sampleActions.slice(0, 2),
|
|
50
|
+
defaultDelegate: {
|
|
51
|
+
type: "AGENT",
|
|
52
|
+
subject_id: "monco:agent:simple-bot",
|
|
53
|
+
display_name: "Simple Bot",
|
|
54
|
+
},
|
|
55
|
+
defaultResources: ["monco:project:proj_001/*"],
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
/** With a single action (minimal) */
|
|
59
|
+
export const SingleAction = {
|
|
60
|
+
args: {
|
|
61
|
+
availableActions: [sampleActions[0]],
|
|
62
|
+
defaultResources: ["monco:project:proj_001/zone:a/installation:001"],
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
/** No delegate pre-set (uses default) */
|
|
66
|
+
export const NoDefaultDelegate = {
|
|
67
|
+
args: {
|
|
68
|
+
availableActions: sampleActions,
|
|
69
|
+
defaultResources: ["monco:project:*"],
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=MandateCreator.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateCreator.stories.js","sourceRoot":"","sources":["../../src/components/MandateCreator.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,MAAM,aAAa,GAAmB;IACpC;QACE,EAAE,EAAE,iCAAiC;QACrC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,yCAAyC;KACvD;IACD;QACE,EAAE,EAAE,gCAAgC;QACpC,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,wCAAwC;KACtD;IACD;QACE,EAAE,EAAE,mCAAmC;QACvC,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,+CAA+C;KAC7D;IACD;QACE,EAAE,EAAE,gCAAgC;QACpC,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,wCAAwC;KACtD;CACF,CAAC;AAEF,MAAM,IAAI,GAAgC;IACxC,KAAK,EAAE,wBAAwB;IAC/B,SAAS,EAAE,cAAc;IACzB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,QAAQ,EAAE;QACR,gBAAgB,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE;QAC9C,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;KAC7B;CACF,CAAC;AAEF,eAAe,IAAI,CAAC;AAGpB,2CAA2C;AAC3C,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE;QACJ,gBAAgB,EAAE,aAAa;QAC/B,eAAe,EAAE;YACf,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,+BAA+B;YAC3C,YAAY,EAAE,mBAAmB;SAClC;QACD,gBAAgB,EAAE,CAAC,uCAAuC,CAAC;KAC5D;CACF,CAAC;AAEF,sCAAsC;AACtC,MAAM,CAAC,MAAM,cAAc,GAAU;IACnC,IAAI,EAAE;QACJ,gBAAgB,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3C,eAAe,EAAE;YACf,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,wBAAwB;YACpC,YAAY,EAAE,YAAY;SAC3B;QACD,gBAAgB,EAAE,CAAC,0BAA0B,CAAC;KAC/C;CACF,CAAC;AAEF,qCAAqC;AACrC,MAAM,CAAC,MAAM,YAAY,GAAU;IACjC,IAAI,EAAE;QACJ,gBAAgB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,gBAAgB,EAAE,CAAC,gDAAgD,CAAC;KACrE;CACF,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,iBAAiB,GAAU;IACtC,IAAI,EAAE;QACJ,gBAAgB,EAAE,aAAa;QAC/B,gBAAgB,EAAE,CAAC,iBAAiB,CAAC;KACtC;CACF,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Mandate, MandateStatus } from "@mandaitor/sdk";
|
|
2
|
+
export interface MandateManagerProps {
|
|
3
|
+
/** Filter mandates by status, resource, or delegate */
|
|
4
|
+
filter?: {
|
|
5
|
+
status?: MandateStatus[];
|
|
6
|
+
resources?: string[];
|
|
7
|
+
delegate_id?: string;
|
|
8
|
+
};
|
|
9
|
+
/** Allow revoking mandates */
|
|
10
|
+
allowRevoke?: boolean;
|
|
11
|
+
/** Allow suspending mandates */
|
|
12
|
+
allowSuspend?: boolean;
|
|
13
|
+
/** Allow reactivating suspended mandates */
|
|
14
|
+
allowReactivate?: boolean;
|
|
15
|
+
/** Callback when a mandate is selected */
|
|
16
|
+
onMandateSelect?: (mandate: Mandate) => void;
|
|
17
|
+
/** Callback after any status change */
|
|
18
|
+
onStatusChange?: (mandate: Mandate, newStatus: MandateStatus) => void;
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function MandateManager({ filter, allowRevoke, allowSuspend, allowReactivate, onMandateSelect, onStatusChange, className, }: MandateManagerProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=MandateManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateManager.d.ts","sourceRoot":"","sources":["../../src/components/MandateManager.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,uDAAuD;IACvD,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,8BAA8B;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4CAA4C;IAC5C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0CAA0C;IAC1C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,uCAAuC;IACvC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,KAAK,IAAI,CAAC;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,WAAkB,EAClB,YAAmB,EACnB,eAAsB,EACtB,eAAe,EACf,cAAc,EACd,SAAS,GACV,EAAE,mBAAmB,2CAoOrB"}
|