hazo_auth 7.0.2 → 8.0.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/README.md +34 -0
- package/SETUP_CHECKLIST.md +31 -0
- package/cli-src/lib/auth/auth_types.ts +3 -0
- package/cli-src/lib/auth/hazo_get_auth.server.ts +19 -0
- package/cli-src/lib/legal/legal_docs_config.server.ts +61 -0
- package/cli-src/lib/legal/legal_docs_reader.server.ts +36 -0
- package/cli-src/lib/legal/legal_docs_service.ts +196 -0
- package/cli-src/lib/legal/legal_docs_types.ts +31 -0
- package/cli-src/lib/services/registration_service.ts +16 -1
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -0
- package/dist/components/layouts/index.d.ts +1 -0
- package/dist/components/layouts/index.d.ts.map +1 -1
- package/dist/components/layouts/index.js +2 -0
- package/dist/components/layouts/legal/index.d.ts +5 -0
- package/dist/components/layouts/legal/index.d.ts.map +1 -0
- package/dist/components/layouts/legal/index.js +4 -0
- package/dist/components/layouts/legal/legal_acceptance_gate.d.ts +7 -0
- package/dist/components/layouts/legal/legal_acceptance_gate.d.ts.map +1 -0
- package/dist/components/layouts/legal/legal_acceptance_gate.js +84 -0
- package/dist/components/layouts/legal/legal_doc_checkbox_list.d.ts +9 -0
- package/dist/components/layouts/legal/legal_doc_checkbox_list.d.ts.map +1 -0
- package/dist/components/layouts/legal/legal_doc_checkbox_list.js +11 -0
- package/dist/components/layouts/legal/legal_doc_combined_view.d.ts +9 -0
- package/dist/components/layouts/legal/legal_doc_combined_view.d.ts.map +1 -0
- package/dist/components/layouts/legal/legal_doc_combined_view.js +11 -0
- package/dist/components/layouts/legal/legal_doc_drawer.d.ts +8 -0
- package/dist/components/layouts/legal/legal_doc_drawer.d.ts.map +1 -0
- package/dist/components/layouts/legal/legal_doc_drawer.js +55 -0
- package/dist/components/layouts/register/hooks/use_register_form.d.ts +5 -1
- package/dist/components/layouts/register/hooks/use_register_form.d.ts.map +1 -1
- package/dist/components/layouts/register/hooks/use_register_form.js +25 -10
- package/dist/components/layouts/register/index.d.ts.map +1 -1
- package/dist/components/layouts/register/index.js +21 -1
- package/dist/components/layouts/user_management/index.d.ts.map +1 -1
- package/dist/components/layouts/user_management/index.js +45 -7
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/input-otp.d.ts +2 -2
- package/dist/components/ui/sheet.d.ts +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/auth/auth_types.d.ts +2 -0
- package/dist/lib/auth/auth_types.d.ts.map +1 -1
- package/dist/lib/auth/auth_types.js +0 -2
- package/dist/lib/auth/hazo_get_auth.server.d.ts.map +1 -1
- package/dist/lib/auth/hazo_get_auth.server.js +19 -0
- package/dist/lib/legal/legal_docs_config.server.d.ts +22 -0
- package/dist/lib/legal/legal_docs_config.server.d.ts.map +1 -0
- package/dist/lib/legal/legal_docs_config.server.js +52 -0
- package/dist/lib/legal/legal_docs_reader.server.d.ts +15 -0
- package/dist/lib/legal/legal_docs_reader.server.d.ts.map +1 -0
- package/dist/lib/legal/legal_docs_reader.server.js +24 -0
- package/dist/lib/legal/legal_docs_service.d.ts +49 -0
- package/dist/lib/legal/legal_docs_service.d.ts.map +1 -0
- package/dist/lib/legal/legal_docs_service.js +140 -0
- package/dist/lib/legal/legal_docs_types.d.ts +25 -0
- package/dist/lib/legal/legal_docs_types.d.ts.map +1 -0
- package/dist/lib/legal/legal_docs_types.js +2 -0
- package/dist/lib/services/registration_service.d.ts +5 -0
- package/dist/lib/services/registration_service.d.ts.map +1 -1
- package/dist/lib/services/registration_service.js +6 -0
- package/dist/page_components/index.d.ts +0 -5
- package/dist/page_components/index.d.ts.map +1 -1
- package/dist/page_components/index.js +0 -5
- package/dist/server/routes/index.d.ts +3 -0
- package/dist/server/routes/index.d.ts.map +1 -1
- package/dist/server/routes/index.js +4 -0
- package/dist/server/routes/legal_docs_accept.d.ts +3 -0
- package/dist/server/routes/legal_docs_accept.d.ts.map +1 -0
- package/dist/server/routes/legal_docs_accept.js +43 -0
- package/dist/server/routes/legal_docs_get.d.ts +3 -0
- package/dist/server/routes/legal_docs_get.d.ts.map +1 -0
- package/dist/server/routes/legal_docs_get.js +49 -0
- package/dist/server/routes/legal_docs_publish.d.ts +3 -0
- package/dist/server/routes/legal_docs_publish.d.ts.map +1 -0
- package/dist/server/routes/legal_docs_publish.js +35 -0
- package/dist/server/routes/register.d.ts.map +1 -1
- package/dist/server/routes/register.js +26 -0
- package/dist/server/routes/user_management_users.d.ts +2 -2
- package/dist/server/routes/user_management_users.d.ts.map +1 -1
- package/dist/server/routes/user_management_users.js +46 -2
- package/dist/strings.d.ts +2 -0
- package/dist/strings.d.ts.map +1 -0
- package/dist/strings.js +3 -0
- package/package.json +5 -22
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LegalDoc } from '../../../lib/legal/legal_docs_types';
|
|
2
|
+
interface LegalDocCheckboxListProps {
|
|
3
|
+
docs: LegalDoc[];
|
|
4
|
+
accepted: Record<string, boolean>;
|
|
5
|
+
onAcceptedChange: (key: string, value: boolean) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function LegalDocCheckboxList({ docs, accepted, onAcceptedChange }: LegalDocCheckboxListProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=legal_doc_checkbox_list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal_doc_checkbox_list.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/legal/legal_doc_checkbox_list.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAEpE,UAAU,yBAAyB;IACjC,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACzD;AAED,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,yBAAyB,2CA8BnG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Checkbox } from '../../ui/checkbox.js';
|
|
4
|
+
import { Button } from '../../ui/button.js';
|
|
5
|
+
import { LegalDocDrawer } from './legal_doc_drawer.js';
|
|
6
|
+
export function LegalDocCheckboxList({ docs, accepted, onAcceptedChange }) {
|
|
7
|
+
return (_jsx("div", { className: "space-y-3", children: docs.map((doc) => {
|
|
8
|
+
var _a;
|
|
9
|
+
return (_jsxs("div", { className: "flex items-center gap-3 rounded-lg border p-3", children: [_jsx(Checkbox, { id: `legal-accept-${doc.key}`, checked: (_a = accepted[doc.key]) !== null && _a !== void 0 ? _a : false, onCheckedChange: (checked) => onAcceptedChange(doc.key, !!checked) }), _jsxs("label", { htmlFor: `legal-accept-${doc.key}`, className: "flex-1 text-sm cursor-pointer select-none", children: ["I have read and accept the", ' ', _jsx("span", { className: "font-medium", children: doc.title })] }), _jsx(LegalDocDrawer, { title: doc.title, content: doc.content, trigger: _jsx(Button, { type: "button", variant: "ghost", size: "sm", children: "Read" }) })] }, doc.key));
|
|
10
|
+
}) }));
|
|
11
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LegalDoc } from '../../../lib/legal/legal_docs_types';
|
|
2
|
+
interface LegalDocCombinedViewProps {
|
|
3
|
+
docs: LegalDoc[];
|
|
4
|
+
accepted: boolean;
|
|
5
|
+
onAcceptedChange: (value: boolean) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function LegalDocCombinedView({ docs, accepted, onAcceptedChange }: LegalDocCombinedViewProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=legal_doc_combined_view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal_doc_combined_view.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/legal/legal_doc_combined_view.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAEpE,UAAU,yBAAyB;IACjC,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;AAED,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,yBAAyB,2CAoCnG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Checkbox } from '../../ui/checkbox.js';
|
|
4
|
+
import { LegalDocDrawer } from './legal_doc_drawer.js';
|
|
5
|
+
export function LegalDocCombinedView({ docs, accepted, onAcceptedChange }) {
|
|
6
|
+
const combined_content = docs
|
|
7
|
+
.map((d) => `## ${d.title}\n\n${d.content}`)
|
|
8
|
+
.join('\n\n---\n\n');
|
|
9
|
+
const combined_title = docs.map((d) => d.title).join(', ');
|
|
10
|
+
return (_jsx("div", { className: "space-y-3", children: _jsxs("div", { className: "flex items-center gap-3 rounded-lg border p-3", children: [_jsx(Checkbox, { id: "legal-accept-combined", checked: accepted, onCheckedChange: (checked) => onAcceptedChange(!!checked) }), _jsx("label", { htmlFor: "legal-accept-combined", className: "flex-1 text-sm cursor-pointer select-none", children: "I have read and accept all of the above" }), _jsx(LegalDocDrawer, { title: combined_title, content: combined_content, trigger: _jsx("button", { type: "button", className: "text-sm text-primary underline underline-offset-2", children: "Read all" }) })] }) }));
|
|
11
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface LegalDocDrawerProps {
|
|
2
|
+
title: string;
|
|
3
|
+
content: string;
|
|
4
|
+
trigger: React.ReactNode;
|
|
5
|
+
}
|
|
6
|
+
export declare function LegalDocDrawer({ title, content, trigger }: LegalDocDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=legal_doc_drawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal_doc_drawer.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/legal/legal_doc_drawer.tsx"],"names":[],"mappings":"AAKA,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,mBAAmB,2CA8C9E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
import ReactMarkdown from 'react-markdown';
|
|
15
|
+
import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from '../../ui/sheet.js';
|
|
16
|
+
export function LegalDocDrawer({ title, content, trigger }) {
|
|
17
|
+
return (_jsxs(Sheet, { children: [_jsx(SheetTrigger, { asChild: true, children: trigger }), _jsxs(SheetContent, { side: "right", className: "w-full sm:max-w-2xl overflow-y-auto", children: [_jsx(SheetHeader, { children: _jsx(SheetTitle, { children: title }) }), _jsx("div", { className: "mt-4 space-y-3 text-sm", children: _jsx(ReactMarkdown, { components: {
|
|
18
|
+
h1(_a) {
|
|
19
|
+
var { node: _node, children } = _a, props = __rest(_a, ["node", "children"]);
|
|
20
|
+
return _jsx("h1", Object.assign({ className: "text-xl font-bold mt-4 mb-2" }, props, { children: children }));
|
|
21
|
+
},
|
|
22
|
+
h2(_a) {
|
|
23
|
+
var { node: _node, children } = _a, props = __rest(_a, ["node", "children"]);
|
|
24
|
+
return _jsx("h2", Object.assign({ className: "text-lg font-semibold mt-3 mb-1" }, props, { children: children }));
|
|
25
|
+
},
|
|
26
|
+
h3(_a) {
|
|
27
|
+
var { node: _node, children } = _a, props = __rest(_a, ["node", "children"]);
|
|
28
|
+
return _jsx("h3", Object.assign({ className: "text-base font-semibold mt-2 mb-1" }, props, { children: children }));
|
|
29
|
+
},
|
|
30
|
+
p(_a) {
|
|
31
|
+
var { node: _node, children } = _a, props = __rest(_a, ["node", "children"]);
|
|
32
|
+
return _jsx("p", Object.assign({ className: "mb-2 leading-relaxed" }, props, { children: children }));
|
|
33
|
+
},
|
|
34
|
+
ul(_a) {
|
|
35
|
+
var { node: _node, children } = _a, props = __rest(_a, ["node", "children"]);
|
|
36
|
+
return _jsx("ul", Object.assign({ className: "list-disc list-inside mb-2 space-y-1" }, props, { children: children }));
|
|
37
|
+
},
|
|
38
|
+
ol(_a) {
|
|
39
|
+
var { node: _node, children } = _a, props = __rest(_a, ["node", "children"]);
|
|
40
|
+
return _jsx("ol", Object.assign({ className: "list-decimal list-inside mb-2 space-y-1" }, props, { children: children }));
|
|
41
|
+
},
|
|
42
|
+
li(_a) {
|
|
43
|
+
var { node: _node, children } = _a, props = __rest(_a, ["node", "children"]);
|
|
44
|
+
return _jsx("li", Object.assign({ className: "ml-2" }, props, { children: children }));
|
|
45
|
+
},
|
|
46
|
+
hr(_a) {
|
|
47
|
+
var { node: _node } = _a, props = __rest(_a, ["node"]);
|
|
48
|
+
return _jsx("hr", Object.assign({ className: "my-4 border-border" }, props));
|
|
49
|
+
},
|
|
50
|
+
strong(_a) {
|
|
51
|
+
var { node: _node, children } = _a, props = __rest(_a, ["node", "children"]);
|
|
52
|
+
return _jsx("strong", Object.assign({ className: "font-semibold" }, props, { children: children }));
|
|
53
|
+
},
|
|
54
|
+
}, children: content }) })] })] }));
|
|
55
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { LayoutDataClient } from "../../shared/data/layout_data_client";
|
|
2
2
|
import type { PasswordRequirementOptions, PasswordRequirementOverrides } from "../../shared/config/layout_customization";
|
|
3
3
|
import { type RegisterFieldId } from "../config/register_field_config.js";
|
|
4
|
+
import type { LegalDoc } from "../../../../lib/legal/legal_docs_types";
|
|
4
5
|
export type RegisterFormValues = Record<RegisterFieldId, string>;
|
|
5
6
|
export type RegisterFormErrors = Partial<Record<RegisterFieldId, string | string[]>> & {
|
|
6
7
|
submit?: string;
|
|
@@ -12,6 +13,7 @@ export type UseRegisterFormParams<TClient = unknown> = {
|
|
|
12
13
|
passwordRequirementOverrides?: PasswordRequirementOverrides;
|
|
13
14
|
dataClient: LayoutDataClient<TClient>;
|
|
14
15
|
urlOnLogon?: string;
|
|
16
|
+
legalDocs?: LegalDoc[];
|
|
15
17
|
};
|
|
16
18
|
export type UseRegisterFormResult = {
|
|
17
19
|
values: RegisterFormValues;
|
|
@@ -25,6 +27,8 @@ export type UseRegisterFormResult = {
|
|
|
25
27
|
togglePasswordVisibility: (fieldId: "password" | "confirm_password") => void;
|
|
26
28
|
handleSubmit: (event: React.FormEvent<HTMLFormElement>) => void;
|
|
27
29
|
handleCancel: () => void;
|
|
30
|
+
legal_accepted: Record<string, boolean>;
|
|
31
|
+
handleLegalAcceptedChange: (key: string, value: boolean) => void;
|
|
28
32
|
};
|
|
29
|
-
export declare const use_register_form: <TClient>({ showNameField, passwordRequirements, dataClient, urlOnLogon, }: UseRegisterFormParams<TClient>) => UseRegisterFormResult;
|
|
33
|
+
export declare const use_register_form: <TClient>({ showNameField, passwordRequirements, dataClient, urlOnLogon, legalDocs, }: UseRegisterFormParams<TClient>) => UseRegisterFormResult;
|
|
30
34
|
//# sourceMappingURL=use_register_form.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_register_form.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/register/hooks/use_register_form.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AACzH,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"use_register_form.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/register/hooks/use_register_form.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AACzH,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAG3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AASvE,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAC1C,OAAO,CAAC,eAAe,EAAE,UAAU,GAAG,kBAAkB,CAAC,EACzD,OAAO,CACR,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAAC,OAAO,GAAG,OAAO,IAAI;IACrD,aAAa,EAAE,OAAO,CAAC;IACvB,oBAAoB,EAAE,0BAA0B,CAAC;IACjD,4BAA4B,CAAC,EAAE,4BAA4B,CAAC;IAC5D,UAAU,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,kBAAkB,EAAE,uBAAuB,CAAC;IAC5C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,wBAAwB,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,KAAK,IAAI,CAAC;IAC7E,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IAChE,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,yBAAyB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAClE,CAAC;AAYF,eAAO,MAAM,iBAAiB,GAAI,OAAO,EAAG,6EAMzC,qBAAqB,CAAC,OAAO,CAAC,KAAG,qBA6QnC,CAAC"}
|
|
@@ -18,7 +18,7 @@ const buildInitialValues = () => ({
|
|
|
18
18
|
[REGISTER_FIELD_IDS.CONFIRM_PASSWORD]: "",
|
|
19
19
|
});
|
|
20
20
|
// section: hook
|
|
21
|
-
export const use_register_form = ({ showNameField, passwordRequirements, dataClient, urlOnLogon, }) => {
|
|
21
|
+
export const use_register_form = ({ showNameField, passwordRequirements, dataClient, urlOnLogon, legalDocs, }) => {
|
|
22
22
|
const { apiBasePath } = useHazoAuthConfig();
|
|
23
23
|
const initialValues = useMemo(() => buildInitialValues(), []);
|
|
24
24
|
const [values, setValues] = useState(initialValues);
|
|
@@ -29,6 +29,7 @@ export const use_register_form = ({ showNameField, passwordRequirements, dataCli
|
|
|
29
29
|
});
|
|
30
30
|
const [emailTouched, setEmailTouched] = useState(false);
|
|
31
31
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
32
|
+
const [legal_accepted, set_legal_accepted] = useState({});
|
|
32
33
|
// Check if form has been edited (changed from initial state)
|
|
33
34
|
const isFormEdited = useMemo(() => {
|
|
34
35
|
return Object.entries(values).some(([fieldId, fieldValue]) => {
|
|
@@ -64,9 +65,17 @@ export const use_register_form = ({ showNameField, passwordRequirements, dataCli
|
|
|
64
65
|
if (hasEmptyField) {
|
|
65
66
|
return true;
|
|
66
67
|
}
|
|
67
|
-
//
|
|
68
|
+
// Disable if any required legal document has not been accepted
|
|
69
|
+
const all_legal_accepted = (legalDocs !== null && legalDocs !== void 0 ? legalDocs : []).every(doc => legal_accepted[doc.key]);
|
|
70
|
+
if (!all_legal_accepted) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
// Enable if form is edited, has no errors, all required fields are filled, and legal docs accepted
|
|
68
74
|
return false;
|
|
69
|
-
}, [errors, showNameField, values, isSubmitting, isFormEdited]);
|
|
75
|
+
}, [errors, showNameField, values, isSubmitting, isFormEdited, legal_accepted, legalDocs]);
|
|
76
|
+
const handleLegalAcceptedChange = useCallback((key, value) => {
|
|
77
|
+
set_legal_accepted(prev => (Object.assign(Object.assign({}, prev), { [key]: value })));
|
|
78
|
+
}, []);
|
|
70
79
|
const togglePasswordVisibility = useCallback((fieldId) => {
|
|
71
80
|
setPasswordVisibility((previous) => (Object.assign(Object.assign({}, previous), { [fieldId]: !previous[fieldId] })));
|
|
72
81
|
}, []);
|
|
@@ -143,17 +152,19 @@ export const use_register_form = ({ showNameField, passwordRequirements, dataCli
|
|
|
143
152
|
setIsSubmitting(true);
|
|
144
153
|
setErrors({});
|
|
145
154
|
try {
|
|
155
|
+
const legal_accepted_payload = legalDocs && legalDocs.length > 0
|
|
156
|
+
? Object.fromEntries(legalDocs
|
|
157
|
+
.filter(doc => legal_accepted[doc.key])
|
|
158
|
+
.map(doc => [doc.key, { hash: doc.hash }]))
|
|
159
|
+
: undefined;
|
|
146
160
|
const response = await fetch(`${apiBasePath}/register`, {
|
|
147
161
|
method: "POST",
|
|
148
162
|
headers: {
|
|
149
163
|
"Content-Type": "application/json",
|
|
150
164
|
},
|
|
151
|
-
body: JSON.stringify({
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
password: values[REGISTER_FIELD_IDS.PASSWORD],
|
|
155
|
-
url_on_logon: urlOnLogon,
|
|
156
|
-
}),
|
|
165
|
+
body: JSON.stringify(Object.assign({ name: values[REGISTER_FIELD_IDS.NAME] || undefined, email: values[REGISTER_FIELD_IDS.EMAIL], password: values[REGISTER_FIELD_IDS.PASSWORD], url_on_logon: urlOnLogon }, (legal_accepted_payload && Object.keys(legal_accepted_payload).length > 0
|
|
166
|
+
? { legal_accepted: legal_accepted_payload }
|
|
167
|
+
: {}))),
|
|
157
168
|
});
|
|
158
169
|
const data = await response.json();
|
|
159
170
|
if (!response.ok) {
|
|
@@ -172,6 +183,7 @@ export const use_register_form = ({ showNameField, passwordRequirements, dataCli
|
|
|
172
183
|
confirm_password: false,
|
|
173
184
|
});
|
|
174
185
|
setEmailTouched(false);
|
|
186
|
+
set_legal_accepted({});
|
|
175
187
|
}
|
|
176
188
|
catch (error) {
|
|
177
189
|
const errorMessage = error instanceof Error ? error.message : "Registration failed. Please try again.";
|
|
@@ -187,7 +199,7 @@ export const use_register_form = ({ showNameField, passwordRequirements, dataCli
|
|
|
187
199
|
finally {
|
|
188
200
|
setIsSubmitting(false);
|
|
189
201
|
}
|
|
190
|
-
}, [values, passwordRequirements, dataClient, urlOnLogon]);
|
|
202
|
+
}, [values, passwordRequirements, dataClient, urlOnLogon, legalDocs, legal_accepted]);
|
|
191
203
|
const handleCancel = useCallback(() => {
|
|
192
204
|
const resetValues = buildInitialValues();
|
|
193
205
|
setValues(resetValues);
|
|
@@ -197,6 +209,7 @@ export const use_register_form = ({ showNameField, passwordRequirements, dataCli
|
|
|
197
209
|
confirm_password: false,
|
|
198
210
|
});
|
|
199
211
|
setEmailTouched(false);
|
|
212
|
+
set_legal_accepted({});
|
|
200
213
|
}, []);
|
|
201
214
|
return {
|
|
202
215
|
values,
|
|
@@ -210,5 +223,7 @@ export const use_register_form = ({ showNameField, passwordRequirements, dataCli
|
|
|
210
223
|
togglePasswordVisibility,
|
|
211
224
|
handleSubmit,
|
|
212
225
|
handleCancel,
|
|
226
|
+
legal_accepted,
|
|
227
|
+
handleLegalAcceptedChange,
|
|
213
228
|
};
|
|
214
229
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/register/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/register/index.tsx"],"names":[],"mappings":"AAmBA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EAClC,MAAM,uCAAuC,CAAC;AAY/C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAOlD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gCAAgC;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,8CAA8C;IAC9C,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kDAAkD;IAClD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,oDAAoD;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,OAAO,GAAG,OAAO,IAAI;IACnD,6HAA6H;IAC7H,SAAS,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC;IACrC,0GAA0G;IAC1G,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,qBAAqB,CAAC,EAAE,4BAA4B,CAAC;IACrD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACvC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,qGAAqG;IACrG,MAAM,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC;CACrC,CAAC;AAYF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,OAAO,EAAE,EAC/C,SAAS,EACT,SAAS,EACT,sBAAkC,EAClC,eAAe,EACf,MAAM,EACN,aAAa,EACb,qBAAqB,EACrB,eAAsB,EACtB,WAAW,EACX,sBAAoD,EACpD,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,EACpB,UAA+B,EAC/B,WAAuB,EACvB,UAAU,EACV,KAAK,EACL,MAAqB,GACtB,EAAE,mBAAmB,CAAC,OAAO,CAAC,2CAsR9B"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
"use client";
|
|
4
4
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
5
5
|
// section: imports
|
|
6
|
+
import { useState, useEffect } from "react";
|
|
6
7
|
import Link from "next/link";
|
|
7
8
|
import { useSearchParams } from "next/navigation";
|
|
8
9
|
import { Input } from "../../ui/input.js";
|
|
@@ -18,6 +19,9 @@ import { OAuthDivider } from "../shared/components/oauth_divider.js";
|
|
|
18
19
|
import { AlertCircle } from "lucide-react";
|
|
19
20
|
import { REGISTER_FIELD_IDS, createRegisterFieldDefinitions, resolveRegisterButtonPalette, resolveRegisterLabels, resolveRegisterPasswordRequirements, } from "./config/register_field_config.js";
|
|
20
21
|
import { use_register_form, } from "./hooks/use_register_form.js";
|
|
22
|
+
import { LegalDocCheckboxList } from "../legal/legal_doc_checkbox_list.js";
|
|
23
|
+
import { LegalDocCombinedView } from "../legal/legal_doc_combined_view.js";
|
|
24
|
+
import { useHazoAuthConfig } from "../../../contexts/hazo_auth_provider.js";
|
|
21
25
|
const ORDERED_FIELDS = [
|
|
22
26
|
REGISTER_FIELD_IDS.NAME,
|
|
23
27
|
REGISTER_FIELD_IDS.EMAIL,
|
|
@@ -62,6 +66,21 @@ export default function register_layout({ image_src, image_alt, image_background
|
|
|
62
66
|
return "An error occurred during sign-in. Please try again.";
|
|
63
67
|
}
|
|
64
68
|
};
|
|
69
|
+
const { apiBasePath } = useHazoAuthConfig();
|
|
70
|
+
const [legal_docs, set_legal_docs] = useState([]);
|
|
71
|
+
const [legal_display_mode, set_legal_display_mode] = useState('separate');
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
fetch(`${apiBasePath}/legal_docs`)
|
|
74
|
+
.then(r => r.json())
|
|
75
|
+
.then(result => {
|
|
76
|
+
var _a, _b;
|
|
77
|
+
if (result.ok && ((_b = (_a = result.data) === null || _a === void 0 ? void 0 : _a.docs) === null || _b === void 0 ? void 0 : _b.length) > 0) {
|
|
78
|
+
set_legal_docs(result.data.docs);
|
|
79
|
+
set_legal_display_mode(result.data.display_mode);
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
.catch(() => { });
|
|
83
|
+
}, [apiBasePath]);
|
|
65
84
|
const fieldDefinitions = createRegisterFieldDefinitions(field_overrides);
|
|
66
85
|
const resolvedLabels = resolveRegisterLabels(labels);
|
|
67
86
|
const resolvedButtonPalette = resolveRegisterButtonPalette(button_colors);
|
|
@@ -71,6 +90,7 @@ export default function register_layout({ image_src, image_alt, image_background
|
|
|
71
90
|
passwordRequirements: resolvedPasswordRequirements,
|
|
72
91
|
dataClient: data_client,
|
|
73
92
|
urlOnLogon: effectiveUrlOnLogon,
|
|
93
|
+
legalDocs: legal_docs,
|
|
74
94
|
});
|
|
75
95
|
const renderFields = (formState) => {
|
|
76
96
|
const renderOrder = ORDERED_FIELDS.filter((fieldId) => show_name_field || fieldId !== REGISTER_FIELD_IDS.NAME);
|
|
@@ -98,7 +118,7 @@ export default function register_layout({ image_src, image_alt, image_background
|
|
|
98
118
|
// Form content — used in both layout modes. See `login_layout` for the
|
|
99
119
|
// rationale: keeps the form independent of TwoColumnAuthLayout / AuthPageShell
|
|
100
120
|
// so consumers can compose it into their own brand chrome.
|
|
101
|
-
const mainContent = (_jsxs(_Fragment, { children: [_jsx(FormHeader, { heading: resolvedLabels.heading, subHeading: resolvedLabels.subHeading }), oauthError && (_jsxs("div", { className: "cls_register_layout_oauth_error flex items-center gap-2 rounded-md border border-red-200 bg-red-50 p-3 text-sm text-red-700", children: [_jsx(AlertCircle, { className: "h-4 w-4 shrink-0", "aria-hidden": "true" }), _jsx("span", { children: getOAuthErrorMessage(oauthError) })] })), oauthConfig.enable_google && (_jsx("div", { className: "cls_register_layout_oauth_section", children: _jsx(GoogleSignInButton, { label: oauthConfig.google_button_text, callbackUrl: oauthCallbackUrl }) })), oauthConfig.enable_facebook_oauth && (_jsx("div", { className: "cls_register_layout_facebook_section", children: _jsx(FacebookSignInButton, { label: oauthConfig.facebook_button_text || "Continue with Facebook", callbackUrl: "/api/hazo_auth/oauth/facebook/callback" }) })), (oauthConfig.enable_google || oauthConfig.enable_facebook_oauth) && oauthConfig.enable_email_password && (_jsx(OAuthDivider, { text: oauthConfig.oauth_divider_text })), oauthConfig.enable_email_password && (_jsxs("form", { className: "cls_register_layout_form_fields flex flex-col gap-5", onSubmit: form.handleSubmit, "aria-label": "Registration form", children: [renderFields(form), _jsx(FormActionButtons, { submitLabel: resolvedLabels.submitButton, cancelLabel: resolvedLabels.cancelButton, buttonPalette: resolvedButtonPalette, isSubmitDisabled: form.isSubmitDisabled, onCancel: form.handleCancel, submitAriaLabel: "Submit registration form", cancelAriaLabel: "Cancel registration form" }), _jsxs("div", { className: "cls_register_layout_sign_in_link flex items-center justify-center gap-1 text-sm text-muted-foreground", children: [_jsx("span", { children: "Already have an account?" }), _jsx(Link, { href: signInPath, className: "cls_register_layout_sign_in_link_text text-primary underline-offset-4 hover:underline", "aria-label": "Go to sign in page", children: signInLabel })] }), form.isSubmitting && (_jsx("div", { className: "cls_register_submitting_indicator text-sm text-slate-600 text-center", children: "Registering..." }))] })), !oauthConfig.enable_email_password && (oauthConfig.enable_google || oauthConfig.enable_facebook_oauth) && (_jsxs("div", { className: "cls_register_layout_sign_in_link mt-4 flex items-center justify-center gap-1 text-sm text-muted-foreground", children: [_jsx("span", { children: "Already have an account?" }), _jsx(Link, { href: signInPath, className: "cls_register_layout_sign_in_link_text text-primary underline-offset-4 hover:underline", "aria-label": "Go to sign in page", children: signInLabel })] }))] }));
|
|
121
|
+
const mainContent = (_jsxs(_Fragment, { children: [_jsx(FormHeader, { heading: resolvedLabels.heading, subHeading: resolvedLabels.subHeading }), oauthError && (_jsxs("div", { className: "cls_register_layout_oauth_error flex items-center gap-2 rounded-md border border-red-200 bg-red-50 p-3 text-sm text-red-700", children: [_jsx(AlertCircle, { className: "h-4 w-4 shrink-0", "aria-hidden": "true" }), _jsx("span", { children: getOAuthErrorMessage(oauthError) })] })), oauthConfig.enable_google && (_jsx("div", { className: "cls_register_layout_oauth_section", children: _jsx(GoogleSignInButton, { label: oauthConfig.google_button_text, callbackUrl: oauthCallbackUrl }) })), oauthConfig.enable_facebook_oauth && (_jsx("div", { className: "cls_register_layout_facebook_section", children: _jsx(FacebookSignInButton, { label: oauthConfig.facebook_button_text || "Continue with Facebook", callbackUrl: "/api/hazo_auth/oauth/facebook/callback" }) })), (oauthConfig.enable_google || oauthConfig.enable_facebook_oauth) && oauthConfig.enable_email_password && (_jsx(OAuthDivider, { text: oauthConfig.oauth_divider_text })), oauthConfig.enable_email_password && (_jsxs("form", { className: "cls_register_layout_form_fields flex flex-col gap-5", onSubmit: form.handleSubmit, "aria-label": "Registration form", children: [renderFields(form), legal_docs.length > 0 && (_jsx("div", { className: "space-y-2", children: legal_display_mode === 'combined' ? (_jsx(LegalDocCombinedView, { docs: legal_docs, accepted: legal_docs.every(doc => form.legal_accepted[doc.key]), onAcceptedChange: (value) => legal_docs.forEach(doc => form.handleLegalAcceptedChange(doc.key, value)) })) : (_jsx(LegalDocCheckboxList, { docs: legal_docs, accepted: form.legal_accepted, onAcceptedChange: form.handleLegalAcceptedChange })) })), _jsx(FormActionButtons, { submitLabel: resolvedLabels.submitButton, cancelLabel: resolvedLabels.cancelButton, buttonPalette: resolvedButtonPalette, isSubmitDisabled: form.isSubmitDisabled, onCancel: form.handleCancel, submitAriaLabel: "Submit registration form", cancelAriaLabel: "Cancel registration form" }), _jsxs("div", { className: "cls_register_layout_sign_in_link flex items-center justify-center gap-1 text-sm text-muted-foreground", children: [_jsx("span", { children: "Already have an account?" }), _jsx(Link, { href: signInPath, className: "cls_register_layout_sign_in_link_text text-primary underline-offset-4 hover:underline", "aria-label": "Go to sign in page", children: signInLabel })] }), form.isSubmitting && (_jsx("div", { className: "cls_register_submitting_indicator text-sm text-slate-600 text-center", children: "Registering..." }))] })), !oauthConfig.enable_email_password && (oauthConfig.enable_google || oauthConfig.enable_facebook_oauth) && (_jsxs("div", { className: "cls_register_layout_sign_in_link mt-4 flex items-center justify-center gap-1 text-sm text-muted-foreground", children: [_jsx("span", { children: "Already have an account?" }), _jsx(Link, { href: signInPath, className: "cls_register_layout_sign_in_link_text text-primary underline-offset-4 hover:underline", "aria-label": "Go to sign in page", children: signInLabel })] }))] }));
|
|
102
122
|
// form_only mode: emit just the form content. See login_layout for the
|
|
103
123
|
// rationale; AlreadyLoggedInGuard is intentionally skipped here.
|
|
104
124
|
if (layout === "form_only") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/user_management/index.tsx"],"names":[],"mappings":"AAyDA,4CAA4C;AAC5C,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,cAAc,EAAE,CAAC;CACvC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/user_management/index.tsx"],"names":[],"mappings":"AAyDA,4CAA4C;AAC5C,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,cAAc,EAAE,CAAC;CACvC,CAAC;AAwJF;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,YAAoB,EAAE,gBAAwB,EAAE,kBAAuB,EAAE,EAAE,yBAAyB,2CA8jDrJ"}
|
|
@@ -112,6 +112,15 @@ export function UserManagementLayout({ className, hrbacEnabled = false, userType
|
|
|
112
112
|
const [newPermissionDescription, setNewPermissionDescription] = useState("");
|
|
113
113
|
const [permissionsActionLoading, setPermissionsActionLoading] = useState(false);
|
|
114
114
|
const [migrateLoading, setMigrateLoading] = useState(false);
|
|
115
|
+
// Active tab tracking (needed for lazy-load of Legal Docs tab)
|
|
116
|
+
const [active_tab, set_active_tab] = useState(showUsersTab ? "users" :
|
|
117
|
+
showRolesTab ? "roles" :
|
|
118
|
+
showPermissionsTab ? "permissions" :
|
|
119
|
+
showScopeHierarchyTab ? "scope_hierarchy" :
|
|
120
|
+
showUserScopesTab ? "user_scopes" : "users");
|
|
121
|
+
// Tab 7: Legal Docs state
|
|
122
|
+
const [legal_docs_tab_data, set_legal_docs_tab_data] = useState(null);
|
|
123
|
+
const [legal_publishing, set_legal_publishing] = useState(null);
|
|
115
124
|
// Load users function (reusable)
|
|
116
125
|
const loadUsers = useCallback(async () => {
|
|
117
126
|
setUsersLoading(true);
|
|
@@ -179,6 +188,19 @@ export function UserManagementLayout({ className, hrbacEnabled = false, userType
|
|
|
179
188
|
};
|
|
180
189
|
void loadPermissions();
|
|
181
190
|
}, [showPermissionsTab]);
|
|
191
|
+
// Load legal docs data when Legal Docs tab is active
|
|
192
|
+
useEffect(() => {
|
|
193
|
+
if (active_tab !== 'legal_docs')
|
|
194
|
+
return;
|
|
195
|
+
fetch(`${apiBasePath}/legal_docs`)
|
|
196
|
+
.then(r => r.json())
|
|
197
|
+
.then(result => {
|
|
198
|
+
if (result.ok) {
|
|
199
|
+
set_legal_docs_tab_data({ docs: result.data.docs });
|
|
200
|
+
}
|
|
201
|
+
})
|
|
202
|
+
.catch(() => { });
|
|
203
|
+
}, [active_tab, apiBasePath]);
|
|
182
204
|
// Handle deactivate user
|
|
183
205
|
const handleDeactivateUser = async () => {
|
|
184
206
|
if (!selectedUser)
|
|
@@ -543,14 +565,12 @@ export function UserManagementLayout({ className, hrbacEnabled = false, userType
|
|
|
543
565
|
};
|
|
544
566
|
return (_jsxs("div", { className: `cls_user_management_layout flex flex-col gap-4 w-full ${className || ""}`, children: [authResult.loading ? (_jsx("div", { className: "cls_user_management_permissions_loading flex items-center justify-center p-8", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-slate-400" }) })) : !hasAnyPermission ? (_jsxs("div", { className: "cls_user_management_no_permissions flex flex-col items-center justify-center p-8 gap-4", children: [_jsx("p", { className: "text-lg font-semibold text-slate-700", children: "Access Denied" }), _jsx("p", { className: "text-sm text-muted-foreground text-center", children: "You don't have permission to access User Management. Please contact your administrator." }), process.env.NODE_ENV === "development" && (_jsxs("div", { className: "mt-4 p-4 bg-yellow-50 border border-yellow-200 rounded-md text-xs text-left w-full max-w-lg", children: [_jsx("p", { className: "font-semibold text-yellow-800 mb-2", children: "Dev Debug Info" }), _jsxs("p", { className: "text-yellow-700", children: [_jsx("span", { className: "font-medium", children: "Your permissions:" }), " ", authResult.authenticated && authResult.permissions.length > 0
|
|
545
567
|
? authResult.permissions.join(", ")
|
|
546
|
-
: "(none)"] }), _jsxs("p", { className: "text-yellow-700 mt-1", children: [_jsx("span", { className: "font-medium", children: "Required (any of):" }), " ", "admin_user_management, admin_role_management, admin_permission_management, admin_scope_hierarchy_management, admin_user_scope_assignment, admin_system"] })] }))] })) : (_jsxs(Tabs, { defaultValue: showUsersTab ? "users" :
|
|
547
|
-
showRolesTab ? "roles" :
|
|
548
|
-
showPermissionsTab ? "permissions" :
|
|
549
|
-
showScopeHierarchyTab ? "scope_hierarchy" :
|
|
550
|
-
showUserScopesTab ? "user_scopes" : "users", className: "cls_user_management_tabs w-full", children: [_jsxs(TabsList, { className: "cls_user_management_tabs_list flex w-full flex-wrap", children: [showUsersTab && (_jsx(TabsTrigger, { value: "users", className: "cls_user_management_tabs_trigger flex-1", children: "Manage Users" })), showRolesTab && (_jsx(TabsTrigger, { value: "roles", className: "cls_user_management_tabs_trigger flex-1", children: "Roles" })), showPermissionsTab && (_jsx(TabsTrigger, { value: "permissions", className: "cls_user_management_tabs_trigger flex-1", children: "Permissions" })), showScopeHierarchyTab && (_jsx(TabsTrigger, { value: "scope_hierarchy", className: "cls_user_management_tabs_trigger flex-1", children: "Scope Hierarchy" })), showUserScopesTab && (_jsx(TabsTrigger, { value: "user_scopes", className: "cls_user_management_tabs_trigger flex-1", children: "User Scopes" }))] }), showUsersTab && (_jsx(TabsContent, { value: "users", className: "cls_user_management_tab_users w-full", children: usersLoading ? (_jsx("div", { className: "cls_user_management_users_loading flex items-center justify-center p-8", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-slate-400" }) })) : (_jsx("div", { className: "cls_user_management_users_table_container border rounded-lg overflow-auto w-full", children: _jsxs(Table, { className: "cls_user_management_users_table w-full", children: [_jsx(TableHeader, { className: "cls_user_management_users_table_header", children: _jsxs(TableRow, { className: "cls_user_management_users_table_header_row", children: [_jsx(TableHead, { className: "cls_user_management_users_table_header_profile_pic w-16", children: "Photo" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_id", children: "ID" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_name", children: "Name" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_email", children: "Email" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_email_verified", children: "Email Verified" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_is_active", children: "Active" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_last_logon", children: "Last Logon" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_created_at", children: "Created At" }), userTypesEnabled && (_jsx(TableHead, { className: "cls_user_management_users_table_header_user_type", children: "User Type" })), _jsx(TableHead, { className: "cls_user_management_users_table_header_actions text-right", children: "Actions" })] }) }), _jsx(TableBody, { className: "cls_user_management_users_table_body", children: users.length === 0 ? (_jsx(TableRow, { className: "cls_user_management_users_table_row_empty", children: _jsx(TableCell, { colSpan: userTypesEnabled ? 10 : 9, className: "text-center text-muted-foreground py-8", children: "No users found." }) })) : (users.map((user) => (_jsxs(TableRow, { className: "cls_user_management_users_table_row cursor-pointer hover:bg-muted/50", onClick: () => {
|
|
568
|
+
: "(none)"] }), _jsxs("p", { className: "text-yellow-700 mt-1", children: [_jsx("span", { className: "font-medium", children: "Required (any of):" }), " ", "admin_user_management, admin_role_management, admin_permission_management, admin_scope_hierarchy_management, admin_user_scope_assignment, admin_system"] })] }))] })) : (_jsxs(Tabs, { defaultValue: active_tab, onValueChange: set_active_tab, className: "cls_user_management_tabs w-full", children: [_jsxs(TabsList, { className: "cls_user_management_tabs_list flex w-full flex-wrap", children: [showUsersTab && (_jsx(TabsTrigger, { value: "users", className: "cls_user_management_tabs_trigger flex-1", children: "Manage Users" })), showRolesTab && (_jsx(TabsTrigger, { value: "roles", className: "cls_user_management_tabs_trigger flex-1", children: "Roles" })), showPermissionsTab && (_jsx(TabsTrigger, { value: "permissions", className: "cls_user_management_tabs_trigger flex-1", children: "Permissions" })), showScopeHierarchyTab && (_jsx(TabsTrigger, { value: "scope_hierarchy", className: "cls_user_management_tabs_trigger flex-1", children: "Scope Hierarchy" })), showUserScopesTab && (_jsx(TabsTrigger, { value: "user_scopes", className: "cls_user_management_tabs_trigger flex-1", children: "User Scopes" })), hasSystemPermission && (_jsx(TabsTrigger, { value: "legal_docs", className: "cls_user_management_tabs_trigger flex-1", children: "Legal Docs" }))] }), showUsersTab && (_jsx(TabsContent, { value: "users", className: "cls_user_management_tab_users w-full", children: usersLoading ? (_jsx("div", { className: "cls_user_management_users_loading flex items-center justify-center p-8", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-slate-400" }) })) : (_jsx("div", { className: "cls_user_management_users_table_container border rounded-lg overflow-auto w-full", children: _jsxs(Table, { className: "cls_user_management_users_table w-full", children: [_jsx(TableHeader, { className: "cls_user_management_users_table_header", children: _jsxs(TableRow, { className: "cls_user_management_users_table_header_row", children: [_jsx(TableHead, { className: "cls_user_management_users_table_header_profile_pic w-16", children: "Photo" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_id", children: "ID" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_name", children: "Name" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_email", children: "Email" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_email_verified", children: "Email Verified" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_is_active", children: "Active" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_last_logon", children: "Last Logon" }), _jsx(TableHead, { className: "cls_user_management_users_table_header_created_at", children: "Created At" }), userTypesEnabled && (_jsx(TableHead, { className: "cls_user_management_users_table_header_user_type", children: "User Type" })), _jsx(TableHead, { className: "cls_user_management_users_table_header_actions text-right", children: "Actions" })] }) }), _jsx(TableBody, { className: "cls_user_management_users_table_body", children: users.length === 0 ? (_jsx(TableRow, { className: "cls_user_management_users_table_row_empty", children: _jsx(TableCell, { colSpan: userTypesEnabled ? 10 : 9, className: "text-center text-muted-foreground py-8", children: "No users found." }) })) : (users.map((user) => (_jsxs(TableRow, { className: "cls_user_management_users_table_row cursor-pointer hover:bg-muted/50", onClick: () => {
|
|
551
569
|
setSelectedUser(user);
|
|
552
570
|
setUserDetailDialogOpen(true);
|
|
553
|
-
}, children: [_jsx(TableCell, { className: "cls_user_management_users_table_cell_profile_pic", children: _jsxs(Avatar, { className: "cls_user_management_users_table_avatar h-8 w-8", children: [_jsx(AvatarImage, { src: user.profile_picture_url || undefined, alt: user.name ? `Profile picture of ${user.name}` : "Profile picture", className: "cls_user_management_users_table_avatar_image" }), _jsx(AvatarFallback, { className: "cls_user_management_users_table_avatar_fallback bg-slate-200 text-slate-600 text-xs", children: getUserInitials(user) })] }) }), _jsxs(TableCell, { className: "cls_user_management_users_table_cell_id font-mono text-xs", children: [user.id.substring(0, 8), "..."] }), _jsx(TableCell, { className: "cls_user_management_users_table_cell_name", children: user.name || "-" }), _jsx(TableCell, { className: "cls_user_management_users_table_cell_email", children: user.email_address }), _jsx(TableCell, { className: "cls_user_management_users_table_cell_email_verified", children: user.email_verified ? (_jsx("span", { className: "text-green-600", children: "Yes" })) : (_jsx("span", { className: "text-red-600", children: "No" })) }), _jsx(TableCell, { className: "cls_user_management_users_table_cell_is_active", children: user.is_active ? (_jsx("span", { className: "text-green-600", children: "Active" })) : (_jsx("span", { className: "text-red-600", children: "Inactive" }))
|
|
571
|
+
}, children: [_jsx(TableCell, { className: "cls_user_management_users_table_cell_profile_pic", children: _jsxs(Avatar, { className: "cls_user_management_users_table_avatar h-8 w-8", children: [_jsx(AvatarImage, { src: user.profile_picture_url || undefined, alt: user.name ? `Profile picture of ${user.name}` : "Profile picture", className: "cls_user_management_users_table_avatar_image" }), _jsx(AvatarFallback, { className: "cls_user_management_users_table_avatar_fallback bg-slate-200 text-slate-600 text-xs", children: getUserInitials(user) })] }) }), _jsxs(TableCell, { className: "cls_user_management_users_table_cell_id font-mono text-xs", children: [user.id.substring(0, 8), "..."] }), _jsx(TableCell, { className: "cls_user_management_users_table_cell_name", children: user.name || "-" }), _jsx(TableCell, { className: "cls_user_management_users_table_cell_email", children: user.email_address }), _jsx(TableCell, { className: "cls_user_management_users_table_cell_email_verified", children: user.email_verified ? (_jsx("span", { className: "text-green-600", children: "Yes" })) : (_jsx("span", { className: "text-red-600", children: "No" })) }), _jsx(TableCell, { className: "cls_user_management_users_table_cell_is_active", children: _jsxs("div", { className: "flex flex-col gap-0.5", children: [user.is_active ? (_jsx("span", { className: "text-green-600", children: "Active" })) : (_jsx("span", { className: "text-red-600", children: "Inactive" })), user.legal_acceptance_status !== 'none' && (_jsx("span", { className: user.legal_acceptance_status === 'current'
|
|
572
|
+
? 'text-green-600 text-xs font-medium'
|
|
573
|
+
: 'text-amber-600 text-xs font-medium', children: user.legal_acceptance_status === 'current' ? '✓ Legal' : '⚠ Legal' }))] }) }), _jsx(TableCell, { className: "cls_user_management_users_table_cell_last_logon", children: user.last_logon
|
|
554
574
|
? new Date(user.last_logon).toLocaleDateString()
|
|
555
575
|
: "-" }), _jsx(TableCell, { className: "cls_user_management_users_table_cell_created_at", children: user.created_at
|
|
556
576
|
? new Date(user.created_at).toLocaleDateString()
|
|
@@ -578,7 +598,25 @@ export function UserManagementLayout({ className, hrbacEnabled = false, userType
|
|
|
578
598
|
setEditingPermission(permission);
|
|
579
599
|
setEditDescription(permission.description);
|
|
580
600
|
setEditPermissionDialogOpen(true);
|
|
581
|
-
}, variant: "outline", size: "sm", className: "cls_user_management_permissions_table_action_edit", children: [_jsx(Edit, { className: "h-4 w-4 mr-1" }), "Edit"] }), _jsxs(Button, { onClick: () => handleDeletePermission(permission), disabled: permissionsActionLoading, variant: "outline", size: "sm", className: "cls_user_management_permissions_table_action_delete text-destructive", children: [_jsx(Trash2, { className: "h-4 w-4 mr-1" }), "Delete"] })] })) }) })] }, `${permission.source}-${permission.id}-${permission.permission_name}`)))) })] }) }))] }) })), showScopeHierarchyTab && (_jsx(TabsContent, { value: "scope_hierarchy", className: "cls_user_management_tab_scope_hierarchy w-full", children: _jsx(ScopeHierarchyTab, {}) })), showUserScopesTab && (_jsx(TabsContent, { value: "user_scopes", className: "cls_user_management_tab_user_scopes w-full", children: _jsx(UserScopesTab, {}) }))
|
|
601
|
+
}, variant: "outline", size: "sm", className: "cls_user_management_permissions_table_action_edit", children: [_jsx(Edit, { className: "h-4 w-4 mr-1" }), "Edit"] }), _jsxs(Button, { onClick: () => handleDeletePermission(permission), disabled: permissionsActionLoading, variant: "outline", size: "sm", className: "cls_user_management_permissions_table_action_delete text-destructive", children: [_jsx(Trash2, { className: "h-4 w-4 mr-1" }), "Delete"] })] })) }) })] }, `${permission.source}-${permission.id}-${permission.permission_name}`)))) })] }) }))] }) })), showScopeHierarchyTab && (_jsx(TabsContent, { value: "scope_hierarchy", className: "cls_user_management_tab_scope_hierarchy w-full", children: _jsx(ScopeHierarchyTab, {}) })), showUserScopesTab && (_jsx(TabsContent, { value: "user_scopes", className: "cls_user_management_tab_user_scopes w-full", children: _jsx(UserScopesTab, {}) })), hasSystemPermission && (_jsx(TabsContent, { value: "legal_docs", className: "cls_user_management_tab_legal_docs w-full", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-lg font-semibold", children: "Legal Documents" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Publish a new required version to prompt existing users to re-accept on next login." })] }), (!legal_docs_tab_data || legal_docs_tab_data.docs.length === 0) && (_jsxs("p", { className: "text-sm text-muted-foreground", children: ["No legal docs configured. Add ", _jsx("code", { children: "[hazo_auth__legal_docs]" }), " to your INI config."] })), legal_docs_tab_data === null || legal_docs_tab_data === void 0 ? void 0 : legal_docs_tab_data.docs.map(doc => (_jsx("div", { className: "rounded-lg border p-4 space-y-2", children: _jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { children: [_jsx("p", { className: "font-medium", children: doc.title }), _jsxs("p", { className: "text-xs text-muted-foreground font-mono", children: ["Current: ", doc.hash.slice(0, 20), "\u2026"] }), _jsxs("p", { className: "text-xs text-muted-foreground font-mono", children: ["Required: ", doc.required_hash ? `${doc.required_hash.slice(0, 20)}…` : 'Never published'] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [doc.hash === doc.required_hash
|
|
602
|
+
? _jsx("span", { className: "text-green-600 text-sm", children: "\u2713 Up to date" })
|
|
603
|
+
: _jsx("span", { className: "text-amber-600 text-sm", children: "\u26A0 File changed" }), _jsx("button", { disabled: doc.hash === doc.required_hash || legal_publishing === doc.key, onClick: async () => {
|
|
604
|
+
set_legal_publishing(doc.key);
|
|
605
|
+
try {
|
|
606
|
+
const res = await fetch(`${apiBasePath}/legal_docs/publish`, {
|
|
607
|
+
method: 'POST',
|
|
608
|
+
headers: { 'Content-Type': 'application/json' },
|
|
609
|
+
body: JSON.stringify({ doc_key: doc.key }),
|
|
610
|
+
});
|
|
611
|
+
const result = await res.json();
|
|
612
|
+
if (result.ok) {
|
|
613
|
+
set_legal_docs_tab_data(null); // triggers refetch on next render
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
finally {
|
|
617
|
+
set_legal_publishing(null);
|
|
618
|
+
}
|
|
619
|
+
}, className: "text-sm px-3 py-1 rounded border disabled:opacity-50 hover:bg-muted transition-colors", children: legal_publishing === doc.key ? 'Publishing…' : 'Publish current version' })] })] }) }, doc.key)))] }) }))] })), _jsx(AlertDialog, { open: deactivateDialogOpen, onOpenChange: setDeactivateDialogOpen, children: _jsxs(AlertDialogContent, { className: "cls_user_management_deactivate_dialog", children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Deactivate User" }), _jsxs(AlertDialogDescription, { children: ["Are you sure you want to deactivate ", (selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.name) || (selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.email_address), "? They will not be able to log in until reactivated."] })] }), _jsxs(AlertDialogFooter, { className: "cls_user_management_deactivate_dialog_footer", children: [_jsx(AlertDialogAction, { onClick: handleDeactivateUser, disabled: usersActionLoading, className: "cls_user_management_deactivate_dialog_confirm", children: usersActionLoading ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "h-4 w-4 mr-2 animate-spin" }), "Deactivating..."] })) : ("Deactivate") }), _jsx(AlertDialogCancel, { onClick: () => {
|
|
582
620
|
setDeactivateDialogOpen(false);
|
|
583
621
|
setSelectedUser(null);
|
|
584
622
|
}, className: "cls_user_management_deactivate_dialog_cancel", children: "Cancel" })] })] }) }), _jsx(AlertDialog, { open: deleteDialogOpen, onOpenChange: setDeleteDialogOpen, children: _jsxs(AlertDialogContent, { className: "cls_user_management_delete_dialog", children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Delete User" }), _jsxs(AlertDialogDescription, { children: ["This will permanently delete ", (selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.name) || (selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.email_address), "'s account and all associated data. This cannot be undone."] })] }), _jsxs(AlertDialogFooter, { className: "cls_user_management_delete_dialog_footer", children: [_jsx(AlertDialogAction, { onClick: handleDeleteUser, disabled: usersActionLoading, className: "cls_user_management_delete_dialog_confirm bg-destructive text-destructive-foreground hover:bg-destructive/90", children: usersActionLoading ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "h-4 w-4 mr-2 animate-spin" }), "Deleting..."] })) : (_jsxs(_Fragment, { children: [_jsx(Trash2, { className: "h-4 w-4 mr-2" }), "Delete"] })) }), _jsx(AlertDialogCancel, { onClick: () => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { type VariantProps } from "class-variance-authority";
|
|
3
3
|
declare const buttonVariants: (props?: ({
|
|
4
|
-
variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" |
|
|
4
|
+
variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
|
|
5
5
|
size?: "default" | "sm" | "lg" | "icon" | null | undefined;
|
|
6
6
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
7
|
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "
|
|
2
|
+
declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "maxLength" | "value" | "onChange" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
|
|
3
3
|
value?: string;
|
|
4
4
|
onChange?: (newValue: string) => unknown;
|
|
5
5
|
maxLength: number;
|
|
@@ -12,7 +12,7 @@ declare const InputOTP: React.ForwardRefExoticComponent<(Omit<Omit<React.InputHT
|
|
|
12
12
|
} & {
|
|
13
13
|
render: (props: import("input-otp").RenderProps) => React.ReactNode;
|
|
14
14
|
children?: never;
|
|
15
|
-
} & React.RefAttributes<HTMLInputElement>, "ref"> | Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "
|
|
15
|
+
} & React.RefAttributes<HTMLInputElement>, "ref"> | Omit<Omit<React.InputHTMLAttributes<HTMLInputElement>, "maxLength" | "value" | "onChange" | "textAlign" | "onComplete" | "pushPasswordManagerStrategy" | "pasteTransformer" | "containerClassName" | "noScriptCSSFallback"> & {
|
|
16
16
|
value?: string;
|
|
17
17
|
onChange?: (newValue: string) => unknown;
|
|
18
18
|
maxLength: number;
|
|
@@ -7,7 +7,7 @@ declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogC
|
|
|
7
7
|
declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
|
|
8
8
|
declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
9
9
|
declare const SheetContent: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & VariantProps<(props?: ({
|
|
10
|
-
side?: "
|
|
10
|
+
side?: "left" | "right" | "top" | "bottom" | null | undefined;
|
|
11
11
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
|
|
12
12
|
declare const SheetHeader: {
|
|
13
13
|
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export * from "./contexts/hazo_auth_config.js";
|
|
|
3
3
|
export * from "./components/index.js";
|
|
4
4
|
export type { HazoAuthUser, HazoAuthResult, HazoAuthError, HazoAuthOptions, ScopeDetails, TenantOrganization, TenantAuthOptions, TenantAuthResult, RequiredTenantAuthResult, } from "./lib/auth/auth_types";
|
|
5
5
|
export { AuthenticationRequiredError, TenantRequiredError, TenantAccessDeniedError, } from "./lib/auth/auth_types.js";
|
|
6
|
+
export type { LegalDoc, LegalAcceptanceRecord, LegalAcceptanceMap } from './lib/legal/legal_docs_types';
|
|
6
7
|
export { cn, merge_class_names } from "./lib/utils.js";
|
|
7
8
|
export { HAZO_AUTH_PERMISSIONS, ALL_ADMIN_PERMISSIONS } from "./lib/constants.js";
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAG5C,cAAc,oBAAoB,CAAC;AAGnC,YAAY,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAG5C,cAAc,oBAAoB,CAAC;AAGnC,YAAY,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EAAE,QAAQ,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGxG,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { LegalAcceptanceMap } from '../legal/legal_docs_types';
|
|
1
2
|
/**
|
|
2
3
|
* User data structure returned by hazo_get_auth
|
|
3
4
|
*/
|
|
@@ -9,6 +10,7 @@ export type HazoAuthUser = {
|
|
|
9
10
|
profile_picture_url: string | null;
|
|
10
11
|
managed_by_user_id?: string | null;
|
|
11
12
|
app_user_data: Record<string, unknown> | null;
|
|
13
|
+
legal_acceptance: LegalAcceptanceMap | null;
|
|
12
14
|
};
|
|
13
15
|
/**
|
|
14
16
|
* Scope access information returned when scope checking is used
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth_types.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/auth_types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth_types.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/auth_types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAE9C,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC7C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GACtB;IACE,aAAa,EAAE,IAAI,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,eAAe,CAAC;CACpC,GACD;IACE,aAAa,EAAE,KAAK,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,EAAE,CAAC;IAChB,aAAa,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,CAAC;AAEN;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IAE/B,mBAAmB,EAAE,MAAM,EAAE;IAC7B,gBAAgB,EAAE,MAAM,EAAE;IAC1B,oBAAoB,EAAE,MAAM,EAAE;IAC9B,qBAAqB,CAAC,EAAE,MAAM;IAC9B,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;gBAJ7C,mBAAmB,EAAE,MAAM,EAAE,EAC7B,gBAAgB,EAAE,MAAM,EAAE,EAC1B,oBAAoB,EAAE,MAAM,EAAE,EAC9B,qBAAqB,CAAC,EAAE,MAAM,YAAA,EAC9B,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA;CAKvD;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAEhC,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;gBAD7D,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAKvE;AAID;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAEhB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG;IAChD;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB;IACE,aAAa,EAAE,IAAI,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxC,0EAA0E;IAC1E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,eAAe,CAAC;CACpC,GACD;IACE,aAAa,EAAE,KAAK,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,EAAE,CAAC;IAChB,aAAa,EAAE,KAAK,CAAC;IACrB,YAAY,EAAE,IAAI,CAAC;IACnB,0EAA0E;IAC1E,eAAe,EAAE,IAAI,CAAC;IACtB,WAAW,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,CAAC;AAEN;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG,gBAAgB,GAAG;IACxD,aAAa,EAAE,IAAI,CAAC;IACpB,YAAY,EAAE,kBAAkB,CAAC;CAClC,CAAC;AAIF;;;GAGG;AACH,qBAAa,aAAc,SAAQ,KAAK;aAGpB,IAAI,EAAE,MAAM;aACZ,WAAW,EAAE,MAAM;gBAFnC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM;CAKtC;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,aAAa;gBAChD,OAAO,GAAE,MAAkC;CAIxD;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;aAGlC,WAAW,EAAE,YAAY,EAAE;gBAD3C,OAAO,GAAE,MAAkC,EAC3B,WAAW,GAAE,YAAY,EAAO;CAKnD;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,aAAa;aAEtC,QAAQ,EAAE,MAAM;aAChB,WAAW,EAAE,YAAY,EAAE;gBAD3B,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,YAAY,EAAO;CAKnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hazo_get_auth.server.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/hazo_get_auth.server.ts"],"names":[],"mappings":"AAEA,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK1C,OAAO,KAAK,EACV,cAAc,EAEd,eAAe,EAGhB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"hazo_get_auth.server.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/hazo_get_auth.server.ts"],"names":[],"mappings":"AAEA,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK1C,OAAO,KAAK,EACV,cAAc,EAEd,eAAe,EAGhB,MAAM,cAAc,CAAC;AA+DtB;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAU1D;AA6SD;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,cAAc,CAAC,CAmNzB"}
|