@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
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useCallback } from "react";
|
|
3
|
+
import { useMandaitorContext } from "./MandaitorProvider";
|
|
4
|
+
import { useMandates } from "../hooks/useMandates";
|
|
5
|
+
export function MandateManager({ filter, allowRevoke = true, allowSuspend = true, allowReactivate = true, onMandateSelect, onStatusChange, className, }) {
|
|
6
|
+
const { client, theme } = useMandaitorContext();
|
|
7
|
+
const { mandates, isLoading, error, hasMore, loadMore, refetch } = useMandates({
|
|
8
|
+
status: filter?.status?.join(","),
|
|
9
|
+
limit: 20,
|
|
10
|
+
});
|
|
11
|
+
const [actionLoading, setActionLoading] = useState(null);
|
|
12
|
+
const handleAction = useCallback(async (mandateId, action) => {
|
|
13
|
+
setActionLoading(mandateId);
|
|
14
|
+
try {
|
|
15
|
+
let updated;
|
|
16
|
+
switch (action) {
|
|
17
|
+
case "revoke":
|
|
18
|
+
updated = await client.revokeMandate(mandateId, "Revoked via dashboard");
|
|
19
|
+
break;
|
|
20
|
+
case "suspend":
|
|
21
|
+
updated = await client.suspendMandate(mandateId, "Suspended via dashboard");
|
|
22
|
+
break;
|
|
23
|
+
case "reactivate":
|
|
24
|
+
updated = await client.reactivateMandate(mandateId);
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
onStatusChange?.(updated, updated.status);
|
|
28
|
+
refetch();
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.error(`Failed to ${action} mandate:`, err);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
setActionLoading(null);
|
|
35
|
+
}
|
|
36
|
+
}, [client, onStatusChange, refetch]);
|
|
37
|
+
const statusColor = (status) => {
|
|
38
|
+
switch (status) {
|
|
39
|
+
case "ACTIVE":
|
|
40
|
+
return "#22c55e";
|
|
41
|
+
case "SUSPENDED":
|
|
42
|
+
return "#f59e0b";
|
|
43
|
+
case "REVOKED":
|
|
44
|
+
return "#ef4444";
|
|
45
|
+
case "EXPIRED":
|
|
46
|
+
return "#6b7280";
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const cellStyle = {
|
|
50
|
+
padding: "10px 14px",
|
|
51
|
+
fontSize: 13,
|
|
52
|
+
textAlign: "left",
|
|
53
|
+
borderBottom: "1px solid " + (theme.mode === "dark" ? "#1e2d42" : "#e2e8f0"),
|
|
54
|
+
};
|
|
55
|
+
return (_jsxs("div", { className: className, style: { fontFamily: theme.fontFamily }, children: [_jsx("div", { style: { color: theme.primaryColor, fontWeight: 600, fontSize: 16, marginBottom: 12 }, children: "Active Delegations" }), isLoading && !mandates.length && (_jsx("div", { style: { padding: 20, textAlign: "center", opacity: 0.6 }, children: "Loading mandates..." })), error && (_jsx("div", { style: {
|
|
56
|
+
padding: 12,
|
|
57
|
+
background: "#ef444415",
|
|
58
|
+
borderRadius: theme.borderRadius,
|
|
59
|
+
color: "#ef4444",
|
|
60
|
+
fontSize: 13,
|
|
61
|
+
}, children: error })), mandates.length > 0 && (_jsx("div", { style: {
|
|
62
|
+
overflowX: "auto",
|
|
63
|
+
borderRadius: theme.borderRadius,
|
|
64
|
+
border: "1px solid " + (theme.mode === "dark" ? "#1e2d42" : "#e2e8f0"),
|
|
65
|
+
}, children: _jsxs("table", { style: { width: "100%", borderCollapse: "collapse" }, children: [_jsx("thead", { children: _jsxs("tr", { style: { background: theme.mode === "dark" ? "#0f1d30" : "#f8fafc" }, children: [_jsx("th", { style: cellStyle, children: "Mandate ID" }), _jsx("th", { style: cellStyle, children: "Delegate" }), _jsx("th", { style: cellStyle, children: "Actions" }), _jsx("th", { style: cellStyle, children: "Status" }), _jsx("th", { style: cellStyle, children: "Expires" }), _jsx("th", { style: cellStyle, children: "Actions" })] }) }), _jsx("tbody", { children: mandates.map((m) => (_jsxs("tr", { onClick: () => onMandateSelect?.(m), style: { cursor: onMandateSelect ? "pointer" : "default" }, children: [_jsx("td", { style: cellStyle, children: _jsxs("code", { style: { fontSize: 11 }, children: [m.mandate_id.slice(0, 16), "..."] }) }), _jsxs("td", { style: cellStyle, children: [_jsx("div", { style: { fontSize: 12 }, children: m.delegate.display_name || m.delegate.subject_id }), _jsx("div", { style: { fontSize: 10, opacity: 0.5 }, children: m.delegate.type })] }), _jsx("td", { style: cellStyle, children: _jsxs("div", { style: { fontSize: 12 }, children: [m.scope.actions.length, " action(s)"] }) }), _jsx("td", { style: cellStyle, children: _jsx("span", { style: {
|
|
66
|
+
fontSize: 11,
|
|
67
|
+
fontWeight: 600,
|
|
68
|
+
padding: "2px 8px",
|
|
69
|
+
borderRadius: "3px",
|
|
70
|
+
background: statusColor(m.status) + "20",
|
|
71
|
+
color: statusColor(m.status),
|
|
72
|
+
}, children: m.status }) }), _jsx("td", { style: cellStyle, children: _jsx("span", { style: { fontSize: 12 }, children: m.constraints.time?.expires_at
|
|
73
|
+
? new Date(m.constraints.time.expires_at).toLocaleDateString()
|
|
74
|
+
: "—" }) }), _jsxs("td", { style: { ...cellStyle, display: "flex", gap: 6 }, children: [m.status === "ACTIVE" && allowSuspend && (_jsx("button", { onClick: (e) => {
|
|
75
|
+
e.stopPropagation();
|
|
76
|
+
handleAction(m.mandate_id, "suspend");
|
|
77
|
+
}, disabled: actionLoading === m.mandate_id, style: {
|
|
78
|
+
fontSize: 11,
|
|
79
|
+
padding: "4px 8px",
|
|
80
|
+
borderRadius: "3px",
|
|
81
|
+
border: "1px solid #f59e0b40",
|
|
82
|
+
background: "#f59e0b15",
|
|
83
|
+
color: "#f59e0b",
|
|
84
|
+
cursor: "pointer",
|
|
85
|
+
}, children: "Suspend" })), m.status === "ACTIVE" && allowRevoke && (_jsx("button", { onClick: (e) => {
|
|
86
|
+
e.stopPropagation();
|
|
87
|
+
handleAction(m.mandate_id, "revoke");
|
|
88
|
+
}, disabled: actionLoading === m.mandate_id, style: {
|
|
89
|
+
fontSize: 11,
|
|
90
|
+
padding: "4px 8px",
|
|
91
|
+
borderRadius: "3px",
|
|
92
|
+
border: "1px solid #ef444440",
|
|
93
|
+
background: "#ef444415",
|
|
94
|
+
color: "#ef4444",
|
|
95
|
+
cursor: "pointer",
|
|
96
|
+
}, children: "Revoke" })), m.status === "SUSPENDED" && allowReactivate && (_jsx("button", { onClick: (e) => {
|
|
97
|
+
e.stopPropagation();
|
|
98
|
+
handleAction(m.mandate_id, "reactivate");
|
|
99
|
+
}, disabled: actionLoading === m.mandate_id, style: {
|
|
100
|
+
fontSize: 11,
|
|
101
|
+
padding: "4px 8px",
|
|
102
|
+
borderRadius: "3px",
|
|
103
|
+
border: "1px solid #22c55e40",
|
|
104
|
+
background: "#22c55e15",
|
|
105
|
+
color: "#22c55e",
|
|
106
|
+
cursor: "pointer",
|
|
107
|
+
}, children: "Reactivate" }))] })] }, m.mandate_id))) })] }) })), hasMore && (_jsx("button", { onClick: loadMore, disabled: isLoading, style: {
|
|
108
|
+
marginTop: 12,
|
|
109
|
+
padding: "8px 16px",
|
|
110
|
+
fontSize: 13,
|
|
111
|
+
fontWeight: 500,
|
|
112
|
+
borderRadius: theme.borderRadius,
|
|
113
|
+
border: "1px solid " + theme.primaryColor + "40",
|
|
114
|
+
background: "transparent",
|
|
115
|
+
color: theme.primaryColor,
|
|
116
|
+
cursor: "pointer",
|
|
117
|
+
}, children: isLoading ? "Loading..." : "Load More" }))] }));
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=MandateManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateManager.js","sourceRoot":"","sources":["../../src/components/MandateManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { MandateManager } from "./MandateManager";
|
|
3
|
+
declare const meta: Meta<typeof MandateManager>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof MandateManager>;
|
|
6
|
+
/** Default — all actions enabled */
|
|
7
|
+
export declare const Default: Story;
|
|
8
|
+
/** Read-only mode — no action buttons */
|
|
9
|
+
export declare const ReadOnly: Story;
|
|
10
|
+
/** Only revoke allowed */
|
|
11
|
+
export declare const RevokeOnly: Story;
|
|
12
|
+
/** Filtered by ACTIVE status */
|
|
13
|
+
export declare const ActiveOnly: Story;
|
|
14
|
+
//# sourceMappingURL=MandateManager.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateManager.stories.d.ts","sourceRoot":"","sources":["../../src/components/MandateManager.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,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,oCAAoC;AACpC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,UAAU,EAAE,KASxB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { MandateManager } from "./MandateManager";
|
|
2
|
+
const meta = {
|
|
3
|
+
title: "Widgets/MandateManager",
|
|
4
|
+
component: MandateManager,
|
|
5
|
+
tags: ["autodocs"],
|
|
6
|
+
argTypes: {
|
|
7
|
+
onMandateSelect: { action: "mandateSelected" },
|
|
8
|
+
onStatusChange: { action: "statusChanged" },
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
export default meta;
|
|
12
|
+
/** Default — all actions enabled */
|
|
13
|
+
export const Default = {
|
|
14
|
+
args: {
|
|
15
|
+
allowSuspend: true,
|
|
16
|
+
allowRevoke: true,
|
|
17
|
+
allowReactivate: true,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
/** Read-only mode — no action buttons */
|
|
21
|
+
export const ReadOnly = {
|
|
22
|
+
args: {
|
|
23
|
+
allowSuspend: false,
|
|
24
|
+
allowRevoke: false,
|
|
25
|
+
allowReactivate: false,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
/** Only revoke allowed */
|
|
29
|
+
export const RevokeOnly = {
|
|
30
|
+
args: {
|
|
31
|
+
allowSuspend: false,
|
|
32
|
+
allowRevoke: true,
|
|
33
|
+
allowReactivate: false,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
/** Filtered by ACTIVE status */
|
|
37
|
+
export const ActiveOnly = {
|
|
38
|
+
args: {
|
|
39
|
+
filter: {
|
|
40
|
+
status: ["ACTIVE"],
|
|
41
|
+
},
|
|
42
|
+
allowSuspend: true,
|
|
43
|
+
allowRevoke: true,
|
|
44
|
+
allowReactivate: false,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=MandateManager.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateManager.stories.js","sourceRoot":"","sources":["../../src/components/MandateManager.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,IAAI,GAAgC;IACxC,KAAK,EAAE,wBAAwB;IAC/B,SAAS,EAAE,cAAc;IACzB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,QAAQ,EAAE;QACR,eAAe,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE;QAC9C,cAAc,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;KAC5C;CACF,CAAC;AAEF,eAAe,IAAI,CAAC;AAGpB,oCAAoC;AACpC,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE;QACJ,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;QACjB,eAAe,EAAE,IAAI;KACtB;CACF,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,QAAQ,GAAU;IAC7B,IAAI,EAAE;QACJ,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,KAAK;KACvB;CACF,CAAC;AAEF,0BAA0B;AAC1B,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,IAAI,EAAE;QACJ,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,IAAI;QACjB,eAAe,EAAE,KAAK;KACvB;CACF,CAAC;AAEF,gCAAgC;AAChC,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,MAAM,EAAE,CAAC,QAAQ,CAAC;SACnB;QACD,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;QACjB,eAAe,EAAE,KAAK;KACvB;CACF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { VerifyResponse } from "@mandaitor/sdk";
|
|
2
|
+
export interface MandateVerifierProps {
|
|
3
|
+
/** Pre-fill the mandate ID */
|
|
4
|
+
defaultMandateId?: string;
|
|
5
|
+
/** Pre-fill the action to verify */
|
|
6
|
+
defaultAction?: string;
|
|
7
|
+
/** Pre-fill the resource URI */
|
|
8
|
+
defaultResource?: string;
|
|
9
|
+
/** Auto-verify on mount (useful for inline status indicators) */
|
|
10
|
+
autoVerify?: boolean;
|
|
11
|
+
/** Compact mode — shows only the result badge, no form */
|
|
12
|
+
compact?: boolean;
|
|
13
|
+
/** Callback with verification result */
|
|
14
|
+
onResult?: (result: VerifyResponse) => void;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function MandateVerifier({ defaultMandateId, defaultAction, defaultResource, autoVerify, compact, onResult, className, }: MandateVerifierProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=MandateVerifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateVerifier.d.ts","sourceRoot":"","sources":["../../src/components/MandateVerifier.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,8BAA8B;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,gBAAqB,EACrB,aAAkB,EAClB,eAAoB,EACpB,UAAkB,EAClB,OAAe,EACf,QAAQ,EACR,SAAS,GACV,EAAE,oBAAoB,2CAsLtB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState, useCallback } from "react";
|
|
3
|
+
import { useMandaitorContext } from "./MandaitorProvider";
|
|
4
|
+
export function MandateVerifier({ defaultMandateId = "", defaultAction = "", defaultResource = "", autoVerify = false, compact = false, onResult, className, }) {
|
|
5
|
+
const { client, theme } = useMandaitorContext();
|
|
6
|
+
const [mandateId, setMandateId] = useState(defaultMandateId);
|
|
7
|
+
const [action, setAction] = useState(defaultAction);
|
|
8
|
+
const [resource, setResource] = useState(defaultResource);
|
|
9
|
+
const [result, setResult] = useState(null);
|
|
10
|
+
const [isVerifying, setIsVerifying] = useState(false);
|
|
11
|
+
const [error, setError] = useState(null);
|
|
12
|
+
const [latencyMs, setLatencyMs] = useState(null);
|
|
13
|
+
const verify = useCallback(async () => {
|
|
14
|
+
if (!mandateId || !action || !resource)
|
|
15
|
+
return;
|
|
16
|
+
setIsVerifying(true);
|
|
17
|
+
setError(null);
|
|
18
|
+
const start = performance.now();
|
|
19
|
+
try {
|
|
20
|
+
const res = await client.verify({ delegate_subject_id: mandateId, action, resource });
|
|
21
|
+
const elapsed = Math.round(performance.now() - start);
|
|
22
|
+
setLatencyMs(elapsed);
|
|
23
|
+
setResult(res);
|
|
24
|
+
onResult?.(res);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
setError(err instanceof Error ? err.message : "Verification failed");
|
|
28
|
+
setResult(null);
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
setIsVerifying(false);
|
|
32
|
+
}
|
|
33
|
+
}, [client, mandateId, action, resource, onResult]);
|
|
34
|
+
// Auto-verify on mount — intentionally run only once
|
|
35
|
+
React.useEffect(() => {
|
|
36
|
+
if (autoVerify && mandateId && action && resource) {
|
|
37
|
+
verify();
|
|
38
|
+
}
|
|
39
|
+
}, []);
|
|
40
|
+
// Compact mode — just a badge
|
|
41
|
+
if (compact && result) {
|
|
42
|
+
return (_jsxs("span", { className: className, style: {
|
|
43
|
+
display: "inline-flex",
|
|
44
|
+
alignItems: "center",
|
|
45
|
+
gap: 6,
|
|
46
|
+
fontSize: 12,
|
|
47
|
+
fontWeight: 600,
|
|
48
|
+
padding: "3px 10px",
|
|
49
|
+
borderRadius: "4px",
|
|
50
|
+
fontFamily: theme.fontFamily,
|
|
51
|
+
background: result.decision === "ALLOW" ? "#22c55e20" : "#ef444420",
|
|
52
|
+
color: result.decision === "ALLOW" ? "#22c55e" : "#ef4444",
|
|
53
|
+
}, children: [result.decision === "ALLOW" ? "✓ Authorized" : "✗ Denied", latencyMs !== null && _jsxs("span", { style: { opacity: 0.6, fontSize: 10 }, children: ["(", latencyMs, "ms)"] })] }));
|
|
54
|
+
}
|
|
55
|
+
const inputStyle = {
|
|
56
|
+
display: "block",
|
|
57
|
+
width: "100%",
|
|
58
|
+
padding: "8px 12px",
|
|
59
|
+
marginTop: 4,
|
|
60
|
+
marginBottom: 12,
|
|
61
|
+
borderRadius: theme.borderRadius,
|
|
62
|
+
fontSize: 13,
|
|
63
|
+
fontFamily: "monospace",
|
|
64
|
+
border: "1px solid " + (theme.mode === "dark" ? "#2a3a4e" : "#e2e8f0"),
|
|
65
|
+
background: theme.mode === "dark" ? "#0a1628" : "#f8fafc",
|
|
66
|
+
color: theme.mode === "dark" ? "#e2e8f0" : "#1e293b",
|
|
67
|
+
};
|
|
68
|
+
return (_jsxs("div", { className: className, style: {
|
|
69
|
+
fontFamily: theme.fontFamily,
|
|
70
|
+
padding: 20,
|
|
71
|
+
borderRadius: theme.borderRadius,
|
|
72
|
+
border: "1px solid " + (theme.mode === "dark" ? "#2a3a4e" : "#e2e8f0"),
|
|
73
|
+
}, children: [_jsx("div", { style: { color: theme.primaryColor, fontWeight: 600, fontSize: 16, marginBottom: 16 }, children: "Verify Authorization" }), _jsx("label", { style: { fontSize: 12, fontWeight: 500, opacity: 0.7 }, children: "Mandate ID" }), _jsx("input", { value: mandateId, onChange: (e) => setMandateId(e.target.value), placeholder: "mnd_...", style: inputStyle }), _jsx("label", { style: { fontSize: 12, fontWeight: 500, opacity: 0.7 }, children: "Action" }), _jsx("input", { value: action, onChange: (e) => setAction(e.target.value), placeholder: "construction.validation.approve", style: inputStyle }), _jsx("label", { style: { fontSize: 12, fontWeight: 500, opacity: 0.7 }, children: "Resource" }), _jsx("input", { value: resource, onChange: (e) => setResource(e.target.value), placeholder: "monco:project:proj_123/*", style: inputStyle }), _jsx("button", { onClick: verify, disabled: isVerifying || !mandateId || !action || !resource, style: {
|
|
74
|
+
width: "100%",
|
|
75
|
+
padding: "10px 16px",
|
|
76
|
+
fontWeight: 600,
|
|
77
|
+
fontSize: 14,
|
|
78
|
+
borderRadius: theme.borderRadius,
|
|
79
|
+
border: "none",
|
|
80
|
+
cursor: "pointer",
|
|
81
|
+
background: theme.primaryColor,
|
|
82
|
+
color: "#0A1628",
|
|
83
|
+
opacity: isVerifying || !mandateId ? 0.5 : 1,
|
|
84
|
+
}, children: isVerifying ? "Verifying..." : "Verify Now" }), result && (_jsxs("div", { style: {
|
|
85
|
+
marginTop: 16,
|
|
86
|
+
padding: 16,
|
|
87
|
+
borderRadius: theme.borderRadius,
|
|
88
|
+
background: result.decision === "ALLOW" ? "#22c55e10" : "#ef444410",
|
|
89
|
+
border: "1px solid " + (result.decision === "ALLOW" ? "#22c55e30" : "#ef444430"),
|
|
90
|
+
}, children: [_jsx("div", { style: {
|
|
91
|
+
fontSize: 18,
|
|
92
|
+
fontWeight: 700,
|
|
93
|
+
color: result.decision === "ALLOW" ? "#22c55e" : "#ef4444",
|
|
94
|
+
marginBottom: 8,
|
|
95
|
+
}, children: result.decision === "ALLOW" ? "✓ AUTHORIZED" : "✗ DENIED" }), result.decision === "DENY" && result.reason_codes && result.reason_codes.length > 0 && (_jsxs("div", { style: { fontSize: 13, opacity: 0.8 }, children: ["Reason: ", result.reason_codes.join(", ")] })), latencyMs !== null && (_jsxs("div", { style: { fontSize: 12, opacity: 0.5, marginTop: 4 }, children: ["Verified in ", latencyMs, "ms | Event: ", result.event_id] }))] })), error && (_jsx("div", { style: {
|
|
96
|
+
marginTop: 12,
|
|
97
|
+
padding: 12,
|
|
98
|
+
background: "#ef444415",
|
|
99
|
+
borderRadius: theme.borderRadius,
|
|
100
|
+
color: "#ef4444",
|
|
101
|
+
fontSize: 13,
|
|
102
|
+
}, children: error }))] }));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=MandateVerifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateVerifier.js","sourceRoot":"","sources":["../../src/components/MandateVerifier.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { MandateVerifier } from "./MandateVerifier";
|
|
3
|
+
declare const meta: Meta<typeof MandateVerifier>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof MandateVerifier>;
|
|
6
|
+
/** Default empty form */
|
|
7
|
+
export declare const Default: Story;
|
|
8
|
+
/** Pre-filled with mandate ID and action */
|
|
9
|
+
export declare const PreFilled: Story;
|
|
10
|
+
/** Compact mode (badge only — requires a result) */
|
|
11
|
+
export declare const Compact: Story;
|
|
12
|
+
/** Auto-verify on mount */
|
|
13
|
+
export declare const AutoVerify: Story;
|
|
14
|
+
//# sourceMappingURL=MandateVerifier.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateVerifier.stories.d.ts","sourceRoot":"","sources":["../../src/components/MandateVerifier.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,eAAe,CAOtC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9C,yBAAyB;AACzB,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,OAAO,EAAE,KAOrB,CAAC;AAEF,2BAA2B;AAC3B,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { MandateVerifier } from "./MandateVerifier";
|
|
2
|
+
const meta = {
|
|
3
|
+
title: "Widgets/MandateVerifier",
|
|
4
|
+
component: MandateVerifier,
|
|
5
|
+
tags: ["autodocs"],
|
|
6
|
+
argTypes: {
|
|
7
|
+
onResult: { action: "verifyResult" },
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
export default meta;
|
|
11
|
+
/** Default empty form */
|
|
12
|
+
export const Default = {
|
|
13
|
+
args: {},
|
|
14
|
+
};
|
|
15
|
+
/** Pre-filled with mandate ID and action */
|
|
16
|
+
export const PreFilled = {
|
|
17
|
+
args: {
|
|
18
|
+
defaultMandateId: "monco:agent:validation-bot-v2",
|
|
19
|
+
defaultAction: "construction.validation.approve",
|
|
20
|
+
defaultResource: "monco:project:proj_001/zone:a/installation:001",
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
/** Compact mode (badge only — requires a result) */
|
|
24
|
+
export const Compact = {
|
|
25
|
+
args: {
|
|
26
|
+
defaultMandateId: "monco:agent:validation-bot-v2",
|
|
27
|
+
defaultAction: "construction.validation.approve",
|
|
28
|
+
defaultResource: "monco:project:proj_001/zone:a/installation:001",
|
|
29
|
+
compact: true,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
/** Auto-verify on mount */
|
|
33
|
+
export const AutoVerify = {
|
|
34
|
+
args: {
|
|
35
|
+
defaultMandateId: "monco:agent:validation-bot-v2",
|
|
36
|
+
defaultAction: "construction.validation.approve",
|
|
37
|
+
defaultResource: "monco:project:proj_001/zone:a/installation:001",
|
|
38
|
+
autoVerify: true,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=MandateVerifier.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateVerifier.stories.js","sourceRoot":"","sources":["../../src/components/MandateVerifier.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,IAAI,GAAiC;IACzC,KAAK,EAAE,yBAAyB;IAChC,SAAS,EAAE,eAAe;IAC1B,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;KACrC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC;AAGpB,yBAAyB;AACzB,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE,EAAE;CACT,CAAC;AAEF,4CAA4C;AAC5C,MAAM,CAAC,MAAM,SAAS,GAAU;IAC9B,IAAI,EAAE;QACJ,gBAAgB,EAAE,+BAA+B;QACjD,aAAa,EAAE,iCAAiC;QAChD,eAAe,EAAE,gDAAgD;KAClE;CACF,CAAC;AAEF,oDAAoD;AACpD,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE;QACJ,gBAAgB,EAAE,+BAA+B;QACjD,aAAa,EAAE,iCAAiC;QAChD,eAAe,EAAE,gDAAgD;QACjE,OAAO,EAAE,IAAI;KACd;CACF,CAAC;AAEF,2BAA2B;AAC3B,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,IAAI,EAAE;QACJ,gBAAgB,EAAE,+BAA+B;QACjD,aAAa,EAAE,iCAAiC;QAChD,eAAe,EAAE,gDAAgD;QACjE,UAAU,EAAE,IAAI;KACjB;CACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface MandateViewerProps {
|
|
2
|
+
/** Mandate ID to display */
|
|
3
|
+
mandateId: string;
|
|
4
|
+
/** Show the audit event trail */
|
|
5
|
+
showAuditTrail?: boolean;
|
|
6
|
+
/** Show the cryptographic proof details */
|
|
7
|
+
showProof?: boolean;
|
|
8
|
+
/** Callback when back/close is clicked */
|
|
9
|
+
onClose?: () => void;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function MandateViewer({ mandateId, showAuditTrail, showProof, onClose, className, }: MandateViewerProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=MandateViewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateViewer.d.ts","sourceRoot":"","sources":["../../src/components/MandateViewer.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,cAAqB,EACrB,SAAiB,EACjB,OAAO,EACP,SAAS,GACV,EAAE,kBAAkB,2CAyPpB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMandaitorContext } from "./MandaitorProvider";
|
|
3
|
+
import { useMandate } from "../hooks/useMandate";
|
|
4
|
+
export function MandateViewer({ mandateId, showAuditTrail = true, showProof = false, onClose, className, }) {
|
|
5
|
+
const { theme } = useMandaitorContext();
|
|
6
|
+
const { mandate, events, isLoading, error } = useMandate(mandateId, {
|
|
7
|
+
includeEvents: showAuditTrail,
|
|
8
|
+
});
|
|
9
|
+
if (isLoading) {
|
|
10
|
+
return (_jsx("div", { className: className, style: { padding: 40, textAlign: "center", fontFamily: theme.fontFamily }, children: _jsxs("div", { style: { opacity: 0.6 }, children: ["Loading mandate ", mandateId.slice(0, 12), "..."] }) }));
|
|
11
|
+
}
|
|
12
|
+
if (error || !mandate) {
|
|
13
|
+
return (_jsxs("div", { className: className, style: { padding: 20, fontFamily: theme.fontFamily }, children: [_jsx("div", { style: { color: "#ef4444", fontSize: 14 }, children: error || "Mandate not found" }), onClose && (_jsx("button", { onClick: onClose, style: {
|
|
14
|
+
marginTop: 12,
|
|
15
|
+
color: theme.primaryColor,
|
|
16
|
+
cursor: "pointer",
|
|
17
|
+
background: "none",
|
|
18
|
+
border: "none",
|
|
19
|
+
}, children: "\u2190 Back" }))] }));
|
|
20
|
+
}
|
|
21
|
+
const sectionStyle = {
|
|
22
|
+
marginBottom: 20,
|
|
23
|
+
padding: 16,
|
|
24
|
+
borderRadius: theme.borderRadius,
|
|
25
|
+
border: "1px solid " + (theme.mode === "dark" ? "#1e2d42" : "#e2e8f0"),
|
|
26
|
+
background: theme.mode === "dark" ? "#0f1d30" : "#f8fafc",
|
|
27
|
+
};
|
|
28
|
+
const labelStyle = {
|
|
29
|
+
fontSize: 11,
|
|
30
|
+
fontWeight: 600,
|
|
31
|
+
textTransform: "uppercase",
|
|
32
|
+
letterSpacing: "0.05em",
|
|
33
|
+
opacity: 0.5,
|
|
34
|
+
marginBottom: 4,
|
|
35
|
+
};
|
|
36
|
+
const valueStyle = { fontSize: 14, fontWeight: 500 };
|
|
37
|
+
const statusColor = {
|
|
38
|
+
ACTIVE: "#22c55e",
|
|
39
|
+
SUSPENDED: "#f59e0b",
|
|
40
|
+
REVOKED: "#ef4444",
|
|
41
|
+
EXPIRED: "#6b7280",
|
|
42
|
+
}[mandate.status];
|
|
43
|
+
return (_jsxs("div", { className: className, style: { fontFamily: theme.fontFamily }, children: [_jsxs("div", { style: {
|
|
44
|
+
display: "flex",
|
|
45
|
+
justifyContent: "space-between",
|
|
46
|
+
alignItems: "center",
|
|
47
|
+
marginBottom: 20,
|
|
48
|
+
}, children: [_jsxs("div", { children: [_jsx("div", { style: { fontSize: 11, opacity: 0.5 }, children: "MANDATE" }), _jsx("code", { style: { fontSize: 14, color: theme.primaryColor }, children: mandate.mandate_id })] }), _jsx("span", { style: {
|
|
49
|
+
fontSize: 12,
|
|
50
|
+
fontWeight: 600,
|
|
51
|
+
padding: "4px 12px",
|
|
52
|
+
borderRadius: "4px",
|
|
53
|
+
background: statusColor + "20",
|
|
54
|
+
color: statusColor,
|
|
55
|
+
}, children: mandate.status })] }), _jsxs("div", { style: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: 16, marginBottom: 20 }, children: [_jsxs("div", { style: sectionStyle, children: [_jsx("div", { style: labelStyle, children: "Principal (Delegator)" }), _jsx("div", { style: valueStyle, children: mandate.principal.display_name || mandate.principal.subject_id }), _jsx("div", { style: { fontSize: 12, opacity: 0.6 }, children: mandate.principal.type })] }), _jsxs("div", { style: sectionStyle, children: [_jsx("div", { style: labelStyle, children: "Delegate (Receiver)" }), _jsx("div", { style: valueStyle, children: mandate.delegate.display_name || mandate.delegate.subject_id }), _jsx("div", { style: { fontSize: 12, opacity: 0.6 }, children: mandate.delegate.type })] })] }), _jsxs("div", { style: sectionStyle, children: [_jsx("div", { style: labelStyle, children: "Scope" }), _jsx("div", { style: { marginBottom: 8 }, children: _jsx("span", { style: {
|
|
56
|
+
fontSize: 11,
|
|
57
|
+
fontWeight: 600,
|
|
58
|
+
padding: "2px 6px",
|
|
59
|
+
borderRadius: "3px",
|
|
60
|
+
background: mandate.scope.effect === "ALLOW" ? "#22c55e20" : "#ef444420",
|
|
61
|
+
color: mandate.scope.effect === "ALLOW" ? "#22c55e" : "#ef4444",
|
|
62
|
+
}, children: mandate.scope.effect }) }), _jsx("div", { style: { fontSize: 13, fontWeight: 500, marginBottom: 4 }, children: "Actions:" }), _jsx("ul", { style: { margin: 0, paddingLeft: 20 }, children: mandate.scope.actions.map((a) => (_jsx("li", { style: { fontSize: 13 }, children: _jsx("code", { children: a }) }, a))) }), _jsx("div", { style: { fontSize: 13, fontWeight: 500, marginTop: 8, marginBottom: 4 }, children: "Resources:" }), _jsx("ul", { style: { margin: 0, paddingLeft: 20 }, children: mandate.scope.resources.map((r) => (_jsx("li", { style: { fontSize: 13 }, children: _jsx("code", { children: r }) }, r))) })] }), _jsxs("div", { style: sectionStyle, children: [_jsx("div", { style: labelStyle, children: "Constraints" }), mandate.constraints.time && (_jsxs("div", { style: { fontSize: 13, marginBottom: 4 }, children: [_jsx("strong", { children: "Time:" }), " ", mandate.constraints.time.expires_at
|
|
63
|
+
? `Expires ${new Date(mandate.constraints.time.expires_at).toLocaleString()}`
|
|
64
|
+
: mandate.constraints.time.duration || "No time limit"] })), mandate.constraints.require_human_confirmation && (_jsx("div", { style: { fontSize: 13, color: "#f59e0b" }, children: "\u26A0 Human confirmation required per invocation" })), mandate.constraints.rate_limits && (_jsxs("div", { style: { fontSize: 13 }, children: [_jsx("strong", { children: "Rate Limits:" }), " ", JSON.stringify(mandate.constraints.rate_limits)] }))] }), showProof && mandate.proof && (_jsxs("div", { style: sectionStyle, children: [_jsx("div", { style: labelStyle, children: "Cryptographic Proof" }), _jsxs("div", { style: { fontSize: 12 }, children: [_jsxs("div", { children: [_jsx("strong", { children: "Algorithm:" }), " ", mandate.proof.algorithm] }), _jsxs("div", { children: [_jsx("strong", { children: "Key ID:" }), " ", _jsx("code", { style: { fontSize: 11 }, children: mandate.proof.key_id })] }), _jsxs("div", { children: [_jsx("strong", { children: "Signed at:" }), " ", new Date(mandate.proof.signed_at).toLocaleString()] }), _jsxs("div", { style: { marginTop: 8 }, children: [_jsx("strong", { children: "Signature:" }), _jsx("code", { style: {
|
|
65
|
+
display: "block",
|
|
66
|
+
fontSize: 10,
|
|
67
|
+
wordBreak: "break-all",
|
|
68
|
+
marginTop: 4,
|
|
69
|
+
opacity: 0.7,
|
|
70
|
+
}, children: mandate.proof.signature })] })] })] })), showAuditTrail && events && events.length > 0 && (_jsxs("div", { children: [_jsxs("div", { style: labelStyle, children: ["Audit Trail (", events.length, " events)"] }), _jsx("div", { style: {
|
|
71
|
+
borderLeft: "2px solid " + theme.primaryColor + "40",
|
|
72
|
+
paddingLeft: 16,
|
|
73
|
+
marginTop: 8,
|
|
74
|
+
}, children: events.map((evt) => (_jsxs("div", { style: { marginBottom: 12 }, children: [_jsxs("div", { style: { display: "flex", gap: 8, alignItems: "center" }, children: [_jsx("span", { style: { fontSize: 11, fontWeight: 600, color: theme.primaryColor }, children: evt.event_type }), _jsx("span", { style: { fontSize: 11, opacity: 0.5 }, children: new Date(evt.timestamp).toLocaleString() })] }), _jsxs("div", { style: { fontSize: 12, opacity: 0.6 }, children: ["by ", evt.actor.subject_id] })] }, evt.event_id))) })] })), onClose && (_jsx("button", { onClick: onClose, style: {
|
|
75
|
+
marginTop: 16,
|
|
76
|
+
color: theme.primaryColor,
|
|
77
|
+
cursor: "pointer",
|
|
78
|
+
background: "none",
|
|
79
|
+
border: "none",
|
|
80
|
+
fontSize: 14,
|
|
81
|
+
}, children: "\u2190 Back to list" }))] }));
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=MandateViewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateViewer.js","sourceRoot":"","sources":["../../src/components/MandateViewer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { MandateViewer } from "./MandateViewer";
|
|
3
|
+
declare const meta: Meta<typeof MandateViewer>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof MandateViewer>;
|
|
6
|
+
/** Default — loading state (mock API won't respond) */
|
|
7
|
+
export declare const Loading: Story;
|
|
8
|
+
/** With audit trail enabled */
|
|
9
|
+
export declare const WithAuditTrail: Story;
|
|
10
|
+
/** Without audit trail */
|
|
11
|
+
export declare const WithoutAuditTrail: Story;
|
|
12
|
+
/** With proof details */
|
|
13
|
+
export declare const WithProof: Story;
|
|
14
|
+
//# sourceMappingURL=MandateViewer.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateViewer.stories.d.ts","sourceRoot":"","sources":["../../src/components/MandateViewer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAOpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,aAAa,CAAC,CAAC;AAE5C,uDAAuD;AACvD,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,+BAA+B;AAC/B,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAM/B,CAAC;AAEF,yBAAyB;AACzB,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { MandateViewer } from "./MandateViewer";
|
|
2
|
+
const meta = {
|
|
3
|
+
title: "Widgets/MandateViewer",
|
|
4
|
+
component: MandateViewer,
|
|
5
|
+
tags: ["autodocs"],
|
|
6
|
+
argTypes: {
|
|
7
|
+
onClose: { action: "close" },
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
export default meta;
|
|
11
|
+
/** Default — loading state (mock API won't respond) */
|
|
12
|
+
export const Loading = {
|
|
13
|
+
args: {
|
|
14
|
+
mandateId: "mdt_01JEXAMPLE000000000000000",
|
|
15
|
+
showAuditTrail: true,
|
|
16
|
+
showProof: false,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
/** With audit trail enabled */
|
|
20
|
+
export const WithAuditTrail = {
|
|
21
|
+
args: {
|
|
22
|
+
mandateId: "mdt_01JEXAMPLE000000000000000",
|
|
23
|
+
showAuditTrail: true,
|
|
24
|
+
showProof: false,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
/** Without audit trail */
|
|
28
|
+
export const WithoutAuditTrail = {
|
|
29
|
+
args: {
|
|
30
|
+
mandateId: "mdt_01JEXAMPLE000000000000000",
|
|
31
|
+
showAuditTrail: false,
|
|
32
|
+
showProof: false,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
/** With proof details */
|
|
36
|
+
export const WithProof = {
|
|
37
|
+
args: {
|
|
38
|
+
mandateId: "mdt_01JEXAMPLE000000000000000",
|
|
39
|
+
showAuditTrail: true,
|
|
40
|
+
showProof: true,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=MandateViewer.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MandateViewer.stories.js","sourceRoot":"","sources":["../../src/components/MandateViewer.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,IAAI,GAA+B;IACvC,KAAK,EAAE,uBAAuB;IAC9B,SAAS,EAAE,aAAa;IACxB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,QAAQ,EAAE;QACR,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;KAC7B;CACF,CAAC;AAEF,eAAe,IAAI,CAAC;AAGpB,uDAAuD;AACvD,MAAM,CAAC,MAAM,OAAO,GAAU;IAC5B,IAAI,EAAE;QACJ,SAAS,EAAE,+BAA+B;QAC1C,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,KAAK;KACjB;CACF,CAAC;AAEF,+BAA+B;AAC/B,MAAM,CAAC,MAAM,cAAc,GAAU;IACnC,IAAI,EAAE;QACJ,SAAS,EAAE,+BAA+B;QAC1C,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,KAAK;KACjB;CACF,CAAC;AAEF,0BAA0B;AAC1B,MAAM,CAAC,MAAM,iBAAiB,GAAU;IACtC,IAAI,EAAE;QACJ,SAAS,EAAE,+BAA+B;QAC1C,cAAc,EAAE,KAAK;QACrB,SAAS,EAAE,KAAK;KACjB;CACF,CAAC;AAEF,yBAAyB;AACzB,MAAM,CAAC,MAAM,SAAS,GAAU;IAC9B,IAAI,EAAE;QACJ,SAAS,EAAE,+BAA+B;QAC1C,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,IAAI;KAChB;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidgetConfigDashboard.d.ts","sourceRoot":"","sources":["../../src/components/WidgetConfigDashboard.tsx"],"names":[],"mappings":"AAuDA,wBAAgB,qBAAqB,4CA4GpC"}
|