@alepha/ui 0.14.4 → 0.15.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/dist/admin/AdminAudits-ColpiP4T.js +3 -0
- package/dist/admin/{AdminAudits-DIrCCPk3.js → AdminAudits-DClGEVBj.js} +1 -1
- package/dist/admin/{AdminAudits-DIrCCPk3.js.map → AdminAudits-DClGEVBj.js.map} +1 -1
- package/dist/admin/AdminFiles-C5pqXN5B.js +3 -0
- package/dist/admin/{AdminFiles-RsL178Ta.js → AdminFiles-C76r1_Xz.js} +3 -3
- package/dist/admin/AdminFiles-C76r1_Xz.js.map +1 -0
- package/dist/admin/AdminLayout-BfeFXiul.js +3 -0
- package/dist/admin/{AdminLayout-XiSivwWH.js → AdminLayout-QJLIesuG.js} +1 -1
- package/dist/admin/{AdminLayout-XiSivwWH.js.map → AdminLayout-QJLIesuG.js.map} +1 -1
- package/dist/admin/AdminNotifications-BXixCBu9.js +3 -0
- package/dist/admin/{AdminNotifications-cIbywWKi.js → AdminNotifications-Bsalygm5.js} +3 -3
- package/dist/admin/AdminNotifications-Bsalygm5.js.map +1 -0
- package/dist/admin/{AdminParameters-D-q3Qmhv.js → AdminParameters-Bmxtnpv-.js} +1 -1
- package/dist/admin/{AdminParameters-D-q3Qmhv.js.map → AdminParameters-Bmxtnpv-.js.map} +1 -1
- package/dist/admin/{AdminParameters-BKObzzpN.js → AdminParameters-CpmAWwqN.js} +1 -1
- package/dist/admin/AdminSessions-CrkRvey3.js +3 -0
- package/dist/admin/{AdminSessions-vOgkrQ2U.js → AdminSessions-DmK3R6pP.js} +3 -3
- package/dist/admin/AdminSessions-DmK3R6pP.js.map +1 -0
- package/dist/admin/{AdminUserAudits-CSsN1fIC.js → AdminUserAudits-BPMP1Qd2.js} +1 -1
- package/dist/admin/{AdminUserAudits-CSsN1fIC.js.map → AdminUserAudits-BPMP1Qd2.js.map} +1 -1
- package/dist/admin/{AdminUserAudits-DmAnivo3.js → AdminUserAudits-Brcenss9.js} +1 -1
- package/dist/admin/{AdminUserCreate-B72nu-3W.js → AdminUserCreate-CZjB6NKc.js} +1 -1
- package/dist/admin/{AdminUserCreate-B72nu-3W.js.map → AdminUserCreate-CZjB6NKc.js.map} +1 -1
- package/dist/admin/{AdminUserCreate-DpA13zwj.js → AdminUserCreate-Cx8bkYC2.js} +1 -1
- package/dist/admin/{AdminUserDetails-Zib_B6Al.js → AdminUserDetails-8TYsqQBy.js} +1 -1
- package/dist/admin/{AdminUserDetails-CKM2IEMr.js → AdminUserDetails-DuqCOBJK.js} +1 -1
- package/dist/admin/{AdminUserDetails-CKM2IEMr.js.map → AdminUserDetails-DuqCOBJK.js.map} +1 -1
- package/dist/admin/{AdminUserLayout-BNBOEiAO.js → AdminUserLayout-Bz2u_zQ4.js} +1 -1
- package/dist/admin/{AdminUserLayout-D7En9UBq.js → AdminUserLayout-Dgk8s7Cd.js} +1 -1
- package/dist/admin/{AdminUserLayout-D7En9UBq.js.map → AdminUserLayout-Dgk8s7Cd.js.map} +1 -1
- package/dist/admin/{AdminUserSessions-DEaGu6n6.js → AdminUserSessions-DCpe8_T6.js} +1 -1
- package/dist/admin/{AdminUserSessions-DEaGu6n6.js.map → AdminUserSessions-DCpe8_T6.js.map} +1 -1
- package/dist/admin/AdminUserSessions-beiJqY2D.js +3 -0
- package/dist/admin/AdminUserSettings-CxlInVnu.js +3 -0
- package/dist/admin/{AdminUserSettings-Di73D7g2.js → AdminUserSettings-qxDfowqh.js} +1 -1
- package/dist/admin/{AdminUserSettings-Di73D7g2.js.map → AdminUserSettings-qxDfowqh.js.map} +1 -1
- package/dist/admin/AdminUsers-Bd0wMP8v.js +3 -0
- package/dist/admin/{AdminUsers-BnGIRvmV.js → AdminUsers-ZlPsDz0T.js} +3 -3
- package/dist/admin/AdminUsers-ZlPsDz0T.js.map +1 -0
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +28 -28
- package/dist/admin/index.js.map +1 -1
- package/dist/auth/{AuthLayout-B1sUB8fB.js → AuthLayout-CWzQ8rCe.js} +1 -1
- package/dist/auth/{AuthLayout-B1sUB8fB.js.map → AuthLayout-CWzQ8rCe.js.map} +1 -1
- package/dist/{demo/IconGoogle-DvmFiEDB.js → auth/IconGoogle-DpSlPZ1u.js} +1 -1
- package/dist/auth/{IconGoogle-Cm5d8J3f.js.map → IconGoogle-DpSlPZ1u.js.map} +1 -1
- package/dist/auth/Login-CxOPyNFP.js +4 -0
- package/dist/auth/{Login-Cjxv3EDi.js → Login-CyvKwy5e.js} +2 -2
- package/dist/auth/Login-CyvKwy5e.js.map +1 -0
- package/dist/auth/{Register-BKBIpHhW.js → Register-C7Zp09Ks.js} +6 -3
- package/dist/auth/Register-C7Zp09Ks.js.map +1 -0
- package/dist/auth/Register-Cacr7YbA.js +4 -0
- package/dist/auth/ResetPassword-CMkx8Ibf.js +3 -0
- package/dist/auth/{ResetPassword-DvqD_1SJ.js → ResetPassword-DYJSUC6B.js} +1 -1
- package/dist/auth/ResetPassword-DYJSUC6B.js.map +1 -0
- package/dist/auth/{VerifyEmail-VaBruOnO.js → VerifyEmail-CNXFIwWW.js} +1 -1
- package/dist/auth/{VerifyEmail-VaBruOnO.js.map → VerifyEmail-CNXFIwWW.js.map} +1 -1
- package/dist/auth/VerifyEmail-DKyDlz96.js +3 -0
- package/dist/auth/index.d.ts +20 -16
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +14 -14
- package/dist/auth/index.js.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +15 -15
- package/dist/core/index.js.map +1 -1
- package/dist/demo/{DemoDataTable-2mzzf__a.js → DemoDataTable-DYbDYbs5.js} +2 -2
- package/dist/demo/{DemoDataTable-2mzzf__a.js.map → DemoDataTable-DYbDYbs5.js.map} +1 -1
- package/dist/demo/{DemoHome-CnuL5WV9.js → DemoHome-Cce2bWmg.js} +1 -1
- package/dist/demo/{DemoHome-CnuL5WV9.js.map → DemoHome-Cce2bWmg.js.map} +1 -1
- package/dist/demo/DemoHome-DC9qkMNe.js +3 -0
- package/dist/demo/{DemoJsonViewer-NUGst5wW.js → DemoJsonViewer-D_Hff1Q2.js} +2 -2
- package/dist/demo/{DemoJsonViewer-NUGst5wW.js.map → DemoJsonViewer-D_Hff1Q2.js.map} +1 -1
- package/dist/demo/DemoJsonViewer-DbWVDdz_.js +4 -0
- package/dist/demo/{DemoLayout-dvbeuBBf.js → DemoLayout-DjIDm93B.js} +1 -1
- package/dist/demo/{DemoLayout-dvbeuBBf.js.map → DemoLayout-DjIDm93B.js.map} +1 -1
- package/dist/demo/DemoLayout-nNMajP_9.js +3 -0
- package/dist/demo/{DemoLogin--wE44i23.js → DemoLogin-BA_HiIRZ.js} +4 -3
- package/dist/demo/DemoLogin-BA_HiIRZ.js.map +1 -0
- package/dist/demo/{DemoRegister-BtrMksx6.js → DemoRegister-B6syaxP9.js} +8 -4
- package/dist/demo/DemoRegister-B6syaxP9.js.map +1 -0
- package/dist/demo/{DemoResetPassword-DVXiiiX7.js → DemoResetPassword-BOcLG4GF.js} +3 -2
- package/dist/demo/DemoResetPassword-BOcLG4GF.js.map +1 -0
- package/dist/demo/{DemoSidebar-DWnjYHoP.js → DemoSidebar-DpZXf7GO.js} +2 -2
- package/dist/demo/{DemoSidebar-DWnjYHoP.js.map → DemoSidebar-DpZXf7GO.js.map} +1 -1
- package/dist/demo/{DemoTypeForm-P5_VInW2.js → DemoTypeForm-BlLAcQqZ.js} +2 -2
- package/dist/demo/{DemoTypeForm-P5_VInW2.js.map → DemoTypeForm-BlLAcQqZ.js.map} +1 -1
- package/dist/demo/{DemoVerifyEmail-C_ooC5u8.js → DemoVerifyEmail-C-J7bXUQ.js} +2 -2
- package/dist/demo/{DemoVerifyEmail-C_ooC5u8.js.map → DemoVerifyEmail-C-J7bXUQ.js.map} +1 -1
- package/dist/{auth/IconGoogle-Cm5d8J3f.js → demo/IconGoogle-CbBF8Hqq.js} +1 -1
- package/dist/demo/{IconGoogle-DvmFiEDB.js.map → IconGoogle-CbBF8Hqq.js.map} +1 -1
- package/dist/demo/{Showcase-vemLuO2t.js → Showcase-HchhcsHV.js} +3 -3
- package/dist/demo/Showcase-HchhcsHV.js.map +1 -0
- package/dist/demo/index.d.ts.map +1 -1
- package/dist/demo/index.js +14 -14
- package/dist/json/index.d.ts +1 -2
- package/dist/json/index.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/auth/AuthRouter.ts +6 -6
- package/src/auth/components/Login.tsx +2 -2
- package/src/auth/components/Register.tsx +8 -3
- package/src/auth/components/ResetPassword.tsx +2 -2
- package/src/demo/components/auth/DemoLogin.tsx +4 -3
- package/src/demo/components/auth/DemoRegister.tsx +4 -3
- package/src/demo/components/auth/DemoResetPassword.tsx +3 -2
- package/dist/admin/AdminAudits-B3EhKhN7.js +0 -3
- package/dist/admin/AdminFiles-C8OG4dtD.js +0 -3
- package/dist/admin/AdminFiles-RsL178Ta.js.map +0 -1
- package/dist/admin/AdminLayout-BnSmtA4x.js +0 -3
- package/dist/admin/AdminNotifications-BSL4B2fQ.js +0 -3
- package/dist/admin/AdminNotifications-cIbywWKi.js.map +0 -1
- package/dist/admin/AdminSessions-DHG9zPfr.js +0 -3
- package/dist/admin/AdminSessions-vOgkrQ2U.js.map +0 -1
- package/dist/admin/AdminUserSessions-D9X2_HMA.js +0 -3
- package/dist/admin/AdminUserSettings-yI-JECf5.js +0 -3
- package/dist/admin/AdminUsers-BnGIRvmV.js.map +0 -1
- package/dist/admin/AdminUsers-CG9-2Z8W.js +0 -3
- package/dist/auth/Login-BWi-pPbO.js +0 -4
- package/dist/auth/Login-Cjxv3EDi.js.map +0 -1
- package/dist/auth/Register-BKBIpHhW.js.map +0 -1
- package/dist/auth/Register-CtdvihIM.js +0 -4
- package/dist/auth/ResetPassword-BUdM7T_R.js +0 -3
- package/dist/auth/ResetPassword-DvqD_1SJ.js.map +0 -1
- package/dist/auth/VerifyEmail-BYmtnkEl.js +0 -3
- package/dist/demo/DemoHome-D6Z7EE4V.js +0 -3
- package/dist/demo/DemoJsonViewer-CYUggLop.js +0 -4
- package/dist/demo/DemoLayout-ZFDzyvY3.js +0 -3
- package/dist/demo/DemoLogin--wE44i23.js.map +0 -1
- package/dist/demo/DemoRegister-BtrMksx6.js.map +0 -1
- package/dist/demo/DemoResetPassword-DVXiiiX7.js.map +0 -1
- package/dist/demo/Showcase-vemLuO2t.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DemoVerifyEmail-
|
|
1
|
+
{"version":3,"file":"DemoVerifyEmail-C-J7bXUQ.js","names":["Showcase","VerifyEmail"],"sources":["../../src/auth/components/VerifyEmail.tsx","../../src/demo/components/auth/DemoVerifyEmail.tsx"],"sourcesContent":["import { useClient } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { useRouter, useRouterState } from \"@alepha/react/router\";\nimport { ActionButton } from \"@alepha/ui\";\nimport { Alert, Card, Flex, Loader, Stack, Text } from \"@mantine/core\";\nimport { IconAlertCircle, IconCheck, IconMailCheck } from \"@tabler/icons-react\";\nimport type { UserController } from \"alepha/api/users\";\nimport { useEffect, useState } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\nimport type { AuthRouter } from \"../AuthRouter.ts\";\n\nexport type VerifyEmailProps = {};\n\ntype Step = \"verifying\" | \"success\" | \"error\";\n\nconst VerifyEmail = (_props: VerifyEmailProps) => {\n const router = useRouter<AuthRouter>();\n const state = useRouterState();\n const userCtrl = useClient<UserController>();\n const { tr } = useI18n<AuthI18n, \"en\">();\n\n const [step, setStep] = useState<Step>(\"verifying\");\n const [error, setError] = useState<string | null>(null);\n\n const email = state.query.email as string | undefined;\n const token = state.query.token as string | undefined;\n\n useEffect(() => {\n const verify = async () => {\n if (!email || !token) {\n setError(tr(\"verifyEmailMissingParams\"));\n setStep(\"error\");\n return;\n }\n\n try {\n await userCtrl.verifyEmail({\n body: { email, token },\n });\n setStep(\"success\");\n } catch (err) {\n setError(err instanceof Error ? err.message : tr(\"verifyEmailFailed\"));\n setStep(\"error\");\n }\n };\n\n verify();\n }, [email, token]);\n\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Stack gap=\"sm\" w={400}>\n <Card withBorder p=\"lg\" bg=\"var(--alepha-elevated)\">\n <Stack gap=\"md\" align=\"center\">\n {step === \"verifying\" && (\n <>\n <Loader size=\"lg\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailVerifying\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {tr(\"verifyEmailPleaseWait\")}\n </Text>\n </>\n )}\n\n {step === \"success\" && (\n <>\n <IconMailCheck size={48} color=\"var(--mantine-color-green-6)\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"green\" icon={<IconCheck />}>\n <Text size=\"sm\">{tr(\"verifyEmailSuccess\")}</Text>\n </Alert>\n <ActionButton href={router.path(\"login\")} fullWidth>\n {tr(\"verifyEmailSignIn\")}\n </ActionButton>\n </>\n )}\n\n {step === \"error\" && (\n <>\n <IconAlertCircle size={48} color=\"var(--mantine-color-red-6)\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"red\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">{error || tr(\"verifyEmailFailed\")}</Text>\n </Alert>\n <ActionButton href={router.path(\"login\")} fullWidth>\n {tr(\"verifyEmailBackToSignIn\")}\n </ActionButton>\n </>\n )}\n </Stack>\n </Card>\n </Stack>\n </Flex>\n );\n};\n\nexport default VerifyEmail;\n","import { t } from \"alepha\";\nimport VerifyEmail from \"../../../auth/components/VerifyEmail.tsx\";\nimport Showcase from \"../shared/Showcase.tsx\";\n\nconst showcaseSchema = t.object({\n placeholder: t.boolean({\n title: \"Demo Mode\",\n default: true,\n $control: { switch: true },\n }),\n});\n\nconst DemoVerifyEmail = () => {\n return (\n <Showcase\n title=\"VerifyEmail\"\n schema={showcaseSchema}\n initialValues={{\n placeholder: true,\n }}\n columns={1}\n >\n {() => <VerifyEmail />}\n </Showcase>\n );\n};\n\nexport default DemoVerifyEmail;\n"],"mappings":";;;;;;;;;;;;AAeA,MAAM,eAAe,WAA6B;CAChD,MAAM,SAAS,WAAuB;CACtC,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,WAAW,WAA2B;CAC5C,MAAM,EAAE,OAAO,SAAyB;CAExC,MAAM,CAAC,MAAM,WAAW,SAAe,YAAY;CACnD,MAAM,CAAC,OAAO,YAAY,SAAwB,KAAK;CAEvD,MAAM,QAAQ,MAAM,MAAM;CAC1B,MAAM,QAAQ,MAAM,MAAM;AAE1B,iBAAgB;EACd,MAAM,SAAS,YAAY;AACzB,OAAI,CAAC,SAAS,CAAC,OAAO;AACpB,aAAS,GAAG,2BAA2B,CAAC;AACxC,YAAQ,QAAQ;AAChB;;AAGF,OAAI;AACF,UAAM,SAAS,YAAY,EACzB,MAAM;KAAE;KAAO;KAAO,EACvB,CAAC;AACF,YAAQ,UAAU;YACX,KAAK;AACZ,aAAS,eAAe,QAAQ,IAAI,UAAU,GAAG,oBAAoB,CAAC;AACtE,YAAQ,QAAQ;;;AAIpB,UAAQ;IACP,CAAC,OAAO,MAAM,CAAC;AAElB,QACE,oBAAC;EAAK,MAAM;EAAG,SAAQ;EAAS,OAAM;YACpC,oBAAC;GAAM,KAAI;GAAK,GAAG;aACjB,oBAAC;IAAK;IAAW,GAAE;IAAK,IAAG;cACzB,qBAAC;KAAM,KAAI;KAAK,OAAM;;MACnB,SAAS,eACR;OACE,oBAAC,UAAO,MAAK,OAAO;OACpB,oBAAC;QAAK,MAAK;QAAK,IAAI;QAAK,IAAG;kBACzB,GAAG,uBAAuB;SACtB;OACP,oBAAC;QAAK,MAAK;QAAK,GAAE;QAAS,IAAG;kBAC3B,GAAG,wBAAwB;SACvB;UACN;MAGJ,SAAS,aACR;OACE,oBAAC;QAAc,MAAM;QAAI,OAAM;SAAiC;OAChE,oBAAC;QAAK,MAAK;QAAK,IAAI;QAAK,IAAG;kBACzB,GAAG,mBAAmB;SAClB;OACP,oBAAC;QAAM,SAAQ;QAAQ,OAAM;QAAQ,MAAM,oBAAC,cAAY;kBACtD,oBAAC;SAAK,MAAK;mBAAM,GAAG,qBAAqB;UAAQ;SAC3C;OACR,oBAAC;QAAa,MAAM,OAAO,KAAK,QAAQ;QAAE;kBACvC,GAAG,oBAAoB;SACX;UACd;MAGJ,SAAS,WACR;OACE,oBAAC;QAAgB,MAAM;QAAI,OAAM;SAA+B;OAChE,oBAAC;QAAK,MAAK;QAAK,IAAI;QAAK,IAAG;kBACzB,GAAG,mBAAmB;SAClB;OACP,oBAAC;QAAM,SAAQ;QAAQ,OAAM;QAAM,MAAM,oBAAC,oBAAkB;kBAC1D,oBAAC;SAAK,MAAK;mBAAM,SAAS,GAAG,oBAAoB;UAAQ;SACnD;OACR,oBAAC;QAAa,MAAM,OAAO,KAAK,QAAQ;QAAE;kBACvC,GAAG,0BAA0B;SACjB;UACd;;MAEC;KACH;IACD;GACH;;AAIX,0BAAe;;;;AClGf,MAAM,iBAAiB,EAAE,OAAO,EAC9B,aAAa,EAAE,QAAQ;CACrB,OAAO;CACP,SAAS;CACT,UAAU,EAAE,QAAQ,MAAM;CAC3B,CAAC,EACH,CAAC;AAEF,MAAM,wBAAwB;AAC5B,QACE,oBAACA;EACC,OAAM;EACN,QAAQ;EACR,eAAe,EACb,aAAa,MACd;EACD,SAAS;kBAEF,oBAACC,wBAAc;GACb;;AAIf,8BAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconGoogle-
|
|
1
|
+
{"version":3,"file":"IconGoogle-CbBF8Hqq.js","names":[],"sources":["../../src/auth/components/icons/IconGithub.tsx","../../src/auth/components/icons/IconGoogle.tsx"],"sourcesContent":["const IconGithub = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 1024 1024\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z\"\n transform=\"scale(64)\"\n fill={\"var(--alepha-text)\"}\n />\n </svg>\n );\n};\n\nexport default IconGithub;\n","const IconGoogle = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n <path d=\"M1 1h22v22H1z\" fill=\"none\" />\n </svg>\n );\n};\n\nexport default IconGoogle;\n"],"mappings":";;;AAAA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC;GACC,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;IACN;GACE;;AAIV,yBAAe;;;;ACpBf,MAAM,mBAAmB;AACvB,QACE,qBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;;GAEN,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IAAK,GAAE;IAAgB,MAAK;KAAS;;GAClC;;AAIV,yBAAe"}
|
|
@@ -117,8 +117,8 @@ const Showcase = ({ title, schema, initialValues, columns = 3, children, windowP
|
|
|
117
117
|
const form = useForm({
|
|
118
118
|
schema,
|
|
119
119
|
initialValues,
|
|
120
|
-
handler: (values
|
|
121
|
-
setValues(values
|
|
120
|
+
handler: (values) => {
|
|
121
|
+
setValues(values);
|
|
122
122
|
},
|
|
123
123
|
onChange: (key, value) => {
|
|
124
124
|
console.log("onChange", key, value);
|
|
@@ -184,4 +184,4 @@ var Showcase_default = Showcase;
|
|
|
184
184
|
|
|
185
185
|
//#endregion
|
|
186
186
|
export { MacWindow_default as n, Showcase_default as t };
|
|
187
|
-
//# sourceMappingURL=Showcase-
|
|
187
|
+
//# sourceMappingURL=Showcase-HchhcsHV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Showcase-HchhcsHV.js","names":["MacWindow"],"sources":["../../src/demo/components/shared/MacWindow.tsx","../../src/demo/components/shared/Showcase.tsx"],"sourcesContent":["import { Box, type BoxProps, Flex, SegmentedControl } from \"@mantine/core\";\nimport { type ReactNode, useState } from \"react\";\n\nexport interface MacWindowProps {\n children: ReactNode;\n title?: string;\n containerProps?: BoxProps;\n fill?: boolean;\n}\n\ntype WindowSize = \"25\" | \"50\" | \"75\" | \"100\";\n\nconst MacWindow = ({\n children,\n title,\n containerProps,\n fill,\n}: MacWindowProps) => {\n const [size, setSize] = useState<WindowSize>(\"100\");\n\n const getWidth = () => {\n return `${size}%`;\n };\n\n return (\n <Flex\n direction=\"column\"\n flex={fill ? 1 : undefined}\n h={fill ? \"100%\" : undefined}\n bdrs={\"md\"}\n style={{\n width: getWidth(),\n border: \"1px solid var(--mantine-color-default-border)\",\n overflow: \"hidden\",\n background: \"var(--mantine-color-body)\",\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.15)\",\n transition: \"width 0.3s ease\",\n }}\n >\n <Flex\n h={36}\n px=\"sm\"\n align=\"center\"\n gap={8}\n style={{\n background: \"var(--mantine-color-default)\",\n borderBottom: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <Flex gap={6}>\n <Box\n w={12}\n h={12}\n style={{ borderRadius: \"50%\", background: \"#ff5f57\" }}\n />\n <Box\n w={12}\n h={12}\n style={{ borderRadius: \"50%\", background: \"#febc2e\" }}\n />\n <Box\n w={12}\n h={12}\n style={{ borderRadius: \"50%\", background: \"#28c840\" }}\n />\n </Flex>\n\n <Box\n style={{\n flex: 1,\n textAlign: \"center\",\n fontSize: 13,\n color: \"var(--mantine-color-dimmed)\",\n }}\n >\n {title}\n </Box>\n\n {fill ? undefined : (\n <SegmentedControl\n size=\"xs\"\n value={size}\n onChange={(v) => setSize(v as WindowSize)}\n data={[\n { label: \"25\", value: \"25\" },\n { label: \"50\", value: \"50\" },\n { label: \"75\", value: \"75\" },\n { label: \"100\", value: \"100\" },\n ]}\n />\n )}\n </Flex>\n <Flex\n direction={\"column\"}\n flex={fill ? 1 : undefined}\n p=\"md\"\n {...containerProps}\n >\n {children}\n </Flex>\n </Flex>\n );\n};\n\nexport default MacWindow;\n","import { useForm } from \"@alepha/react/form\";\nimport { TypeForm, ui } from \"@alepha/ui\";\nimport { Box, Card, Flex, Text } from \"@mantine/core\";\nimport type { Static, TObject } from \"alepha\";\nimport { type ReactNode, useState } from \"react\";\nimport MacWindow, { type MacWindowProps } from \"./MacWindow.tsx\";\n\nexport interface ShowcaseProps<T extends TObject> {\n /**\n * Component title\n */\n title: string;\n /**\n * Schema for the props configuration\n */\n schema: T;\n /**\n * Initial values for the props\n */\n initialValues?: Partial<Static<T>>;\n /**\n * Number of columns for the props form\n */\n columns?: number;\n /**\n * Render function that receives the current props values\n */\n children: (props: Static<T>) => ReactNode;\n /**\n * Additional props for the MacWindow container\n */\n windowProps?: Partial<MacWindowProps>;\n}\n\n/**\n * Showcase component for demonstrating UI components with interactive props configuration.\n * Uses TypeForm to render a form based on the props schema and displays the component preview.\n */\nconst Showcase = <T extends TObject>({\n title,\n schema,\n initialValues,\n columns = 3,\n children,\n windowProps,\n}: ShowcaseProps<T>) => {\n const [values, setValues] = useState<Record<string, any>>(\n initialValues ?? {},\n );\n\n const form = useForm(\n {\n schema,\n initialValues,\n handler: (values) => {\n setValues(values as Record<string, any>);\n },\n onChange: (key, value) => {\n console.log(\"onChange\", key, value);\n form.submit();\n },\n },\n [schema],\n );\n\n return (\n <Flex flex={1} h={\"100%\"}>\n <Flex\n flex={1}\n bg={ui.colors.background}\n h={\"100%\"}\n p=\"xl\"\n justify=\"center\"\n align=\"flex-start\"\n style={{ flex: 1, minWidth: 0, overflow: \"auto\" }}\n >\n <MacWindow title={title} {...windowProps}>\n {children(values as Static<T>)}\n </MacWindow>\n </Flex>\n\n <Box\n bg={ui.colors.surface}\n h={\"100%\"}\n p={\"md\"}\n style={{\n flex: \"0 0 300px\",\n overflow: \"auto\",\n }}\n >\n <Card withBorder shadow=\"sm\" radius=\"md\" bg={ui.colors.elevated}>\n <Card.Section withBorder py={\"xs\"} inheritPadding>\n <Text size={\"xs\"} fw={500}>\n {title} Props\n </Text>\n </Card.Section>\n\n <Card.Section p={\"sm\"}>\n <TypeForm\n form={form}\n columns={columns}\n skipSubmitButton\n skipFormElement\n />\n </Card.Section>\n </Card>\n </Box>\n </Flex>\n );\n};\n\nexport default Showcase;\n"],"mappings":";;;;;;;AAYA,MAAM,aAAa,EACjB,UACA,OACA,gBACA,WACoB;CACpB,MAAM,CAAC,MAAM,WAAW,SAAqB,MAAM;CAEnD,MAAM,iBAAiB;AACrB,SAAO,GAAG,KAAK;;AAGjB,QACE,qBAAC;EACC,WAAU;EACV,MAAM,OAAO,IAAI;EACjB,GAAG,OAAO,SAAS;EACnB,MAAM;EACN,OAAO;GACL,OAAO,UAAU;GACjB,QAAQ;GACR,UAAU;GACV,YAAY;GACZ,WAAW;GACX,YAAY;GACb;aAED,qBAAC;GACC,GAAG;GACH,IAAG;GACH,OAAM;GACN,KAAK;GACL,OAAO;IACL,YAAY;IACZ,cAAc;IACf;;IAED,qBAAC;KAAK,KAAK;;MACT,oBAAC;OACC,GAAG;OACH,GAAG;OACH,OAAO;QAAE,cAAc;QAAO,YAAY;QAAW;QACrD;MACF,oBAAC;OACC,GAAG;OACH,GAAG;OACH,OAAO;QAAE,cAAc;QAAO,YAAY;QAAW;QACrD;MACF,oBAAC;OACC,GAAG;OACH,GAAG;OACH,OAAO;QAAE,cAAc;QAAO,YAAY;QAAW;QACrD;;MACG;IAEP,oBAAC;KACC,OAAO;MACL,MAAM;MACN,WAAW;MACX,UAAU;MACV,OAAO;MACR;eAEA;MACG;IAEL,OAAO,SACN,oBAAC;KACC,MAAK;KACL,OAAO;KACP,WAAW,MAAM,QAAQ,EAAgB;KACzC,MAAM;MACJ;OAAE,OAAO;OAAM,OAAO;OAAM;MAC5B;OAAE,OAAO;OAAM,OAAO;OAAM;MAC5B;OAAE,OAAO;OAAM,OAAO;OAAM;MAC5B;OAAE,OAAO;OAAO,OAAO;OAAO;MAC/B;MACD;;IAEC,EACP,oBAAC;GACC,WAAW;GACX,MAAM,OAAO,IAAI;GACjB,GAAE;GACF,GAAI;GAEH;IACI;GACF;;AAIX,wBAAe;;;;;;;;AClEf,MAAM,YAA+B,EACnC,OACA,QACA,eACA,UAAU,GACV,UACA,kBACsB;CACtB,MAAM,CAAC,QAAQ,aAAa,SAC1B,iBAAiB,EAAE,CACpB;CAED,MAAM,OAAO,QACX;EACE;EACA;EACA,UAAU,WAAW;AACnB,aAAU,OAA8B;;EAE1C,WAAW,KAAK,UAAU;AACxB,WAAQ,IAAI,YAAY,KAAK,MAAM;AACnC,QAAK,QAAQ;;EAEhB,EACD,CAAC,OAAO,CACT;AAED,QACE,qBAAC;EAAK,MAAM;EAAG,GAAG;aAChB,oBAAC;GACC,MAAM;GACN,IAAI,GAAG,OAAO;GACd,GAAG;GACH,GAAE;GACF,SAAQ;GACR,OAAM;GACN,OAAO;IAAE,MAAM;IAAG,UAAU;IAAG,UAAU;IAAQ;aAEjD,oBAACA;IAAiB;IAAO,GAAI;cAC1B,SAAS,OAAoB;KACpB;IACP,EAEP,oBAAC;GACC,IAAI,GAAG,OAAO;GACd,GAAG;GACH,GAAG;GACH,OAAO;IACL,MAAM;IACN,UAAU;IACX;aAED,qBAAC;IAAK;IAAW,QAAO;IAAK,QAAO;IAAK,IAAI,GAAG,OAAO;eACrD,oBAAC,KAAK;KAAQ;KAAW,IAAI;KAAM;eACjC,qBAAC;MAAK,MAAM;MAAM,IAAI;iBACnB,OAAM;OACF;MACM,EAEf,oBAAC,KAAK;KAAQ,GAAG;eACf,oBAAC;MACO;MACG;MACT;MACA;OACA;MACW;KACV;IACH;GACD;;AAIX,uBAAe"}
|
package/dist/demo/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/demo/components/DemoHome.tsx","../../src/demo/components/DemoLayout.tsx","../../src/demo/components/json/DemoJsonViewer.tsx","../../src/demo/components/shared/MacWindow.tsx","../../src/demo/components/shared/Showcase.tsx","../../src/demo/DemoRouter.ts","../../src/demo/index.ts"],"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/demo/components/DemoHome.tsx","../../src/demo/components/DemoLayout.tsx","../../src/demo/components/json/DemoJsonViewer.tsx","../../src/demo/components/shared/MacWindow.tsx","../../src/demo/components/shared/Showcase.tsx","../../src/demo/DemoRouter.ts","../../src/demo/index.ts"],"mappings":";;;;;;;;cAaM,QAAA,QAAQ,kBAAA,CAAA,GAAA,CAAA,OAAA;;;cCRR,UAAA,QAAU,kBAAA,CAAA,GAAA,CAAA,OAAA;;;cC6EV,cAAA,QAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UC/EH,cAAA;EACf,QAAA,EAAU,SAAA;EACV,KAAA;EACA,cAAA,GAAiB,QAAA;EACjB,IAAA;AAAA;AAAA,cAKI,SAAA;EAAa,QAAA;EAAA,KAAA;EAAA,cAAA;EAAA;AAAA,GAKhB,cAAA,KAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCVA,aAAA,WAAwB,OAAA;;;;EAIvC,KAAA;EJEI;;;EIEJ,MAAA,EAAQ,CAAA;EJWT;;;EIPC,aAAA,GAAgB,OAAA,CAAQ,MAAA,CAAO,CAAA;EHd3B;;;EGkBJ,OAAA;EH0BD;;;EGtBC,QAAA,GAAW,KAAA,EAAO,MAAA,CAAO,CAAA,MAAO,SAAA;EFuD5B;;;EEnDJ,WAAA,GAAc,OAAA,CAAQ,cAAA;AAAA;;;;AD5BxB;cCmCM,QAAA,aAAsB,OAAA;EAAS,KAAA;EAAA,MAAA;EAAA,aAAA;EAAA,OAAA;EAAA,QAAA;EAAA;AAAA,GAOlC,aAAA,CAAc,CAAA,MAAE,kBAAA,CAAA,GAAA,CAAA,OAAA;;;cC5BN,UAAA;EACX,UAAA,EAAU,qBAAA,CAAA,aAAA,CADW,qBAAA,CACX,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAaV,QAAA,EAAQ,qBAAA,CAAA,aAAA,CAbE,qBAAA,CAaF,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAQR,QAAA,EAAQ,qBAAA,CAAA,aAAA,CARA,qBAAA,CAQA,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAOR,YAAA,EAAY,qBAAA,CAAA,aAAA,CAPJ,qBAAA,CAOI,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAOZ,WAAA,EAAW,qBAAA,CAAA,aAAA,CAPC,qBAAA,CAOD,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAOX,aAAA,EAAa,qBAAA,CAAA,aAAA,CAPF,qBAAA,CAOE,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAQb,QAAA,EAAQ,qBAAA,CAAA,aAAA,CARK,qBAAA,CAQL,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAOR,cAAA,EAAc,qBAAA,CAAA,aAAA,CAPN,qBAAA,CAOM,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAQd,QAAA,EAAQ,qBAAA,CAAA,aAAA,CARM,qBAAA,CAQN,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAYR,SAAA,EAAS,qBAAA,CAAA,aAAA,CAZD,qBAAA,CAYC,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAOT,YAAA,EAAY,qBAAA,CAAA,aAAA,CAPH,qBAAA,CAOG,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAOZ,iBAAA,EAAiB,qBAAA,CAAA,aAAA,CAPL,qBAAA,CAOK,gBAAA,OAAA,qBAAA,CAAA,mBAAA;EAOjB,eAAA,EAAe,qBAAA,CAAA,aAAA,CAPE,qBAAA,CAOF,gBAAA,OAAA,qBAAA,CAAA,mBAAA;AAAA;;;;;ALvGH;;;cMaD,YAAA,EAAY,OAAA,CAAA,OAAA,CAGvB,OAAA,CAHuB,MAAA"}
|
package/dist/demo/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { t as DemoHome_default } from "./DemoHome-
|
|
2
|
-
import { t as DemoLayout_default } from "./DemoLayout-
|
|
3
|
-
import { t as DemoJsonViewer_default } from "./DemoJsonViewer-
|
|
4
|
-
import { n as MacWindow_default, t as Showcase_default } from "./Showcase-
|
|
1
|
+
import { t as DemoHome_default } from "./DemoHome-Cce2bWmg.js";
|
|
2
|
+
import { t as DemoLayout_default } from "./DemoLayout-DjIDm93B.js";
|
|
3
|
+
import { t as DemoJsonViewer_default } from "./DemoJsonViewer-D_Hff1Q2.js";
|
|
4
|
+
import { n as MacWindow_default, t as Showcase_default } from "./Showcase-HchhcsHV.js";
|
|
5
5
|
import { AlephaUI } from "@alepha/ui";
|
|
6
6
|
import { $module } from "alepha";
|
|
7
7
|
import { $page } from "@alepha/react/router";
|
|
@@ -13,7 +13,7 @@ var DemoRouter = class {
|
|
|
13
13
|
icon: IconPackages,
|
|
14
14
|
path: "/demo",
|
|
15
15
|
label: "Demo",
|
|
16
|
-
lazy: () => import("./DemoLayout-
|
|
16
|
+
lazy: () => import("./DemoLayout-nNMajP_9.js"),
|
|
17
17
|
children: () => [
|
|
18
18
|
this.demoHome,
|
|
19
19
|
this.demoCore,
|
|
@@ -25,7 +25,7 @@ var DemoRouter = class {
|
|
|
25
25
|
icon: IconHome,
|
|
26
26
|
path: "/",
|
|
27
27
|
label: "Home",
|
|
28
|
-
lazy: () => import("./DemoHome-
|
|
28
|
+
lazy: () => import("./DemoHome-DC9qkMNe.js")
|
|
29
29
|
});
|
|
30
30
|
demoCore = $page({
|
|
31
31
|
icon: IconWall,
|
|
@@ -41,19 +41,19 @@ var DemoRouter = class {
|
|
|
41
41
|
icon: IconForms,
|
|
42
42
|
path: "/type-form",
|
|
43
43
|
label: "TypeForm",
|
|
44
|
-
lazy: () => import("./DemoTypeForm-
|
|
44
|
+
lazy: () => import("./DemoTypeForm-BlLAcQqZ.js")
|
|
45
45
|
});
|
|
46
46
|
demoSidebar = $page({
|
|
47
47
|
icon: IconLayoutSidebar,
|
|
48
48
|
path: "/sidebar",
|
|
49
49
|
label: "Sidebar",
|
|
50
|
-
lazy: () => import("./DemoSidebar-
|
|
50
|
+
lazy: () => import("./DemoSidebar-DpZXf7GO.js")
|
|
51
51
|
});
|
|
52
52
|
demoDataTable = $page({
|
|
53
53
|
icon: IconTable,
|
|
54
54
|
path: "/data-table",
|
|
55
55
|
label: "DataTable",
|
|
56
|
-
lazy: () => import("./DemoDataTable-
|
|
56
|
+
lazy: () => import("./DemoDataTable-DYbDYbs5.js")
|
|
57
57
|
});
|
|
58
58
|
demoJson = $page({
|
|
59
59
|
icon: IconBraces,
|
|
@@ -65,7 +65,7 @@ var DemoRouter = class {
|
|
|
65
65
|
icon: IconBinaryTree,
|
|
66
66
|
path: "/viewer",
|
|
67
67
|
label: "JsonViewer",
|
|
68
|
-
lazy: () => import("./DemoJsonViewer-
|
|
68
|
+
lazy: () => import("./DemoJsonViewer-DbWVDdz_.js")
|
|
69
69
|
});
|
|
70
70
|
demoAuth = $page({
|
|
71
71
|
icon: IconKey,
|
|
@@ -82,25 +82,25 @@ var DemoRouter = class {
|
|
|
82
82
|
icon: IconLogin,
|
|
83
83
|
path: "/login",
|
|
84
84
|
label: "Login",
|
|
85
|
-
lazy: () => import("./DemoLogin
|
|
85
|
+
lazy: () => import("./DemoLogin-BA_HiIRZ.js")
|
|
86
86
|
});
|
|
87
87
|
demoRegister = $page({
|
|
88
88
|
icon: IconUserPlus,
|
|
89
89
|
path: "/register",
|
|
90
90
|
label: "Register",
|
|
91
|
-
lazy: () => import("./DemoRegister-
|
|
91
|
+
lazy: () => import("./DemoRegister-B6syaxP9.js")
|
|
92
92
|
});
|
|
93
93
|
demoResetPassword = $page({
|
|
94
94
|
icon: IconLockQuestion,
|
|
95
95
|
path: "/reset-password",
|
|
96
96
|
label: "ResetPassword",
|
|
97
|
-
lazy: () => import("./DemoResetPassword-
|
|
97
|
+
lazy: () => import("./DemoResetPassword-BOcLG4GF.js")
|
|
98
98
|
});
|
|
99
99
|
demoVerifyEmail = $page({
|
|
100
100
|
icon: IconMailCheck,
|
|
101
101
|
path: "/verify-email",
|
|
102
102
|
label: "VerifyEmail",
|
|
103
|
-
lazy: () => import("./DemoVerifyEmail-
|
|
103
|
+
lazy: () => import("./DemoVerifyEmail-C-J7bXUQ.js")
|
|
104
104
|
});
|
|
105
105
|
};
|
|
106
106
|
|
package/dist/json/index.d.ts
CHANGED
|
@@ -13,8 +13,7 @@ declare module "@alepha/ui" {
|
|
|
13
13
|
*/
|
|
14
14
|
json(data?: any, options?: BaseDialogOptions): void;
|
|
15
15
|
}
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=DialogService.d.ts.map
|
|
16
|
+
} //# sourceMappingURL=DialogService.d.ts.map
|
|
18
17
|
//#endregion
|
|
19
18
|
//#region ../../src/json/components/JsonViewer.d.ts
|
|
20
19
|
interface JsonViewerProps {
|
package/dist/json/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/json/extensions/DialogService.tsx","../../src/json/components/JsonViewer.tsx"],"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/json/extensions/DialogService.tsx","../../src/json/components/JsonViewer.tsx"],"mappings":";;;;;;YAKY,aAAA;;;AAL2D;;;;IAYnE,IAAA,CAAK,IAAA,QAAY,OAAA,GAAU,iBAAA;EAAA;AAAA;;;UCerB,eAAA;EACR,IAAA;;;AD5BqE;ECgCrE,oBAAA;;;;EAIA,QAAA;EDxBO;;;EC4BP,IAAA,GAAO,WAAA;ED5BuC;;;ECgC9C,UAAA;;AApCqB;;EAwCrB,cAAA;EARkB;;;EAYlB,WAAA,IACE,GAAA,sBACA,KAAA,OACA,IAAA;AAAA;AAAA,cA6SS,UAAA;EAAc,IAAA;EAAA,oBAAA;EAAA,QAAA;EAAA,IAAA;EAAA,UAAA;EAAA,cAAA;EAAA;AAAA,GAQxB,eAAA,KAAe,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"mantine"
|
|
8
8
|
],
|
|
9
9
|
"author": "Nicolas Foures",
|
|
10
|
-
"version": "0.
|
|
10
|
+
"version": "0.15.1",
|
|
11
11
|
"type": "module",
|
|
12
12
|
"engines": {
|
|
13
13
|
"node": ">=22.0.0"
|
|
@@ -22,25 +22,25 @@
|
|
|
22
22
|
"styles.css"
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@alepha/react": "0.
|
|
26
|
-
"@mantine/core": "^8.3.
|
|
27
|
-
"@mantine/dates": "^8.3.
|
|
28
|
-
"@mantine/hooks": "^8.3.
|
|
29
|
-
"@mantine/modals": "^8.3.
|
|
30
|
-
"@mantine/notifications": "^8.3.
|
|
31
|
-
"@mantine/nprogress": "^8.3.
|
|
32
|
-
"@mantine/spotlight": "^8.3.
|
|
25
|
+
"@alepha/react": "0.15.1",
|
|
26
|
+
"@mantine/core": "^8.3.13",
|
|
27
|
+
"@mantine/dates": "^8.3.13",
|
|
28
|
+
"@mantine/hooks": "^8.3.13",
|
|
29
|
+
"@mantine/modals": "^8.3.13",
|
|
30
|
+
"@mantine/notifications": "^8.3.13",
|
|
31
|
+
"@mantine/nprogress": "^8.3.13",
|
|
32
|
+
"@mantine/spotlight": "^8.3.13",
|
|
33
33
|
"@tabler/icons-react": "^3.36.1",
|
|
34
|
-
"alepha": "0.
|
|
34
|
+
"alepha": "0.15.1",
|
|
35
35
|
"dayjs": "^1.11.19"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@biomejs/biome": "^2.3.
|
|
38
|
+
"@biomejs/biome": "^2.3.12",
|
|
39
39
|
"react": "^19.2.3",
|
|
40
40
|
"react-dom": "^19.2.3",
|
|
41
41
|
"typescript": "^5.9.3",
|
|
42
42
|
"vite": "^7.3.1",
|
|
43
|
-
"vitest": "^4.0.
|
|
43
|
+
"vitest": "^4.0.18"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"react": "*",
|
package/src/auth/AuthRouter.ts
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
IconUserPlus,
|
|
9
9
|
} from "@tabler/icons-react";
|
|
10
10
|
import { $inject, AlephaError, t } from "alepha";
|
|
11
|
-
import type {
|
|
11
|
+
import type { RealmController } from "alepha/api/users";
|
|
12
12
|
import { $client } from "alepha/server/links";
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -22,7 +22,7 @@ const realmQuerySchema = t.object({
|
|
|
22
22
|
});
|
|
23
23
|
|
|
24
24
|
export class AuthRouter {
|
|
25
|
-
protected readonly
|
|
25
|
+
protected readonly realmClient = $client<RealmController>();
|
|
26
26
|
protected readonly auth = $inject(ReactAuth);
|
|
27
27
|
|
|
28
28
|
layout = $page({
|
|
@@ -115,15 +115,15 @@ export class AuthRouter {
|
|
|
115
115
|
},
|
|
116
116
|
});
|
|
117
117
|
|
|
118
|
-
protected async loadRealmConfig(
|
|
118
|
+
protected async loadRealmConfig(realmName?: string) {
|
|
119
119
|
try {
|
|
120
|
-
return await this.
|
|
121
|
-
query: {
|
|
120
|
+
return await this.realmClient.getRealmConfig({
|
|
121
|
+
query: { realmName },
|
|
122
122
|
});
|
|
123
123
|
} catch (e) {
|
|
124
124
|
if (e instanceof AlephaError) {
|
|
125
125
|
throw new AlephaError(
|
|
126
|
-
"Missing
|
|
126
|
+
"Missing Realm Configuration - Did you forget to add '$realm()' to your application?",
|
|
127
127
|
e,
|
|
128
128
|
);
|
|
129
129
|
}
|
|
@@ -6,7 +6,7 @@ import { ActionButton, Control, capitalize } from "@alepha/ui";
|
|
|
6
6
|
import { Card, Flex, Group, Image, Stack, Text, Title } from "@mantine/core";
|
|
7
7
|
import { IconLock, IconUser } from "@tabler/icons-react";
|
|
8
8
|
import { AlephaError, t } from "alepha";
|
|
9
|
-
import type {
|
|
9
|
+
import type { RealmConfig } from "alepha/api/users";
|
|
10
10
|
import { HttpError } from "alepha/server";
|
|
11
11
|
import { useMemo } from "react";
|
|
12
12
|
import type { AuthI18n } from "../AuthI18n.ts";
|
|
@@ -15,7 +15,7 @@ import IconGithub from "./icons/IconGithub.tsx";
|
|
|
15
15
|
import IconGoogle from "./icons/IconGoogle.tsx";
|
|
16
16
|
|
|
17
17
|
export interface LoginProps {
|
|
18
|
-
realmConfig:
|
|
18
|
+
realmConfig: RealmConfig;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
const Login = (props: LoginProps) => {
|
|
@@ -24,9 +24,9 @@ import {
|
|
|
24
24
|
} from "@tabler/icons-react";
|
|
25
25
|
import { TypeBoxError, t } from "alepha";
|
|
26
26
|
import type {
|
|
27
|
+
RealmConfig,
|
|
27
28
|
RegistrationIntentResponse,
|
|
28
29
|
UserController,
|
|
29
|
-
UserRealmConfig,
|
|
30
30
|
} from "alepha/api/users";
|
|
31
31
|
import { useMemo, useState } from "react";
|
|
32
32
|
import type { AuthI18n } from "../AuthI18n.ts";
|
|
@@ -35,7 +35,7 @@ import IconGithub from "./icons/IconGithub.tsx";
|
|
|
35
35
|
import IconGoogle from "./icons/IconGoogle.tsx";
|
|
36
36
|
|
|
37
37
|
export interface RegisterProps {
|
|
38
|
-
realmConfig:
|
|
38
|
+
realmConfig: RealmConfig;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
type RegistrationPhase = "form" | "verification";
|
|
@@ -77,7 +77,12 @@ const Register = (props: RegisterProps) => {
|
|
|
77
77
|
|
|
78
78
|
const registerSchema = useMemo(() => {
|
|
79
79
|
const registerSchema = t.object({
|
|
80
|
-
username: t.optional(
|
|
80
|
+
username: t.optional(
|
|
81
|
+
t.text({
|
|
82
|
+
trim: true,
|
|
83
|
+
pattern: settings.usernameRegExp,
|
|
84
|
+
}),
|
|
85
|
+
),
|
|
81
86
|
email: t.optional(t.email()),
|
|
82
87
|
phoneNumber: t.optional(t.e164()),
|
|
83
88
|
password: t.string({ minLength: 8 }),
|
|
@@ -23,8 +23,8 @@ import {
|
|
|
23
23
|
import { AlephaError, t } from "alepha";
|
|
24
24
|
import type {
|
|
25
25
|
PasswordResetIntentResponse,
|
|
26
|
+
RealmConfig,
|
|
26
27
|
UserController,
|
|
27
|
-
UserRealmConfig,
|
|
28
28
|
} from "alepha/api/users";
|
|
29
29
|
import { resetPasswordRequestSchema } from "alepha/api/users";
|
|
30
30
|
import { useState } from "react";
|
|
@@ -32,7 +32,7 @@ import type { AuthI18n } from "../AuthI18n.ts";
|
|
|
32
32
|
import type { AuthRouter } from "../AuthRouter.ts";
|
|
33
33
|
|
|
34
34
|
export interface ResetPasswordProps {
|
|
35
|
-
realmConfig:
|
|
35
|
+
realmConfig: RealmConfig;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
type Step = "email" | "code" | "password" | "success";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t } from "alepha";
|
|
2
|
-
import type {
|
|
2
|
+
import type { RealmConfig } from "alepha/api/users";
|
|
3
3
|
import Login from "../../../auth/components/Login.tsx";
|
|
4
4
|
import Showcase from "../shared/Showcase.tsx";
|
|
5
5
|
|
|
@@ -61,8 +61,8 @@ const buildRealmConfig = (props: {
|
|
|
61
61
|
registrationAllowed: boolean;
|
|
62
62
|
resetPasswordAllowed: boolean;
|
|
63
63
|
showBranding: boolean;
|
|
64
|
-
}):
|
|
65
|
-
const authMethods:
|
|
64
|
+
}): RealmConfig => {
|
|
65
|
+
const authMethods: RealmConfig["authenticationMethods"] = [];
|
|
66
66
|
|
|
67
67
|
if (props.showCredentials) {
|
|
68
68
|
authMethods.push({ name: "credentials", type: "CREDENTIALS" });
|
|
@@ -85,6 +85,7 @@ const buildRealmConfig = (props: {
|
|
|
85
85
|
emailEnabled: props.emailEnabled,
|
|
86
86
|
emailRequired: false,
|
|
87
87
|
usernameEnabled: props.usernameEnabled,
|
|
88
|
+
usernameRegExp: "^[a-zA-Z0-9_]{3,30}$",
|
|
88
89
|
usernameRequired: false,
|
|
89
90
|
phoneEnabled: props.phoneEnabled,
|
|
90
91
|
phoneRequired: false,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t } from "alepha";
|
|
2
|
-
import type {
|
|
2
|
+
import type { RealmConfig } from "alepha/api/users";
|
|
3
3
|
import Register from "../../../auth/components/Register.tsx";
|
|
4
4
|
import Showcase from "../shared/Showcase.tsx";
|
|
5
5
|
|
|
@@ -73,8 +73,8 @@ const buildRealmConfig = (props: {
|
|
|
73
73
|
phoneRequired: boolean;
|
|
74
74
|
registrationAllowed: boolean;
|
|
75
75
|
showBranding: boolean;
|
|
76
|
-
}):
|
|
77
|
-
const authMethods:
|
|
76
|
+
}): RealmConfig => {
|
|
77
|
+
const authMethods: RealmConfig["authenticationMethods"] = [];
|
|
78
78
|
|
|
79
79
|
if (props.showCredentials) {
|
|
80
80
|
authMethods.push({ name: "credentials", type: "CREDENTIALS" });
|
|
@@ -98,6 +98,7 @@ const buildRealmConfig = (props: {
|
|
|
98
98
|
emailRequired: props.emailRequired,
|
|
99
99
|
usernameEnabled: props.usernameEnabled,
|
|
100
100
|
usernameRequired: props.usernameRequired,
|
|
101
|
+
usernameRegExp: "^[a-zA-Z0-9_]{3,30}$",
|
|
101
102
|
phoneEnabled: props.phoneEnabled,
|
|
102
103
|
phoneRequired: props.phoneRequired,
|
|
103
104
|
verifyEmailRequired: false,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t } from "alepha";
|
|
2
|
-
import type {
|
|
2
|
+
import type { RealmConfig } from "alepha/api/users";
|
|
3
3
|
import ResetPassword from "../../../auth/components/ResetPassword.tsx";
|
|
4
4
|
import Showcase from "../shared/Showcase.tsx";
|
|
5
5
|
|
|
@@ -19,7 +19,7 @@ const showcaseSchema = t.object({
|
|
|
19
19
|
const buildRealmConfig = (props: {
|
|
20
20
|
resetPasswordAllowed: boolean;
|
|
21
21
|
showBranding: boolean;
|
|
22
|
-
}):
|
|
22
|
+
}): RealmConfig => {
|
|
23
23
|
return {
|
|
24
24
|
realmName: "demo",
|
|
25
25
|
authenticationMethods: [{ name: "credentials", type: "CREDENTIALS" }],
|
|
@@ -32,6 +32,7 @@ const buildRealmConfig = (props: {
|
|
|
32
32
|
emailRequired: true,
|
|
33
33
|
usernameEnabled: false,
|
|
34
34
|
usernameRequired: false,
|
|
35
|
+
usernameRegExp: "^[a-zA-Z0-9_]{3,30}$",
|
|
35
36
|
phoneEnabled: false,
|
|
36
37
|
phoneRequired: false,
|
|
37
38
|
verifyEmailRequired: false,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminFiles-RsL178Ta.js","names":["filters"],"sources":["../../src/admin/components/files/AdminFiles.tsx"],"sourcesContent":["import { useClient } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport { type Page, t } from \"alepha\";\nimport { type FileController, type FileEntity, files } from \"alepha/api/files\";\n\nconst AdminFiles = () => {\n const client = useClient<FileController>();\n const { l } = useI18n();\n\n const filters = t.object({\n bucket: t.optional(t.string()),\n name: t.optional(\n t.string({\n $control: {\n query: t.pick(files.schema, [\"name\", \"bucket\", \"mimeType\"]),\n },\n }),\n ),\n });\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;\n };\n\n return (\n <Flex flex={1} direction={\"column\"}>\n <DataTable<FileEntity, typeof filters>\n submitOnInit\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(key, _value, form) => {\n if (key === \"name\" || key === \"bucket\") {\n return form.submit();\n }\n }}\n filters={filters}\n items={async (filters) => {\n const response = await client.findFiles({\n query: filters,\n });\n\n return response as Page<FileEntity>;\n }}\n columns={{\n name: {\n label: \"Name\",\n value: (item) => (\n <Text size=\"sm\" fw={500} lineClamp={1}>\n {item.name}\n </Text>\n ),\n },\n bucket: {\n label: \"Bucket\",\n fit: true,\n value: (item) => (\n <Badge size=\"sm\" variant=\"light\" color=\"blue\">\n {item.bucket}\n </Badge>\n ),\n },\n mimeType: {\n label: \"Type\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {item.mimeType}\n </Text>\n ),\n },\n size: {\n label: \"Size\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {formatFileSize(item.size)}\n </Text>\n ),\n },\n creatorName: {\n label: \"Creator\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {item.creatorName || \"-\"}\n </Text>\n ),\n },\n createdAt: {\n label: \"Created\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminFiles;\n"],"mappings":";;;;;;;;;AAOA,MAAM,mBAAmB;CACvB,MAAM,SAAS,WAA2B;CAC1C,MAAM,EAAE,MAAM,SAAS;CAEvB,MAAM,UAAU,EAAE,OAAO;EACvB,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;EAC9B,MAAM,EAAE,SACN,EAAE,OAAO,EACP,UAAU,EACR,OAAO,EAAE,KAAK,MAAM,QAAQ;GAAC;GAAQ;GAAU;GAAW,CAAC,EAC5D,EACF,CAAC,CACH;EACF,CAAC;CAEF,MAAM,kBAAkB,UAAkB;AACxC,MAAI,UAAU,EAAG,QAAO;EACxB,MAAM,IAAI;EACV,MAAM,QAAQ;GAAC;GAAK;GAAM;GAAM;GAAK;EACrC,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;AACnD,SAAO,GAAG,OAAO,YAAY,QAAQ,KAAK,GAAG,QAAQ,EAAE,CAAC,CAAC,GAAG,MAAM;;AAGpE,QACE,oBAAC;EAAK,MAAM;EAAG,WAAW;YACxB,oBAAC;GACC;GACA,aAAa;GACb,eAAe;IACb,kBAAkB;IAClB,SAAS;IACV;GACD,YAAY;IACV,mBAAmB;IACnB,iBAAiB;IAClB;GACD,iBAAiB,KAAK,QAAQ,SAAS;AACrC,QAAI,QAAQ,UAAU,QAAQ,SAC5B,QAAO,KAAK,QAAQ;;GAGf;GACT,OAAO,OAAO,cAAY;AAKxB,WAJiB,MAAM,OAAO,UAAU,EACtC,OAAOA,WACR,CAAC;;GAIJ,SAAS;IACP,MAAM;KACJ,OAAO;KACP,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,IAAI;MAAK,WAAW;gBACjC,KAAK;OACD;KAEV;IACD,QAAQ;KACN,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAM,MAAK;MAAK,SAAQ;MAAQ,OAAM;gBACpC,KAAK;OACA;KAEX;IACD,UAAU;KACR,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,KAAK;OACD;KAEV;IACD,MAAM;KACJ,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,eAAe,KAAK,KAAK;OACrB;KAEV;IACD,aAAa;KACX,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,KAAK,eAAe;OAChB;KAEV;IACD,WAAW;KACT,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;OAClC;KAEV;IACF;IACD;GACG;;AAIX,yBAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminNotifications-cIbywWKi.js","names":["filters"],"sources":["../../src/admin/components/notifications/AdminNotifications.tsx"],"sourcesContent":["import { useClient } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge, Tooltip } from \"@mantine/core\";\nimport {\n IconAlertCircle,\n IconCheck,\n IconClock,\n IconMail,\n IconMessage,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type {\n AdminNotificationController,\n NotificationEntity,\n} from \"alepha/api/notifications\";\n\nconst AdminNotifications = () => {\n const client = useClient<AdminNotificationController>();\n const { l } = useI18n();\n\n const filters = t.object({\n type: t.optional(\n t.enum([\"email\", \"sms\"], {\n title: \"Type\",\n }),\n ),\n status: t.optional(\n t.enum([\"pending\", \"sent\", \"failed\"], {\n title: \"Status\",\n }),\n ),\n template: t.optional(\n t.string({\n title: \"Template\",\n }),\n ),\n contact: t.optional(\n t.string({\n title: \"Contact\",\n }),\n ),\n });\n\n const getStatus = (item: NotificationEntity) => {\n if (item.error) return \"failed\";\n if (item.sentAt) return \"sent\";\n return \"pending\";\n };\n\n const getStatusBadge = (item: NotificationEntity) => {\n const status = getStatus(item);\n switch (status) {\n case \"sent\":\n return (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color=\"green\"\n leftSection={<IconCheck size={12} />}\n >\n Sent\n </Badge>\n );\n case \"failed\":\n return (\n <Tooltip label={item.error?.message} multiline maw={300}>\n <Badge\n size=\"sm\"\n variant=\"light\"\n color=\"red\"\n leftSection={<IconAlertCircle size={12} />}\n >\n Failed\n </Badge>\n </Tooltip>\n );\n default:\n return (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color=\"yellow\"\n leftSection={<IconClock size={12} />}\n >\n Pending\n </Badge>\n );\n }\n };\n\n return (\n <Flex flex={1} direction=\"column\">\n <DataTable<NotificationEntity, typeof filters>\n submitOnInit\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 4,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(_key, _value, form) => {\n return form.submit();\n }}\n filters={filters}\n tableTrProps={(item) => {\n const status = getStatus(item);\n if (status === \"failed\") {\n return {\n bg: \"var(--mantine-color-red-light)\",\n };\n }\n return {};\n }}\n items={async (filters) => {\n const response = await client.findNotifications({\n query: filters,\n });\n\n return response as Page<NotificationEntity>;\n }}\n columns={{\n type: {\n label: \"Type\",\n fit: true,\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"outline\"\n leftSection={\n item.type === \"email\" ? (\n <IconMail size={12} />\n ) : (\n <IconMessage size={12} />\n )\n }\n >\n {item.type.toUpperCase()}\n </Badge>\n ),\n },\n template: {\n label: \"Template\",\n value: (item) => (\n <Text size=\"sm\" fw={500}>\n {item.template}\n </Text>\n ),\n },\n contact: {\n label: \"Contact\",\n value: (item) => (\n <Text size=\"sm\" ff=\"monospace\">\n {item.contact}\n </Text>\n ),\n },\n category: {\n label: \"Category\",\n fit: true,\n value: (item) =>\n item.category ? (\n <Badge size=\"xs\" variant=\"light\">\n {item.category}\n </Badge>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n -\n </Text>\n ),\n },\n status: {\n label: \"Status\",\n fit: true,\n value: (item) => getStatusBadge(item),\n },\n sentAt: {\n label: \"Sent\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {item.sentAt ? l(item.sentAt, { date: \"fromNow\" }) : \"-\"}\n </Text>\n ),\n },\n createdAt: {\n label: \"Created\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminNotifications;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminSessions-vOgkrQ2U.js","names":["filters"],"sources":["../../src/admin/components/sessions/AdminSessions.tsx"],"sourcesContent":["import { useClient } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { useRouter } from \"@alepha/react/router\";\nimport { ActionButton, DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge, Group } from \"@mantine/core\";\nimport {\n IconDeviceDesktop,\n IconDeviceMobile,\n IconDeviceTablet,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport {\n type AdminSessionController,\n type SessionEntity,\n sessions,\n} from \"alepha/api/users\";\nimport { useState } from \"react\";\nimport type { AdminRouter } from \"../../AdminRouter.ts\";\n\nexport interface AdminSessionsProps {\n userRealmName?: string;\n}\n\nconst AdminSessions = (props: AdminSessionsProps) => {\n const client = useClient<AdminSessionController>();\n const router = useRouter<AdminRouter>();\n const { l } = useI18n();\n const [refreshKey, setRefreshKey] = useState(0);\n\n const filters = t.object({\n userId: t.optional(\n t.uuid({\n $control: {\n query: t.pick(sessions.schema, [\"userId\"]),\n },\n }),\n ),\n });\n\n const getDeviceIcon = (device?: string) => {\n switch (device) {\n case \"MOBILE\":\n return <IconDeviceMobile size={14} />;\n case \"TABLET\":\n return <IconDeviceTablet size={14} />;\n default:\n return <IconDeviceDesktop size={14} />;\n }\n };\n\n const isExpired = (expiresAt: Date | string) => {\n return new Date(expiresAt) < new Date();\n };\n\n const handleDelete = async (sessionId: string) => {\n await client.deleteSession({\n params: { id: sessionId },\n query: { userRealmName: props.userRealmName },\n });\n setRefreshKey((k) => k + 1);\n };\n\n return (\n <Flex flex={1} direction=\"column\">\n <DataTable<SessionEntity, typeof filters>\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(key, _value, form) => {\n if (key === \"userId\") {\n return form.submit();\n }\n }}\n filters={filters}\n tableTrProps={(item) => {\n if (isExpired(item.expiresAt)) {\n return {\n opacity: 0.5,\n };\n }\n return {};\n }}\n items={async (filters) => {\n const response = await client.findSessions({\n query: {\n ...filters,\n userRealmName: props.userRealmName,\n },\n });\n\n return response as Page<SessionEntity>;\n }}\n columns={{\n userId: {\n label: \"User\",\n value: (item) => (\n <ActionButton\n variant=\"subtle\"\n size=\"xs\"\n href={router.path(\"adminUserDetails\", {\n params: { userId: item.userId },\n })}\n >\n <Text size=\"xs\" ff=\"monospace\">\n {item.userId.slice(0, 8)}...\n </Text>\n </ActionButton>\n ),\n },\n userAgent: {\n label: \"Device\",\n fit: true,\n value: (item) => (\n <Group gap={4}>\n {item.userAgent ? (\n <>\n <Badge\n size=\"xs\"\n variant=\"light\"\n leftSection={getDeviceIcon(item.userAgent.device)}\n >\n {item.userAgent.device}\n </Badge>\n <Text size=\"xs\" c=\"dimmed\">\n {item.userAgent.browser} / {item.userAgent.os}\n </Text>\n </>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n -\n </Text>\n )}\n </Group>\n ),\n },\n ip: {\n label: \"IP\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" ff=\"monospace\" c=\"dimmed\">\n {item.ip || \"-\"}\n </Text>\n ),\n },\n expiresAt: {\n label: \"Status\",\n fit: true,\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={isExpired(item.expiresAt) ? \"red\" : \"green\"}\n >\n {isExpired(item.expiresAt) ? \"Expired\" : \"Active\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Created\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n actions: {\n label: \"\",\n fit: true,\n value: (item) => (\n <ActionButton\n size=\"xs\"\n variant=\"subtle\"\n color=\"red\"\n onClick={() => handleDelete(item.id)}\n >\n <IconTrash size={14} />\n </ActionButton>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminSessions;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminUsers-BnGIRvmV.js","names":["Flex","filters"],"sources":["../../src/admin/components/users/AdminUsers.tsx"],"sourcesContent":["import { useClient } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { useRouter } from \"@alepha/react/router\";\nimport { DataTable, Text } from \"@alepha/ui\";\nimport { Badge, Flex, Group } from \"@mantine/core\";\nimport { IconCheck, IconUsersPlus, IconX } from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport {\n type AdminUserController,\n type UserEntity,\n users,\n} from \"alepha/api/users\";\nimport type { AdminRouter } from \"../../AdminRouter.ts\";\n\nexport interface AdminUsersProps {\n userRealmName?: string;\n}\n\nconst AdminUsers = (props: AdminUsersProps) => {\n const client = useClient<AdminUserController>();\n const router = useRouter<AdminRouter>();\n const { l } = useI18n();\n\n const filters = t.object({\n query: t.optional(\n t.string({\n $control: {\n query: t.omit(users.schema, [\"id\", \"version\"]),\n },\n }),\n ),\n });\n\n return (\n <Flex flex={1} direction=\"column\">\n <DataTable<UserEntity, typeof filters>\n submitOnInit\n actions={[\n {\n icon: IconUsersPlus,\n href: router.path(\"adminUserCreate\"),\n label: \"Create User\",\n },\n ]}\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n striped: false,\n highlightOnHover: true,\n }}\n onFilterChange={(key, value, form) => {\n if (key === \"query\") {\n return form.submit();\n }\n }}\n filters={filters}\n tableTrProps={(item) => {\n const baseProps: Record<string, any> = {\n style: { cursor: \"pointer\" },\n onClick: () =>\n router.go(\"adminUserDetails\", {\n params: { userId: item.id },\n }),\n };\n\n if (!item.enabled) {\n baseProps.opacity = 0.5;\n }\n\n return baseProps;\n }}\n items={async (filters) => {\n const response = await client.findUsers({\n query: {\n ...filters,\n userRealmName: props.userRealmName,\n },\n });\n\n return response as Page<UserEntity>;\n }}\n columns={{\n username: {\n label: \"Username\",\n value: (item) => (\n <Text size=\"sm\" fw={500}>\n {item.username || \"-\"}\n </Text>\n ),\n },\n email: {\n label: \"Email\",\n value: (item) => (\n <Group gap=\"xs\">\n <Text size=\"sm\">{item.email || \"-\"}</Text>\n {item.email && (\n <Badge\n size=\"xs\"\n variant=\"light\"\n color={item.emailVerified ? \"green\" : \"gray\"}\n leftSection={\n item.emailVerified ? (\n <IconCheck size={10} />\n ) : (\n <IconX size={10} />\n )\n }\n >\n {item.emailVerified ? \"Verified\" : \"Unverified\"}\n </Badge>\n )}\n </Group>\n ),\n },\n roles: {\n label: \"Roles\",\n value: (item) => (\n <Group gap={4}>\n {item.roles.map((role: string) => (\n <Badge key={role} size=\"xs\" variant=\"outline\">\n {role}\n </Badge>\n ))}\n </Group>\n ),\n },\n enabled: {\n label: \"Status\",\n fit: true,\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={item.enabled ? \"green\" : \"red\"}\n >\n {item.enabled ? \"Active\" : \"Disabled\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Created\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminUsers;\n"],"mappings":";;;;;;;;;;;AAkBA,MAAM,cAAc,UAA2B;CAC7C,MAAM,SAAS,WAAgC;CAC/C,MAAM,SAAS,WAAwB;CACvC,MAAM,EAAE,MAAM,SAAS;CAEvB,MAAM,UAAU,EAAE,OAAO,EACvB,OAAO,EAAE,SACP,EAAE,OAAO,EACP,UAAU,EACR,OAAO,EAAE,KAAK,MAAM,QAAQ,CAAC,MAAM,UAAU,CAAC,EAC/C,EACF,CAAC,CACH,EACF,CAAC;AAEF,QACE,oBAACA;EAAK,MAAM;EAAG,WAAU;YACvB,oBAAC;GACC;GACA,SAAS,CACP;IACE,MAAM;IACN,MAAM,OAAO,KAAK,kBAAkB;IACpC,OAAO;IACR,CACF;GACD,aAAa;GACb,eAAe;IACb,kBAAkB;IAClB,SAAS;IACV;GACD,YAAY;IACV,mBAAmB;IACnB,iBAAiB;IACjB,SAAS;IACT,kBAAkB;IACnB;GACD,iBAAiB,KAAK,OAAO,SAAS;AACpC,QAAI,QAAQ,QACV,QAAO,KAAK,QAAQ;;GAGf;GACT,eAAe,SAAS;IACtB,MAAM,YAAiC;KACrC,OAAO,EAAE,QAAQ,WAAW;KAC5B,eACE,OAAO,GAAG,oBAAoB,EAC5B,QAAQ,EAAE,QAAQ,KAAK,IAAI,EAC5B,CAAC;KACL;AAED,QAAI,CAAC,KAAK,QACR,WAAU,UAAU;AAGtB,WAAO;;GAET,OAAO,OAAO,cAAY;AAQxB,WAPiB,MAAM,OAAO,UAAU,EACtC,OAAO;KACL,GAAGC;KACH,eAAe,MAAM;KACtB,EACF,CAAC;;GAIJ,SAAS;IACP,UAAU;KACR,OAAO;KACP,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,IAAI;gBACjB,KAAK,YAAY;OACb;KAEV;IACD,OAAO;KACL,OAAO;KACP,QAAQ,SACN,qBAAC;MAAM,KAAI;iBACT,oBAAC;OAAK,MAAK;iBAAM,KAAK,SAAS;QAAW,EACzC,KAAK,SACJ,oBAAC;OACC,MAAK;OACL,SAAQ;OACR,OAAO,KAAK,gBAAgB,UAAU;OACtC,aACE,KAAK,gBACH,oBAAC,aAAU,MAAM,KAAM,GAEvB,oBAAC,SAAM,MAAM,KAAM;iBAItB,KAAK,gBAAgB,aAAa;QAC7B;OAEJ;KAEX;IACD,OAAO;KACL,OAAO;KACP,QAAQ,SACN,oBAAC;MAAM,KAAK;gBACT,KAAK,MAAM,KAAK,SACf,oBAAC;OAAiB,MAAK;OAAK,SAAQ;iBACjC;SADS,KAEJ,CACR;OACI;KAEX;IACD,SAAS;KACP,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MACC,MAAK;MACL,SAAQ;MACR,OAAO,KAAK,UAAU,UAAU;gBAE/B,KAAK,UAAU,WAAW;OACrB;KAEX;IACD,WAAW;KACT,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;OAClC;KAEV;IACF;IACD;GACG;;AAIX,yBAAe"}
|