@niledatabase/react 2.2.0 → 2.2.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import*as e from"react";import t,{createContext as r,useMemo as a,useContext as n,useState as l,useEffect as o}from"react";import i from"@niledatabase/browser";import{QueryClient as c,QueryClientProvider as s,useMutation as m}from"@tanstack/react-query";import u from"@mui/material/CssBaseline";import{extendTheme as d,CssVarsProvider as p}from"@mui/joy/styles";import f from"@mui/utils/deepmerge";import{experimental_extendTheme as g}from"@mui/material/styles";import h from"@mui/joy/Box";import b from"@mui/joy/Button";import E from"@mui/joy/Stack";import y from"@mui/joy/Typography";import x from"@mui/joy/Alert";import{useFormContext as v,Controller as w,useForm as C,FormProvider as S}from"react-hook-form";import k from"@mui/joy/Input";import T from"@mui/joy/FormControl";import F from"@mui/joy/FormHelperText";import j from"@mui/icons-material/Error";import I from"@mui/joy/FormLabel";import U from"@mui/joy/Select";import P from"@mui/joy/Option";import q from"@mui/joy/Tooltip";import{Switch as B,Modal as V,ModalDialog as O,Stack as R,Typography as A,FormControl as D,FormLabel as M,Input as L,Button as $}from"@mui/joy";import N from"@mui/joy/Checkbox";import z from"@mui/joy/List";import H from"@mui/joy/ListItem";import{DataGrid as G}from"@mui/x-data-grid";import W from"@mui/icons-material/Add";import _ from"lodash/isNull";import J from"lodash/isUndefined";import Q from"@mui/icons-material/CopyAll";import K from"@mui/icons-material/CheckCircleOutlined";const X={primary:{50:"#fff7ed",100:"#FFEAD2",200:"#FFDCB5",300:"#FFCE97",400:"#FFC480",500:"#FDC067",600:"#FFB262",700:"#FFAA57",800:"#FFA24D",900:"#FF933C",solidColor:"rgba(var(--nile-palette-primary-contrastTextChannel) / 1)",softColor:"rgba(var(--nile-palette-primary-contrastTextChannel) / .5)",solidDisabledBg:"var(--nile-palette-grey-600)",solidDisabledColor:"var(--nile-palette-grey-700)",plainHoverBg:"rgba(var(--nile-palette-primary-mainChannel) / var(--nile-palette-action-hoverOpacity))",outlinedHoverBg:"rgba(var(--nile-palette-primary-mainChannel) / var(--nile-palette-action-selectedOpacity))"},neutral:{outlinedHoverBg:"rgba(var(--nile-palette-neutral-mainChannel) / var(--nile-palette-action-selectedOpacity))",softBg:"rgba(45, 45, 51)"},purple:{50:"#f0edff",100:"#d8d3ff",200:"#beb6fe",300:"#a298fb",400:"#8a7ff7",500:"#7269f3",600:"#6663eb",700:"#565ae1",800:"#4754d8",900:"#2d47c9"},blue:{50:"#dff8ff",100:"#adedff",200:"#6fe2ff",300:"#12d6fb",400:"#00ccf6",500:"#00c2f0",600:"#00b2dc",700:"#009dc0",800:"#008aa6",900:"#006778"},divider:"#181818",text:{primary:"#fff7ed",tertiary:"rgba(255 255 255 / 0.5)"},background:{surface:"#000",body:"#000",default:"#000"},tableCell:{border:"none"}},{unstable_sxConfig:Y,...Z}=g({cssVarPrefix:"nile",colorSchemes:{dark:{palette:{primary:{main:"#FFCE97"}}}}}),{unstable_sxConfig:ee,...te}=d({cssVarPrefix:"nile",components:{JoyInput:{styleOverrides:{input:{":disabled":{color:"var(--nile-palette-neutral-500)"},"::placeholder":{opacity:.6},color:"white"}}}},colorSchemes:{dark:{palette:X},light:{palette:X}}}),re={...Z,...te,colorSchemes:f(Z.colorSchemes,te.colorSchemes),typography:{...Z.typography,...te.typography}};function ae({theme:e,children:r}){return t.createElement(p,{theme:e??re,defaultMode:"dark"},t.createElement(u,{enableColorScheme:!0}),r)}re.generateCssVars=e=>({css:{...Z.generateCssVars(e).css,...te.generateCssVars(e).css},vars:f(Z.generateCssVars(e).vars,te.generateCssVars(e).vars)}),re.unstable_sxConfig={...Y,...ee};const ne=new c,le=r({api:new i({basePath:"https://api.thenile.dev",credentials:"include"}),basePath:""}),{Provider:oe}=le,ie=({children:e})=>t.createElement(s,{client:ne},e),ce=e=>{const{children:r,theme:n,tenantId:l,QueryProvider:o=ie,basePath:c="https://api.thenile.dev",api:s}=e,m=a((()=>({api:s??new i({basePath:c,credentials:"include"}),tenantId:String(l),basePath:c})),[s,c,l]);return t.createElement(o,null,t.createElement(ae,{theme:n},t.createElement(oe,{value:m},r)))},se=()=>n(le),me=()=>{const{basePath:e,tenantId:t}=se();return a((()=>({tenantId:t,basePath:e})),[e,t])},ue=()=>se().api;var de;function pe(){return pe=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},pe.apply(this,arguments)}var fe=function(t){return e.createElement("svg",pe({xmlns:"http://www.w3.org/2000/svg",width:18,height:18},t),de||(de=e.createElement("g",{fillRule:"evenodd"},e.createElement("path",{fill:"#EA4335",d:"M9 3.48c1.69 0 2.83.73 3.48 1.34l2.54-2.48C13.46.89 11.43 0 9 0 5.48 0 2.44 2.02.96 4.96l2.91 2.26C4.6 5.05 6.62 3.48 9 3.48"}),e.createElement("path",{fill:"#4285F4",d:"M17.64 9.2c0-.74-.06-1.28-.19-1.84H9v3.34h4.96c-.1.83-.64 2.08-1.84 2.92l2.84 2.2c1.7-1.57 2.68-3.88 2.68-6.62"}),e.createElement("path",{fill:"#FBBC05",d:"M3.88 10.78A5.5 5.5 0 0 1 3.58 9c0-.62.11-1.22.29-1.78L.96 4.96A9 9 0 0 0 0 9c0 1.45.35 2.82.96 4.04z"}),e.createElement("path",{fill:"#34A853",d:"M9 18c2.43 0 4.47-.8 5.96-2.18l-2.84-2.2c-.76.53-1.78.9-3.12.9-2.38 0-4.4-1.57-5.12-3.74L.97 13.04C2.45 15.98 5.48 18 9 18"}),e.createElement("path",{fill:"none",d:"M0 0h18v18H0z"}))))};function ge(e){const{databaseId:r,newTenantName:a}=e,{basePath:n}=me(),l=`${n}/databases/${encodeURIComponent(r??"")}/users/oidc/google/login`,o=a?"?newTenant="+encodeURIComponent(a):"",i=(e?.href??l)+o;return t.createElement(h,{component:"a",href:i,display:"flex",flex:1,sx:{textDecoration:"none"}},t.createElement(h,null,t.createElement(b,{sx:{padding:0,textTransform:"initial",flex:1},"aria-label":"log in with google"},t.createElement(E,{direction:"row",alignItems:"center",p:0,flex:1,fontFamily:"Roboto, sans-serif",fontSize:"14px",display:"inline-flex",color:"rgb(255 255, 255)",boxShadow:"rgb(0 0 0 / 24%) 0px 2px 2px 0px rgb(0 0 0 / 24%) 0px 0px 1px 0px",borderRadius:"4px",border:"1px solid transparent",fontWeight:"500",sx:{backgroundColor:"rgb(66 133, 244)"}},t.createElement(h,{padding:"11px",display:"flex",border:"1px solid rgb(66, 133, 244)",borderRadius:"4px",sx:{background:"rgb(255, 255, 255)"}},t.createElement(fe,{"aria-hidden":"true"})),t.createElement(h,{padding:"10px",flex:1},t.createElement(y,{sx:{color:"white"},fontWeight:700,fontFamily:"Roboto, sans-serif",fontSize:"14px",height:"20px"},"Continue with Google"))))))}function he(t){const{options:r,attribute:a,display:n,helperText:l}=t,{watch:o,control:i}=v(),c=o(a.name),s={};return l&&(s.color="danger"),e.createElement(w,{name:a.name,rules:{required:Boolean(a.required)},control:i,render:({field:t})=>e.createElement(E,null,e.createElement(I,{htmlFor:`${t.name}`},n.label),e.createElement(h,{role:"group","aria-labelledby":a.name,sx:{borderRadius:"var(--joy-radius-sm)",p:.5,border:l?"1px solid var(--joy-palette-danger-outlinedBorder)":"none"}},e.createElement(z,{orientation:"horizontal",wrap:!0,sx:{"--List-gap":"8px"}},r.map((n=>(s.id=String(n.value),e.createElement(H,{key:`${n.value}-${n.label}`},e.createElement(N,{overlay:r.length>1,...s,checked:c.includes(n.value),disableIcon:r.length>1,variant:"soft",label:n.label,onChange:e=>{if(a.allowMultiple)if(e.target.checked)c?t.onChange(c.concat(n.value)):t.onChange([n.value]);else{const e=c.filter((e=>e!==n.value));e.length>0?t.onChange(e):t.onChange("")}else e.target.checked?t.onChange(n.value):t.onChange("")}}))))))),e.createElement(y,{sx:{color:"var(--joy-palette-danger-500)"},level:"body-sm"},l))})}var be;!function(e){e.Text="text",e.Password="password",e.Select="select",e.Number="number",e.Float="float",e.Checkbox="checkbox",e.Switch="switch"}(be||(be={}));const Ee=e=>!0===e.allowMultiple&&!Array.isArray(e.defaultValue)&&e.defaultValue?"number"==typeof e.defaultValue?[e.defaultValue]:[String(e.defaultValue)]:e.defaultValue??"";function ye(e){const{error:r,attr:a}=e;return r?t.createElement(q,{title:r,color:"danger",sx:{cursor:"pointer"}},t.createElement(I,null,a.label??a.name,t.createElement(j,{sx:{ml:.5,"--Icon-color":"#c41c1c"},fontSize:"small"}))):t.createElement(I,null,a.label??a.name)}function xe(e){const{mutation:r,buttonText:a,attributes:n,cancelButton:l,loading:o,successMessage:i}=e,c=t.useMemo((()=>n.reduce(((e,t)=>(e[t.name]=Ee(t),e)),{})),[n]),s=C({defaultValues:c}),{register:m,control:u,handleSubmit:d,formState:{errors:p}}=s,f=t.useCallback((e=>{r.mutate(e)}),[r]);return t.createElement(S,{...s},t.createElement(E,{component:"form",onSubmit:d((e=>f(e))),spacing:2},n.map((e=>{const r={},a={key:e.name,label:e.label??e.name,id:e.label??e.name,placeholder:e.placeholder??e.label??e.name,error:Boolean(p[e.name]),disabled:Boolean(e.disabled)},n=e.options??[],l=e.helpText??"";let o="";switch(e.required&&(o=p[e.name]?`${e.label??e.name} is required`:"",r.required=!0),e.type){case be.Switch:return t.createElement(T,{key:a.key,id:a.id,orientation:"horizontal",sx:{alignItems:"center"}},t.createElement(h,null,t.createElement(ye,{error:o,attr:e}),t.createElement(F,{id:`${e.name}-helper-text`},l)),t.createElement(w,{control:u,rules:{required:Boolean(e.required)},name:e.name,render:({field:r})=>{const a={};return p[e.name]&&(a.color="danger"),t.createElement(B,{id:`switch-field-${e.name}`,...a,...r,checked:Boolean(r.value),onChange:e=>{r.onChange(e.target.checked)},color:r.value?"success":"neutral",endDecorator:r.value?n[0].label:n[1].label,sx:{"--Switch-thumbSize":"28px"}})}}));case be.Checkbox:return t.createElement(he,{key:a.key,attribute:e,display:a,options:n,helperText:l});case be.Select:return t.createElement(T,{key:a.key,id:a.id},t.createElement(ye,{error:o,attr:e}),t.createElement(w,{control:u,rules:{required:Boolean(e.required)},name:e.name,render:({field:r})=>{const o={};p[e.name]&&(o.color="danger");const i=String(r.value);return t.createElement(E,null,t.createElement(U,{id:`select-field-${e.name}`,placeholder:`${a.placeholder}...`,...o,...r,value:i,onChange:(e,t)=>{r.onChange(t)}},n.map((e=>t.createElement(P,{key:String(e.value??""),value:e.value},e.label)))),t.createElement(F,{id:`${e.name}-helper-text`},l))}}));case be.Password:return t.createElement(T,{key:a.key,id:a.id},t.createElement(ye,{error:o,attr:e}),t.createElement(k,{...a,...m(e.name,r),type:be.Password}),t.createElement(F,{id:`${e.name}-helper-text`},l));case be.Number:return t.createElement(T,{key:a.key,id:a.id},t.createElement(ye,{error:o,attr:e}),t.createElement(k,{...a,...m(e.name,r),type:be.Number}),t.createElement(F,{id:`${e.name}-helper-text`},l));case be.Text:default:return t.createElement(T,{key:a.key,id:a.id},t.createElement(ye,{error:o,attr:e}),t.createElement(k,{...a,...m(e.name,r)}),t.createElement(F,{id:`${e.name}-helper-text`},l))}})),l?t.createElement(E,{spacing:2,direction:"row"},l,t.createElement(h,null,t.createElement(b,{type:"submit"},a))):t.createElement(h,null,t.createElement(E,{direction:"row",gap:2},t.createElement(b,{type:"submit",loading:o},a),i))))}function ve(e){const[r,a]=t.useState(),{buttonText:n="Sign up",onSuccess:l,onError:o,attributes:i,beforeMutate:c}=e,s=ue(),u=m((async e=>{a(void 0);const t=(c&&c(e))??e,{email:r,password:n,preferredName:l,newTenant:o,...i}=t;return Object.keys(i).length>0&&console.warn("additional metadata not supported yet."),s.auth.signUp({signUpRequest:{email:r,password:n,preferredName:l,newTenant:o}})}),{onSuccess:l,onError:(e,t)=>{a(e.message),o&&o(e,t)}}),d=t.useMemo((()=>{const e=[{name:"email",label:"Email",type:be.Text,defaultValue:"",required:!0},{name:"password",label:"Password",type:be.Password,defaultValue:"",required:!0}];return i&&i.length>0?e.concat(i):e}),[i]);return t.createElement(E,{gap:2},r?t.createElement(x,{color:"danger"},r):null,t.createElement(xe,{mutation:u,buttonText:n,attributes:d}))}function we(e){const[r,a]=t.useState(),{attributes:n,onSuccess:l,onError:o,beforeMutate:i}=e,c=ue(),s=m((async e=>{a(void 0);const t=(i&&i(e))??e;return await c.auth.login({loginRequest:t})}),{onSuccess:l,onError:o}),u=t.useMemo((()=>{const e=[{name:"email",label:"Email",type:be.Text,defaultValue:"",required:!0},{name:"password",label:"Password",type:be.Password,defaultValue:"",required:!0}];return n&&n.length>0?e.concat(n):e}),[n]);return t.createElement(E,{gap:2},r?t.createElement(x,{color:"danger"},r):null,t.createElement(xe,{mutation:s,buttonText:"Log in",attributes:u}))}function Ce(e){const{attributes:r,onSuccess:a,onError:n,beforeMutate:l,nextButtonText:o="Next",loginButtonText:i="Log in",disableSSO:c=!1}=e,s=ue(),[u,d]=t.useState(c?i:o),p=m((async e=>{const t=(l&&l(e))??e;return await s.auth.login({loginRequest:{email:t.email,password:t.password},sso:!c})}),{onSuccess:(e,t)=>{e&&(e?.redirectURI?window.location.href=e.redirectURI:u!==i?d(i):a&&a(e,t))},onError:(e,t)=>{u===i?n&&n(e,t):d(i)}}),f=t.useMemo((()=>{const e=[{name:"email",label:"Email",type:be.Text,defaultValue:"",required:!0}];return u===i&&e.push({name:"password",label:"Password",type:be.Password,defaultValue:"",required:!0}),r&&r.length>0?e.concat(r):e}),[r,u,i]);return t.createElement(xe,{mutation:p,buttonText:u,attributes:f})}function Se(e){const{open:r,setOpen:a,refetch:n}=e,{tenantId:l}=me(),o=ue(),[i,c]=t.useState(),{watch:s,register:u,handleSubmit:d}=C(),p=s("email");t.useEffect((()=>{null!=i&&c()}),[p]);const f=m((e=>o.users.createTenantUser({signUpRequest:e,tenantId:String(l)})),{onSuccess(e){n&&n(e),a(!1)},onError(e){e instanceof Error&&c(e.message)}}),g=t.useCallback((async e=>{c(""),f.mutate(e)}),[f]);return t.createElement(V,{open:r},t.createElement(O,null,t.createElement(R,{spacing:2},t.createElement(A,{level:"h4"},"Create user"),t.createElement(t.Fragment,null,i&&t.createElement(A,{color:"danger"},i)),t.createElement(R,{component:"form",sx:{width:"40ch"},spacing:1,onSubmit:d((e=>g(e)))},t.createElement(D,{sx:{"--FormHelperText-color":"var(--joy-palette-danger-500)"}},t.createElement(M,{htmlFor:"email"},"Email"),t.createElement(L,{...u("email"),fullWidth:!0,size:"lg",id:"email",name:"email",autoComplete:"current-email",required:!0,error:Boolean(i)})),t.createElement(D,{sx:{"--FormHelperText-color":"var(--joy-palette-danger-500)"}},t.createElement(M,{htmlFor:"password"},"Password"),t.createElement(L,{...u("password"),fullWidth:!0,size:"lg",id:"password",autoComplete:"current-password",type:"password",required:!0})),t.createElement(R,{direction:"row",sx:{pt:2},spacing:2},t.createElement($,{onClick:()=>a(!1),variant:"plain"},"Cancel"),t.createElement($,{type:"submit"},"Create"))))))}function ke(e){const{allowCreation:r,buttonText:a,onUserCreateSuccess:n}=e,[o,i]=l(!1);return r?t.createElement(E,{alignItems:"flex-end",gap:1},t.createElement(Se,{open:o,setOpen:i,refetch:n}),t.createElement(b,{startDecorator:t.createElement(W,null),size:"sm",onClick:()=>i(!0)},a)):null}const Te=e=>Object.keys(e).reduce(((t,r)=>{const a=e[r];return a instanceof Set?t[r]=Array.from(a).join(", "):Array.isArray(a)?t[r]=a.join(", "):t[r]=a,t}),{}),Fe=(e,t,r)=>{if(!e)return[[],[]];const a=e.map(Te),n=Object.keys(a[0]),l={},o=n?.map((e=>{const n=function(e,t,r){let a=r&&e?r.measureText(String(e)).width:50;a+=27;let n=a;return n=16+Math.ceil(r?r.measureText(t.reduce(((t,r)=>{let a=r[String(e)];return(_(a)||J(a))&&(a=""),a=a?.toString(),t.length>a.length?t:a}),"")).width:50),n<a&&(n=a),n+=8,n}(e,a,t),o=e.slice();if(r.includes(o))return null==l[o]?l[o]=o.length:l[o]+=1,{field:o.padEnd(l[o]),headerName:o.padEnd(l[o]),width:n}})).filter(Boolean)??[];return[o,a]};function je(e,t){const r=function(){const[e,t]=l();return o((()=>{const e=document.createElement("canvas").getContext("2d");e&&(e.font="18px Roboto",t(e))}),[]),e}(),[n,i]=a((()=>Fe(e,r,t)),[e,r,t]);return[n,i]}function Ie(e){const{data:r,allowCreation:a=!0,buttonText:n="Add a user",onUserCreateSuccess:l,slots:o,include:i=["email","preferedName"]}=e,c={width:"100%",height:"100%",...o?.dataGrid??{}},[s,m]=je(r,i);return t.createElement(E,{flex:1},t.createElement(ke,{allowCreation:a,buttonText:n,onUserCreateSuccess:l}),t.createElement(G,{sx:c,rows:m,columns:s,hideFooter:!0}))}function Ue(e){const{config:r,providerName:a,onSuccess:n,onError:l,allowEdit:o=!0,configurationGuide:i}=e,c=ue(),[s,u]=t.useState(!1),[d,p]=t.useState(!1),[f,g]=t.useState(r),h=t.useRef(),b=t.useMemo((()=>{const e=[{name:"enabled",label:"Allow Okta logins",type:be.Switch,defaultValue:!0===f?.enabled,options:[{label:"Enabled"},{label:"Disabled"}],disabled:!o},{name:"clientId",label:"Client id",type:be.Text,defaultValue:f?.clientId??"",required:!0,disabled:!o},{name:"configUrl",label:"Config url",type:be.Text,defaultValue:f?.configUrl??"",helpText:"The URL of the .well-known/openid-configuration for the identity provider",required:!0,disabled:!o},{name:"emailDomains",label:"Email domains",type:be.Text,defaultValue:f?.emailDomains?.join(", ")??"",required:!0,helpText:"A comma seperated list of email domains (yourDomain.com) to be used",disabled:!o}];return f?.clientId||e.splice(2,0,{name:"clientSecret",label:"Client secret",type:be.Password,defaultValue:"",required:!0,disabled:!o}),e}),[o,f?.clientId,f?.configUrl,f?.emailDomains,f?.enabled]),v=m((e=>{u(!0);const t={providerName:a.toLowerCase(),updateProviderRequest:{...e,emailDomains:e.emailDomains.split(",")}};return null!=f?c.auth.updateProvider(t):c.auth.createProvider(t)}),{onSuccess:(e,t)=>{g(e),p(!0),n&&n(e,t)},onError:l,onSettled:(e,t,r)=>{u(!1),h.current&&clearTimeout(h.current),h.current=setTimeout((()=>{p(!1)}),3e3),e||(t&&!t?.message.includes("Unterminated string")||g({enabled:r.enabled,clientId:r.clientId,configUrl:r.configUrl,emailDomains:r.emailDomains.split(", ")}),p(!0),n&&n(e,r))}});return t.useEffect((()=>{})),t.createElement(E,{gap:2,position:"relative"},t.createElement(y,{level:"h4"},"Step 1"),i,t.createElement(y,{level:"h4"},"Step 2"),t.createElement(xe,{mutation:v,buttonText:"Update",attributes:b,loading:s,successMessage:t.createElement(x,{color:"success",sx:{opacity:d?1:0,transition:"opacity 200ms",height:"0.9rem"},startDecorator:t.createElement(K,null)},t.createElement(y,{textAlign:"center",fontSize:"sm"},"Provider updated"))}))}function Pe({callbackUrl:e}){const[r,a]=t.useState(!1),n=t.useRef();return t.useEffect((()=>{n.current&&clearTimeout(n.current),n.current=setTimeout((()=>{a(!1)}),3250)}),[r]),t.createElement(E,{gap:2},t.createElement(y,null,"In order for Okta to redirect properly, provide the following URL as the"," ",t.createElement(h,{component:"span",sx:{fontFamily:"monospace"}},"Sign-in redirect URIs")," ","in the admin configuration of your application."),t.createElement(k,{onClick:async()=>{e&&(await navigator.clipboard.writeText(e),a(!0))},sx:e=>({input:{cursor:"pointer"},span:{cursor:"pointer"},"&:hover svg":{"--Icon-color":e.palette.primary[500]}}),value:e,readOnly:!0,endDecorator:t.createElement(q,{title:"Copy Okta redirect URL"},t.createElement(h,{position:"relative",width:r?"82px":"24px",height:"24px"},t.createElement(h,{position:"absolute",top:"0",left:"0",sx:{opacity:r?0:1,transition:"opacity 300ms"}},t.createElement(Q,null)),t.createElement(h,{position:"absolute",top:"0",left:"0",sx:{opacity:r?1:0,transition:"opacity 300ms"}},t.createElement(E,{direction:"row",gap:1},t.createElement(K,null),t.createElement(y,{color:"primary"},"Copied!")))))}))}function qe(e){const{callbackUrl:r,providers:a,...n}=e;if(!a)return null;const l=a?.find((e=>"okta"===e.provider));return t.createElement(Ue,{...n,config:l,providerName:"Okta",configurationGuide:t.createElement(Pe,{callbackUrl:r})})}export{be as FormAttributeType,ge as GoogleLoginButton,ce as NileProvider,qe as Okta,Ue as SSOForm,Ce as SingleSignOnForm,we as UserLoginForm,ve as UserSignupForm,Ie as UserTenantList};
1
+ import*as e from"react";import t,{createContext as r,useMemo as a,useContext as n,useState as o,useEffect as l}from"react";import i from"@niledatabase/browser";import{QueryClient as c,QueryClientProvider as s,useMutation as m}from"@tanstack/react-query";import u from"@mui/material/CssBaseline";import{CssVarsProvider as d}from"@mui/joy/styles";import p from"@mui/joy/Box";import f from"@mui/joy/Button";import h from"@mui/joy/Stack";import g from"@mui/joy/Typography";import E from"@mui/joy/Alert";import{useFormContext as b,Controller as y,useForm as x,FormProvider as w}from"react-hook-form";import v from"@mui/joy/Input";import S from"@mui/joy/FormControl";import C from"@mui/joy/FormHelperText";import k from"@mui/icons-material/Error";import T from"@mui/joy/FormLabel";import j from"@mui/joy/Select";import P from"@mui/joy/Option";import U from"@mui/joy/Tooltip";import{Switch as I,Modal as q,ModalDialog as F,Stack as R,Typography as B,FormControl as M,FormLabel as O,Input as V,Button as A}from"@mui/joy";import L from"@mui/joy/Checkbox";import D from"@mui/joy/List";import $ from"@mui/joy/ListItem";import{DataGrid as N}from"@mui/x-data-grid";import z from"@mui/icons-material/Add";import G from"lodash/isNull";import H from"lodash/isUndefined";import W from"@mui/icons-material/CopyAll";import Q from"@mui/icons-material/CheckCircleOutlined";function J({theme:e,children:r,slotProps:a}){return t.createElement(d,{...a,theme:e},t.createElement(u,{enableColorScheme:!0}),r)}const K=new c,X=r({api:new i({basePath:"https://api.thenile.dev",credentials:"include"}),basePath:""}),{Provider:Y}=X,Z=({children:e})=>t.createElement(s,{client:K},e),_=e=>{const{children:r,theme:n,slotProps:o,tenantId:l,QueryProvider:c=Z,basePath:s="https://api.thenile.dev",api:m}=e,u=a((()=>({api:m??new i({basePath:s,credentials:"include"}),tenantId:String(l),basePath:s})),[m,s,l]);return t.createElement(c,null,t.createElement(J,{slotProps:o?.provider,theme:n},t.createElement(Y,{value:u},r)))},ee=()=>n(X),te=()=>{const{basePath:e,tenantId:t}=ee();return a((()=>({tenantId:t,basePath:e})),[e,t])},re=()=>ee().api;var ae;function ne(){return ne=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},ne.apply(this,arguments)}var oe=function(t){return e.createElement("svg",ne({xmlns:"http://www.w3.org/2000/svg",width:18,height:18},t),ae||(ae=e.createElement("g",{fillRule:"evenodd"},e.createElement("path",{fill:"#EA4335",d:"M9 3.48c1.69 0 2.83.73 3.48 1.34l2.54-2.48C13.46.89 11.43 0 9 0 5.48 0 2.44 2.02.96 4.96l2.91 2.26C4.6 5.05 6.62 3.48 9 3.48"}),e.createElement("path",{fill:"#4285F4",d:"M17.64 9.2c0-.74-.06-1.28-.19-1.84H9v3.34h4.96c-.1.83-.64 2.08-1.84 2.92l2.84 2.2c1.7-1.57 2.68-3.88 2.68-6.62"}),e.createElement("path",{fill:"#FBBC05",d:"M3.88 10.78A5.5 5.5 0 0 1 3.58 9c0-.62.11-1.22.29-1.78L.96 4.96A9 9 0 0 0 0 9c0 1.45.35 2.82.96 4.04z"}),e.createElement("path",{fill:"#34A853",d:"M9 18c2.43 0 4.47-.8 5.96-2.18l-2.84-2.2c-.76.53-1.78.9-3.12.9-2.38 0-4.4-1.57-5.12-3.74L.97 13.04C2.45 15.98 5.48 18 9 18"}),e.createElement("path",{fill:"none",d:"M0 0h18v18H0z"}))))};function le(e){const{databaseId:r,newTenantName:a}=e,{basePath:n}=te(),o=`${n}/databases/${encodeURIComponent(r??"")}/users/oidc/google/login`,l=a?"?newTenant="+encodeURIComponent(a):"",i=(e?.href??o)+l;return t.createElement(p,{component:"a",href:i,display:"flex",flex:1,sx:{textDecoration:"none"}},t.createElement(p,null,t.createElement(f,{sx:{padding:0,textTransform:"initial",flex:1},"aria-label":"log in with google"},t.createElement(h,{direction:"row",alignItems:"center",p:0,flex:1,fontFamily:"Roboto, sans-serif",fontSize:"14px",display:"inline-flex",color:"rgb(255 255, 255)",boxShadow:"rgb(0 0 0 / 24%) 0px 2px 2px 0px rgb(0 0 0 / 24%) 0px 0px 1px 0px",borderRadius:"4px",border:"1px solid transparent",fontWeight:"500",sx:{backgroundColor:"rgb(66 133, 244)"}},t.createElement(p,{padding:"11px",display:"flex",border:"1px solid rgb(66, 133, 244)",borderRadius:"4px",sx:{background:"rgb(255, 255, 255)"}},t.createElement(oe,{"aria-hidden":"true"})),t.createElement(p,{padding:"10px",flex:1},t.createElement(g,{sx:{color:"white"},fontWeight:700,fontFamily:"Roboto, sans-serif",fontSize:"14px",height:"20px"},"Continue with Google"))))))}function ie(t){const{options:r,attribute:a,display:n,helperText:o}=t,{watch:l,control:i}=b(),c=l(a.name),s={};return o&&(s.color="danger"),e.createElement(y,{name:a.name,rules:{required:Boolean(a.required)},control:i,render:({field:t})=>e.createElement(h,null,e.createElement(T,{htmlFor:`${t.name}`},n.label),e.createElement(p,{role:"group","aria-labelledby":a.name,sx:{borderRadius:"var(--joy-radius-sm)",p:.5,border:o?"1px solid var(--joy-palette-danger-outlinedBorder)":"none"}},e.createElement(D,{orientation:"horizontal",wrap:!0,sx:{"--List-gap":"8px"}},r.map((n=>(s.id=String(n.value),e.createElement($,{key:`${n.value}-${n.label}`},e.createElement(L,{overlay:r.length>1,...s,checked:c.includes(n.value),disableIcon:r.length>1,variant:"soft",label:n.label,onChange:e=>{if(a.allowMultiple)if(e.target.checked)c?t.onChange(c.concat(n.value)):t.onChange([n.value]);else{const e=c.filter((e=>e!==n.value));e.length>0?t.onChange(e):t.onChange("")}else e.target.checked?t.onChange(n.value):t.onChange("")}}))))))),e.createElement(g,{sx:{color:"var(--joy-palette-danger-500)"},level:"body-sm"},o))})}var ce;!function(e){e.Text="text",e.Password="password",e.Select="select",e.Number="number",e.Float="float",e.Checkbox="checkbox",e.Switch="switch"}(ce||(ce={}));const se=e=>!0===e.allowMultiple&&!Array.isArray(e.defaultValue)&&e.defaultValue?"number"==typeof e.defaultValue?[e.defaultValue]:[String(e.defaultValue)]:e.defaultValue??"";function me(e){const{error:r,attr:a}=e;return r?t.createElement(U,{title:r,color:"danger",sx:{cursor:"pointer"}},t.createElement(T,null,a.label??a.name,t.createElement(k,{sx:{ml:.5,"--Icon-color":"#c41c1c"},fontSize:"small"}))):t.createElement(T,null,a.label??a.name)}function ue(e){const{mutation:r,buttonText:a,attributes:n,cancelButton:o,loading:l,successMessage:i}=e,c=t.useMemo((()=>n.reduce(((e,t)=>(e[t.name]=se(t),e)),{})),[n]),s=x({defaultValues:c}),{register:m,control:u,handleSubmit:d,formState:{errors:g}}=s,E=t.useCallback((e=>{r.mutate(e)}),[r]);return t.createElement(w,{...s},t.createElement(h,{component:"form",onSubmit:d((e=>E(e))),spacing:2},n.map((e=>{const r={},a={key:e.name,label:e.label??e.name,id:e.label??e.name,placeholder:e.placeholder??e.label??e.name,error:Boolean(g[e.name]),disabled:Boolean(e.disabled)},n=e.options??[],o=e.helpText??"";let l="";switch(e.required&&(l=g[e.name]?`${e.label??e.name} is required`:"",r.required=!0),e.type){case ce.Switch:return t.createElement(S,{key:a.key,id:a.id,orientation:"horizontal",sx:{alignItems:"center"}},t.createElement(p,null,t.createElement(me,{error:l,attr:e}),t.createElement(C,{id:`${e.name}-helper-text`},o)),t.createElement(y,{control:u,rules:{required:Boolean(e.required)},name:e.name,render:({field:r})=>{const a={};return g[e.name]&&(a.color="danger"),t.createElement(I,{id:`switch-field-${e.name}`,...a,...r,checked:Boolean(r.value),onChange:e=>{r.onChange(e.target.checked)},color:r.value?"success":"neutral",endDecorator:r.value?n[0].label:n[1].label})}}));case ce.Checkbox:return t.createElement(ie,{key:a.key,attribute:e,display:a,options:n,helperText:o});case ce.Select:return t.createElement(S,{key:a.key,id:a.id},t.createElement(me,{error:l,attr:e}),t.createElement(y,{control:u,rules:{required:Boolean(e.required)},name:e.name,render:({field:r})=>{const l={};g[e.name]&&(l.color="danger");const i=String(r.value);return t.createElement(h,null,t.createElement(j,{id:`select-field-${e.name}`,placeholder:`${a.placeholder}...`,...l,...r,value:i,onChange:(e,t)=>{r.onChange(t)}},n.map((e=>t.createElement(P,{key:String(e.value??""),value:e.value},e.label)))),t.createElement(C,{id:`${e.name}-helper-text`},o))}}));case ce.Password:return t.createElement(S,{key:a.key,id:a.id},t.createElement(me,{error:l,attr:e}),t.createElement(v,{...a,...m(e.name,r),type:ce.Password}),t.createElement(C,{id:`${e.name}-helper-text`},o));case ce.Number:return t.createElement(S,{key:a.key,id:a.id},t.createElement(me,{error:l,attr:e}),t.createElement(v,{...a,...m(e.name,r),type:ce.Number}),t.createElement(C,{id:`${e.name}-helper-text`},o));case ce.Text:default:return t.createElement(S,{key:a.key,id:a.id},t.createElement(me,{error:l,attr:e}),t.createElement(v,{...a,...m(e.name,r)}),t.createElement(C,{id:`${e.name}-helper-text`},o))}})),o?t.createElement(h,{spacing:2,direction:"row"},o,t.createElement(p,null,t.createElement(f,{type:"submit"},a))):t.createElement(p,null,t.createElement(h,{direction:"row",gap:2},t.createElement(f,{type:"submit",loading:l},a),i))))}function de(e){const[r,a]=t.useState(),{buttonText:n="Sign up",onSuccess:o,onError:l,attributes:i,beforeMutate:c}=e,s=re(),u=m((async e=>{a(void 0);const t=(c&&c(e))??e,{email:r,password:n,preferredName:o,newTenant:l,...i}=t;return Object.keys(i).length>0&&console.warn("additional metadata not supported yet."),s.auth.signUp({signUpRequest:{email:r,password:n,preferredName:o,newTenant:l}})}),{onSuccess:o,onError:(e,t)=>{a(e.message),l&&l(e,t)}}),d=t.useMemo((()=>{const e=[{name:"email",label:"Email",type:ce.Text,defaultValue:"",required:!0},{name:"password",label:"Password",type:ce.Password,defaultValue:"",required:!0}];return i&&i.length>0?e.concat(i):e}),[i]);return t.createElement(h,{gap:2},r?t.createElement(E,{color:"danger"},r):null,t.createElement(ue,{mutation:u,buttonText:n,attributes:d}))}function pe(e){const[r,a]=t.useState(),{attributes:n,onSuccess:o,onError:l,beforeMutate:i}=e,c=re(),s=m((async e=>{a(void 0);const t=(i&&i(e))??e;return await c.auth.login({loginRequest:t})}),{onSuccess:o,onError:l}),u=t.useMemo((()=>{const e=[{name:"email",label:"Email",type:ce.Text,defaultValue:"",required:!0},{name:"password",label:"Password",type:ce.Password,defaultValue:"",required:!0}];return n&&n.length>0?e.concat(n):e}),[n]);return t.createElement(h,{gap:2},r?t.createElement(E,{color:"danger"},r):null,t.createElement(ue,{mutation:s,buttonText:"Log in",attributes:u}))}function fe(e){const{attributes:r,onSuccess:a,onError:n,beforeMutate:o,nextButtonText:l="Next",loginButtonText:i="Log in",disableSSO:c=!1}=e,s=re(),[u,d]=t.useState(c?i:l),p=m((async e=>{const t=(o&&o(e))??e;return await s.auth.login({loginRequest:{email:t.email,password:t.password},sso:!c})}),{onSuccess:(e,t)=>{e&&(e?.redirectURI?window.location.href=e.redirectURI:u!==i?d(i):a&&a(e,t))},onError:(e,t)=>{u===i?n&&n(e,t):d(i)}}),f=t.useMemo((()=>{const e=[{name:"email",label:"Email",type:ce.Text,defaultValue:"",required:!0}];return u===i&&e.push({name:"password",label:"Password",type:ce.Password,defaultValue:"",required:!0}),r&&r.length>0?e.concat(r):e}),[r,u,i]);return t.createElement(ue,{mutation:p,buttonText:u,attributes:f})}function he(e){const{open:r,setOpen:a,refetch:n}=e,{tenantId:o}=te(),l=re(),[i,c]=t.useState(),{watch:s,register:u,handleSubmit:d}=x(),p=s("email");t.useEffect((()=>{null!=i&&c()}),[p]);const f=m((e=>l.users.createTenantUser({signUpRequest:e,tenantId:String(o)})),{onSuccess(e){n&&n(e),a(!1)},onError(e){e instanceof Error&&c(e.message)}}),h=t.useCallback((async e=>{c(""),f.mutate(e)}),[f]);return t.createElement(q,{open:r},t.createElement(F,null,t.createElement(R,{spacing:2},t.createElement(B,{level:"h4"},"Create user"),t.createElement(t.Fragment,null,i&&t.createElement(B,{color:"danger"},i)),t.createElement(R,{component:"form",sx:{width:"40ch"},spacing:1,onSubmit:d((e=>h(e)))},t.createElement(M,{sx:{"--FormHelperText-color":"var(--joy-palette-danger-500)"}},t.createElement(O,{htmlFor:"email"},"Email"),t.createElement(V,{...u("email"),fullWidth:!0,size:"lg",id:"email",name:"email",autoComplete:"current-email",required:!0,error:Boolean(i)})),t.createElement(M,{sx:{"--FormHelperText-color":"var(--joy-palette-danger-500)"}},t.createElement(O,{htmlFor:"password"},"Password"),t.createElement(V,{...u("password"),fullWidth:!0,size:"lg",id:"password",autoComplete:"current-password",type:"password",required:!0})),t.createElement(R,{direction:"row",sx:{pt:2},spacing:2},t.createElement(A,{onClick:()=>a(!1),variant:"plain"},"Cancel"),t.createElement(A,{type:"submit"},"Create"))))))}function ge(e){const{allowCreation:r,buttonText:a,onUserCreateSuccess:n}=e,[l,i]=o(!1);return r?t.createElement(h,{alignItems:"flex-end",gap:1},t.createElement(he,{open:l,setOpen:i,refetch:n}),t.createElement(f,{startDecorator:t.createElement(z,null),size:"sm",onClick:()=>i(!0)},a)):null}const Ee=e=>Object.keys(e).reduce(((t,r)=>{const a=e[r];return a instanceof Set?t[r]=Array.from(a).join(", "):Array.isArray(a)?t[r]=a.join(", "):t[r]=a,t}),{}),be=(e,t,r)=>{if(!e)return[[],[]];const a=e.map(Ee),n=Object.keys(a[0]),o={},l=n?.map((e=>{const n=function(e,t,r){let a=r&&e?r.measureText(String(e)).width:50;a+=27;let n=a;return n=16+Math.ceil(r?r.measureText(t.reduce(((t,r)=>{let a=r[String(e)];return(G(a)||H(a))&&(a=""),a=a?.toString(),t.length>a.length?t:a}),"")).width:50),n<a&&(n=a),n+=8,n}(e,a,t),l=e.slice();if(r.includes(l))return null==o[l]?o[l]=l.length:o[l]+=1,{field:l.padEnd(o[l]),headerName:l.padEnd(o[l]),width:n}})).filter(Boolean)??[];return[l,a]};function ye(e,t){const r=function(){const[e,t]=o();return l((()=>{const e=document.createElement("canvas").getContext("2d");e&&(e.font="18px Roboto",t(e))}),[]),e}(),[n,i]=a((()=>be(e,r,t)),[e,r,t]);return[n,i]}function xe(e){const{data:r,allowCreation:a=!0,buttonText:n="Add a user",onUserCreateSuccess:o,slots:l,include:i=["email","preferedName"]}=e,c={width:"100%",height:"100%",...l?.dataGrid??{}},[s,m]=ye(r,i);return t.createElement(h,{flex:1},t.createElement(ge,{allowCreation:a,buttonText:n,onUserCreateSuccess:o}),t.createElement(N,{sx:c,rows:m,columns:s,hideFooter:!0}))}function we(e){const{config:r,providerName:a,onSuccess:n,onError:o,allowEdit:l=!0,configurationGuide:i}=e,c=re(),[s,u]=t.useState(!1),[d,p]=t.useState(!1),[f,b]=t.useState(r),y=t.useRef(),x=t.useMemo((()=>{const e=[{name:"enabled",label:"Allow Okta logins",type:ce.Switch,defaultValue:!0===f?.enabled,options:[{label:"Enabled"},{label:"Disabled"}],disabled:!l},{name:"clientId",label:"Client id",type:ce.Text,defaultValue:f?.clientId??"",required:!0,disabled:!l},{name:"configUrl",label:"Config url",type:ce.Text,defaultValue:f?.configUrl??"",helpText:"The URL of the .well-known/openid-configuration for the identity provider",required:!0,disabled:!l},{name:"emailDomains",label:"Email domains",type:ce.Text,defaultValue:f?.emailDomains?.join(", ")??"",required:!0,helpText:"A comma seperated list of email domains (yourDomain.com) to be used",disabled:!l}];return f?.clientId||e.splice(2,0,{name:"clientSecret",label:"Client secret",type:ce.Password,defaultValue:"",required:!0,disabled:!l}),e}),[l,f?.clientId,f?.configUrl,f?.emailDomains,f?.enabled]),w=m((e=>{u(!0);const t={providerName:a.toLowerCase(),updateProviderRequest:{...e,emailDomains:e.emailDomains.split(",")}};return null!=f?c.auth.updateProvider(t):c.auth.createProvider(t)}),{onSuccess:(e,t)=>{b(e),p(!0),n&&n(e,t)},onError:o,onSettled:(e,t,r)=>{u(!1),y.current&&clearTimeout(y.current),y.current=setTimeout((()=>{p(!1)}),3e3),e||(t&&!t?.message.includes("Unterminated string")||b({enabled:r.enabled,clientId:r.clientId,configUrl:r.configUrl,emailDomains:r.emailDomains.split(", ")}),p(!0),n&&n(e,r))}});return t.useEffect((()=>{})),t.createElement(h,{gap:2,position:"relative"},t.createElement(g,{level:"h4"},"Step 1"),i,t.createElement(g,{level:"h4"},"Step 2"),t.createElement(ue,{mutation:w,buttonText:"Update",attributes:x,loading:s,successMessage:t.createElement(E,{color:"success",sx:{opacity:d?1:0,transition:"opacity 200ms",height:"0.9rem"},startDecorator:t.createElement(Q,null)},t.createElement(g,{textAlign:"center",fontSize:"sm"},"Provider updated"))}))}function ve({callbackUrl:e}){const[r,a]=t.useState(!1),n=t.useRef();return t.useEffect((()=>{n.current&&clearTimeout(n.current),n.current=setTimeout((()=>{a(!1)}),3250)}),[r]),t.createElement(h,{gap:2},t.createElement(g,null,"In order for Okta to redirect properly, provide the following URL as the"," ",t.createElement(p,{component:"span",sx:{fontFamily:"monospace"}},"Sign-in redirect URIs")," ","in the admin configuration of your application."),t.createElement(v,{onClick:async()=>{e&&(await navigator.clipboard.writeText(e),a(!0))},sx:e=>({input:{cursor:"pointer"},span:{cursor:"pointer"},"&:hover svg":{"--Icon-color":e.palette.primary[500]}}),value:e,readOnly:!0,endDecorator:t.createElement(U,{title:"Copy Okta redirect URL"},t.createElement(p,{position:"relative",width:r?"82px":"24px",height:"24px"},t.createElement(p,{position:"absolute",top:"0",left:"0",sx:{opacity:r?0:1,transition:"opacity 300ms"}},t.createElement(W,null)),t.createElement(p,{position:"absolute",top:"0",left:"0",sx:{opacity:r?1:0,transition:"opacity 300ms"}},t.createElement(h,{direction:"row",gap:1},t.createElement(Q,null),t.createElement(g,{color:"primary"},"Copied!")))))}))}function Se(e){const{callbackUrl:r,providers:a,...n}=e;if(!a)return null;const o=a?.find((e=>"okta"===e.provider));return t.createElement(we,{...n,config:o,providerName:"Okta",configurationGuide:t.createElement(ve,{callbackUrl:r})})}export{ce as FormAttributeType,le as GoogleLoginButton,_ as NileProvider,Se as Okta,we as SSOForm,fe as SingleSignOnForm,pe as UserLoginForm,de as UserSignupForm,xe as UserTenantList};
2
2
  //# sourceMappingURL=react.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.esm.js","sources":["../src/context/config.ts","../src/context/theme.tsx","../src/context/index.tsx","../src/GoogleLoginButton/google.svg","../src/GoogleLoginButton/GoogleLoginButton.tsx","../src/lib/SimpleForm/CheckGroup/index.tsx","../src/lib/SimpleForm/types.ts","../src/lib/SimpleForm/index.tsx","../src/SignUpForm/SignUpForm.tsx","../src/LoginForm/LoginForm.tsx","../src/LoginForm/SingleSignOn.tsx","../src/UserTenantList/UserModal.tsx","../src/UserTenantList/CreateUser.tsx","../src/UserTenantList/useDataParser.ts","../src/utils/getColumnSize.ts","../src/hooks/useTextSizer.ts","../src/UserTenantList/UserList.tsx","../src/SSO/BaseSSOForm.tsx","../src/SSO/Okta.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport deepmerge from '@mui/utils/deepmerge';\nimport { extendTheme as extendJoyTheme } from '@mui/joy/styles';\nimport { experimental_extendTheme as extendMuiTheme } from '@mui/material/styles';\n\nconst palette = {\n primary: {\n '50': '#fff7ed',\n '100': '#FFEAD2',\n '200': '#FFDCB5',\n '300': '#FFCE97', //primary\n '400': '#FFC480',\n '500': '#FDC067',\n '600': '#FFB262',\n '700': '#FFAA57',\n '800': '#FFA24D',\n '900': '#FF933C',\n solidColor: 'rgba(var(--nile-palette-primary-contrastTextChannel) / 1)',\n softColor: 'rgba(var(--nile-palette-primary-contrastTextChannel) / .5)',\n solidDisabledBg: 'var(--nile-palette-grey-600)',\n solidDisabledColor: 'var(--nile-palette-grey-700)',\n plainHoverBg:\n 'rgba(var(--nile-palette-primary-mainChannel) / var(--nile-palette-action-hoverOpacity))',\n outlinedHoverBg:\n 'rgba(var(--nile-palette-primary-mainChannel) / var(--nile-palette-action-selectedOpacity))',\n },\n neutral: {\n outlinedHoverBg:\n 'rgba(var(--nile-palette-neutral-mainChannel) / var(--nile-palette-action-selectedOpacity))',\n softBg: 'rgba(45, 45, 51)',\n },\n // @ts-ignore\n purple: {\n '50': '#f0edff',\n '100': '#d8d3ff', // primary\n '200': '#beb6fe',\n '300': '#a298fb',\n '400': '#8a7ff7',\n '500': '#7269f3',\n '600': '#6663eb',\n '700': '#565ae1',\n '800': '#4754d8',\n '900': '#2d47c9',\n },\n blue: {\n '50': '#dff8ff',\n '100': '#adedff',\n '200': '#6fe2ff', // primary\n '300': '#12d6fb',\n '400': '#00ccf6',\n '500': '#00c2f0',\n '600': '#00b2dc',\n '700': '#009dc0',\n '800': '#008aa6',\n '900': '#006778',\n },\n divider: '#181818',\n text: {\n primary: '#fff7ed',\n tertiary: 'rgba(255 255 255 / 0.5)',\n },\n background: {\n surface: '#000',\n body: '#000',\n default: '#000',\n },\n tableCell: {\n border: 'none',\n },\n};\n\nconst { unstable_sxConfig: muiSxConfig, ...muiTheme } = extendMuiTheme({\n cssVarPrefix: 'nile',\n colorSchemes: {\n dark: {\n palette: {\n primary: {\n main: '#FFCE97',\n },\n },\n },\n },\n});\n\nconst { unstable_sxConfig: joySxConfig, ...joyTheme } = extendJoyTheme({\n cssVarPrefix: 'nile',\n components: {\n JoyInput: {\n styleOverrides: {\n input: {\n ':disabled': { color: 'var(--nile-palette-neutral-500)' },\n '::placeholder': {\n opacity: 0.6,\n },\n color: 'white',\n },\n },\n },\n },\n colorSchemes: {\n dark: { palette },\n light: { palette },\n },\n});\nconst mergedTheme = {\n ...muiTheme,\n ...joyTheme,\n colorSchemes: deepmerge(muiTheme.colorSchemes, joyTheme.colorSchemes),\n typography: {\n ...muiTheme.typography,\n ...joyTheme.typography,\n },\n} as unknown as ReturnType<typeof extendJoyTheme>;\n\nmergedTheme.generateCssVars = (colorScheme) => ({\n css: {\n ...muiTheme.generateCssVars(colorScheme).css,\n ...joyTheme.generateCssVars(colorScheme).css,\n },\n //@ts-expect-error - new dev\n vars: deepmerge(\n muiTheme.generateCssVars(colorScheme).vars,\n joyTheme.generateCssVars(colorScheme).vars\n ),\n});\n\nmergedTheme.unstable_sxConfig = {\n ...muiSxConfig,\n ...joySxConfig,\n};\nexport default mergedTheme;\n","// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nimport React from 'react';\nimport CssBaseline from '@mui/material/CssBaseline';\nimport { Theme } from '@mui/joy/styles';\nimport { CssVarsProvider as JoyCssVarsProvider } from '@mui/joy/styles';\n\nimport defaultTheme from './config';\n\nexport default function Themer({\n theme,\n children,\n}: {\n theme?: Theme;\n children: JSX.Element;\n}) {\n return (\n <JoyCssVarsProvider theme={theme ?? defaultTheme} defaultMode=\"dark\">\n <CssBaseline enableColorScheme />\n {children}\n </JoyCssVarsProvider>\n );\n}\n","// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nimport React, { useMemo, createContext, useContext } from 'react';\nimport Browser from '@niledatabase/browser';\nimport { QueryClientProvider, QueryClient } from '@tanstack/react-query';\n\nimport ThemeProvider from './theme';\nimport { NileContext, NileProviderProps, NileReactConfig } from './types';\n\nconst queryClient = new QueryClient();\n\nconst defaultContext: NileContext = {\n api: new Browser({\n basePath: 'https://api.thenile.dev',\n credentials: 'include',\n }),\n basePath: '',\n};\n\nconst context = createContext<NileContext>(defaultContext);\n\nconst { Provider } = context;\n\nexport const BaseQueryProvider = ({\n children,\n}: {\n children: JSX.Element;\n}): JSX.Element => {\n return (\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n );\n};\n\nexport const NileProvider = (props: NileProviderProps) => {\n const {\n children,\n theme,\n tenantId,\n QueryProvider = BaseQueryProvider,\n basePath = 'https://api.thenile.dev',\n api,\n } = props;\n\n const values = useMemo<NileContext>((): NileContext => {\n return {\n api:\n api ??\n new Browser({\n basePath,\n credentials: 'include',\n }),\n tenantId: String(tenantId),\n basePath,\n };\n }, [api, basePath, tenantId]);\n\n return (\n <QueryProvider>\n <ThemeProvider theme={theme}>\n <Provider value={values}>{children}</Provider>\n </ThemeProvider>\n </QueryProvider>\n );\n};\n\nconst useNileContext = (): NileContext => {\n return useContext(context);\n};\n\nexport const useNileConfig = (): NileReactConfig => {\n const { basePath, tenantId } = useNileContext();\n return useMemo(\n () => ({\n tenantId,\n basePath,\n }),\n [basePath, tenantId]\n );\n};\n\nexport const useApi = (): Browser => {\n return useNileContext().api;\n};\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\">\n <g fill=\"#000\" fill-rule=\"evenodd\">\n <path d=\"M9 3.48c1.69 0 2.83.73 3.48 1.34l2.54-2.48C13.46.89 11.43 0 9 0 5.48 0 2.44 2.02.96 4.96l2.91 2.26C4.6 5.05 6.62 3.48 9 3.48z\" fill=\"#EA4335\" />\n <path d=\"M17.64 9.2c0-.74-.06-1.28-.19-1.84H9v3.34h4.96c-.1.83-.64 2.08-1.84 2.92l2.84 2.2c1.7-1.57 2.68-3.88 2.68-6.62z\" fill=\"#4285F4\" />\n <path d=\"M3.88 10.78A5.54 5.54 0 0 1 3.58 9c0-.62.11-1.22.29-1.78L.96 4.96A9.008 9.008 0 0 0 0 9c0 1.45.35 2.82.96 4.04l2.92-2.26z\" fill=\"#FBBC05\" />\n <path d=\"M9 18c2.43 0 4.47-.8 5.96-2.18l-2.84-2.2c-.76.53-1.78.9-3.12.9-2.38 0-4.4-1.57-5.12-3.74L.97 13.04C2.45 15.98 5.48 18 9 18z\" fill=\"#34A853\" />\n <path fill=\"none\" d=\"M0 0h18v18H0z\" />\n </g>\n</svg>","import React from 'react';\nimport Box from '@mui/joy/Box';\nimport Button from '@mui/joy/Button';\nimport Stack from '@mui/joy/Stack';\nimport Typography from '@mui/joy/Typography';\n\nimport { useNileConfig } from '../context';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport GoogleLogo from './google.svg';\n\nconst LOGIN_PATH = 'users/oidc/google/login';\n\n/**\n * A component for a Google login button, according to their design language.\n * This works when an identity provider is configured in the admin dashboard.\n * @param props href: a string to override the URL provided by the context\n * @returns a JSX.Element to render\n */\nexport default function GoogleSSOButton(props: {\n href?: string;\n databaseId?: string;\n newTenantName?: string;\n}) {\n const { databaseId, newTenantName } = props;\n const { basePath } = useNileConfig();\n const encodedDatabase = encodeURIComponent(databaseId ?? '');\n const contextHref = `${basePath}/databases/${encodedDatabase}/${LOGIN_PATH}`;\n const query = newTenantName\n ? '?newTenant=' + encodeURIComponent(newTenantName)\n : '';\n const href = (props?.href ?? contextHref) + query;\n return (\n <Box\n component=\"a\"\n href={href}\n display=\"flex\"\n flex={1}\n sx={{ textDecoration: 'none' }}\n >\n <Box>\n <Button\n sx={{ padding: 0, textTransform: 'initial', flex: 1 }}\n aria-label=\"log in with google\"\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n p={0}\n flex={1}\n fontFamily=\"Roboto, sans-serif\"\n fontSize=\"14px\"\n display=\"inline-flex\"\n color=\"rgb(255 255, 255)\"\n boxShadow=\"rgb(0 0 0 / 24%) 0px 2px 2px 0px rgb(0 0 0 / 24%) 0px 0px 1px 0px\"\n borderRadius=\"4px\"\n border=\"1px solid transparent\"\n fontWeight=\"500\"\n sx={{\n backgroundColor: 'rgb(66 133, 244)',\n }}\n >\n <Box\n padding=\"11px\"\n display=\"flex\"\n border=\"1px solid rgb(66, 133, 244)\"\n borderRadius=\"4px\"\n sx={{\n background: 'rgb(255, 255, 255)',\n }}\n >\n <GoogleLogo aria-hidden=\"true\" />\n </Box>\n <Box padding=\"10px\" flex={1}>\n <Typography\n sx={{ color: 'white' }}\n fontWeight={700}\n fontFamily=\"Roboto, sans-serif\"\n fontSize=\"14px\"\n height=\"20px\"\n >\n Continue with Google\n </Typography>\n </Box>\n </Stack>\n </Button>\n </Box>\n </Box>\n );\n}\n","import * as React from 'react';\nimport Box from '@mui/joy/Box';\nimport Checkbox from '@mui/joy/Checkbox';\nimport List from '@mui/joy/List';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport Stack from '@mui/joy/Stack';\nimport FormLabel from '@mui/joy/FormLabel';\nimport ListItem from '@mui/joy/ListItem';\nimport Typography from '@mui/joy/Typography';\n\nimport { Attribute, DisplayProps, Options } from '../types';\n\ntype Props = {\n attribute: Attribute;\n display: DisplayProps;\n options: Options;\n helperText: string;\n};\nexport default function CheckGroup(props: Props) {\n const { options, attribute, display, helperText } = props;\n const { watch, control } = useFormContext();\n const currentVals = watch(attribute.name);\n const checkProps: { color?: 'danger'; id?: string } = {};\n if (helperText) {\n checkProps.color = 'danger';\n }\n return (\n <Controller\n name={attribute.name}\n rules={{ required: Boolean(attribute.required) }}\n control={control}\n render={({ field }) => {\n return (\n <Stack>\n <FormLabel htmlFor={`${field.name}`}>{display.label}</FormLabel>\n <Box\n role=\"group\"\n aria-labelledby={attribute.name}\n sx={{\n borderRadius: 'var(--joy-radius-sm)',\n p: 0.5,\n border: helperText\n ? '1px solid var(--joy-palette-danger-outlinedBorder)'\n : 'none',\n }}\n >\n <List\n orientation=\"horizontal\"\n wrap\n sx={{\n '--List-gap': '8px',\n }}\n >\n {options.map((item) => {\n checkProps.id = String(item.value);\n return (\n <ListItem key={`${item.value}-${item.label}`}>\n <Checkbox\n overlay={options.length > 1}\n {...checkProps}\n checked={currentVals.includes(item.value)}\n disableIcon={options.length > 1}\n variant=\"soft\"\n label={item.label}\n onChange={(event) => {\n if (attribute.allowMultiple) {\n if (event.target.checked) {\n if (!currentVals) {\n field.onChange([item.value]);\n } else {\n field.onChange(currentVals.concat(item.value));\n }\n } else {\n const remaining = currentVals.filter(\n (val: string | number) => val !== item.value\n );\n if (remaining.length > 0) {\n field.onChange(remaining);\n } else {\n field.onChange('');\n }\n }\n } else {\n if (event.target.checked) {\n field.onChange(item.value);\n } else {\n field.onChange('');\n }\n }\n }}\n />\n </ListItem>\n );\n })}\n </List>\n </Box>\n <Typography\n sx={{ color: 'var(--joy-palette-danger-500)' }}\n level=\"body-sm\"\n >\n {helperText}\n </Typography>\n </Stack>\n );\n }}\n />\n );\n}\n","export enum AttributeType {\n Text = 'text',\n Password = 'password',\n Select = 'select',\n Number = 'number',\n Float = 'float',\n Checkbox = 'checkbox',\n Switch = 'switch',\n}\ntype SimplePrimitive = number | string | boolean;\n\n// possibly no value for `<Switch/>`\nexport type Options = { label: string; value?: SimplePrimitive }[];\nexport type Attribute = {\n name: string;\n type?: AttributeType;\n defaultValue?: SimplePrimitive;\n options?: Options;\n allowMultiple?: boolean;\n label?: string;\n required?: boolean;\n placeholder?: string;\n helpText?: string;\n disabled?: boolean;\n};\n\nexport type DisplayProps = {\n key: string;\n id: string;\n label: string;\n placeholder: string;\n error?: boolean;\n color?: 'danger';\n disabled?: boolean;\n};\n","import React from 'react';\nimport Button from '@mui/joy/Button';\nimport { Controller, FormProvider, useForm } from 'react-hook-form';\nimport Stack from '@mui/joy/Stack';\nimport Input from '@mui/joy/Input';\nimport FormControl from '@mui/joy/FormControl';\nimport FormHelperText from '@mui/joy/FormHelperText';\nimport Error from '@mui/icons-material/Error';\nimport FormLabel from '@mui/joy/FormLabel';\nimport Select from '@mui/joy/Select';\nimport Option from '@mui/joy/Option';\nimport Box from '@mui/joy/Box';\nimport Tooltip from '@mui/joy/Tooltip';\nimport { Switch } from '@mui/joy';\n\nimport CheckGroup from './CheckGroup';\nimport { Attribute, AttributeType, DisplayProps } from './types';\n\ntype AttrMap = {\n [key: string]: string | number | boolean | string[] | number[];\n};\n\ntype FieldConfig = {\n required?: boolean;\n};\n\nexport const getAttributeDefault = (\n attribute: Attribute\n): string | number | boolean | string[] | number[] => {\n // have to look to see if it is an enum\n if (attribute.allowMultiple === true) {\n if (!Array.isArray(attribute.defaultValue) && attribute.defaultValue) {\n if (typeof attribute.defaultValue === 'number') {\n return [attribute.defaultValue];\n }\n return [String(attribute.defaultValue)];\n }\n }\n return attribute.defaultValue ?? '';\n};\n\nfunction Labler(props: { error?: string; attr: Attribute }) {\n const { error, attr } = props;\n if (error) {\n return (\n <Tooltip title={error} color=\"danger\" sx={{ cursor: 'pointer' }}>\n <FormLabel>\n {attr.label ?? attr.name}\n <Error sx={{ ml: 0.5, '--Icon-color': '#c41c1c' }} fontSize=\"small\" />\n </FormLabel>\n </Tooltip>\n );\n }\n return <FormLabel>{attr.label ?? attr.name}</FormLabel>;\n}\nexport default function SimpleForm(props: {\n buttonText: string;\n cancelButton?: React.ReactNode;\n attributes: Attribute[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mutation: any;\n loading?: boolean;\n successMessage?: JSX.Element;\n}) {\n const {\n mutation,\n buttonText,\n attributes,\n cancelButton,\n loading,\n successMessage,\n } = props;\n\n const defaultValues = React.useMemo(\n () =>\n attributes.reduce((accum: AttrMap, attr: Attribute) => {\n accum[attr.name] = getAttributeDefault(attr);\n return accum;\n }, {}),\n [attributes]\n );\n\n const methods = useForm({\n defaultValues,\n });\n\n const {\n register,\n control,\n handleSubmit,\n formState: { errors },\n } = methods;\n const onSubmit = React.useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (data: any) => {\n mutation.mutate(data);\n },\n [mutation]\n );\n\n return (\n <FormProvider {...methods}>\n <Stack\n component=\"form\"\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSubmit={handleSubmit((data) => onSubmit(data as any))}\n spacing={2}\n >\n {attributes.map((attr: Attribute): React.ReactNode => {\n const fieldConfig: FieldConfig = {};\n const display: DisplayProps = {\n key: attr.name,\n label: attr.label ?? attr.name,\n id: attr.label ?? attr.name,\n placeholder: attr.placeholder ?? attr.label ?? attr.name,\n error: Boolean(errors[attr.name]),\n disabled: Boolean(attr.disabled),\n };\n const options = attr.options ?? [];\n const helperText = attr.helpText ?? '';\n let error = '';\n\n if (attr.required) {\n error = errors[attr.name]\n ? `${attr.label ?? attr.name} is required`\n : '';\n fieldConfig.required = true;\n }\n\n switch (attr.type) {\n case AttributeType.Switch:\n return (\n <FormControl\n key={display.key}\n id={display.id}\n orientation=\"horizontal\"\n sx={{ alignItems: 'center' }}\n >\n <Box>\n <Labler error={error} attr={attr} />\n <FormHelperText id={`${attr.name}-helper-text`}>\n {helperText}\n </FormHelperText>\n </Box>\n <Controller\n control={control}\n rules={{ required: Boolean(attr.required) }}\n name={attr.name}\n render={({ field }) => {\n const color: { color?: 'danger' } = {};\n if (errors[attr.name]) {\n color.color = 'danger';\n }\n return (\n <Switch\n id={`switch-field-${attr.name}`}\n {...color}\n {...field}\n checked={Boolean(field.value)}\n onChange={(event) => {\n field.onChange(event.target.checked);\n }}\n color={field.value ? 'success' : 'neutral'}\n endDecorator={\n field.value ? options[0].label : options[1].label\n }\n sx={{\n '--Switch-thumbSize': '28px',\n }}\n />\n );\n }}\n />\n </FormControl>\n );\n case AttributeType.Checkbox:\n return (\n <CheckGroup\n key={display.key}\n attribute={attr}\n display={display}\n options={options}\n helperText={helperText}\n />\n );\n case AttributeType.Select:\n return (\n <FormControl key={display.key} id={display.id}>\n <Labler error={error} attr={attr} />\n <Controller\n control={control}\n rules={{ required: Boolean(attr.required) }}\n name={attr.name}\n render={({ field }) => {\n const color: { color?: 'danger' } = {};\n if (errors[attr.name]) {\n color.color = 'danger';\n }\n const value = String(field.value);\n return (\n <Stack>\n <Select\n id={`select-field-${attr.name}`}\n placeholder={`${display.placeholder}...`}\n {...color}\n {...field}\n value={value}\n onChange={(_, newValue) => {\n field.onChange(newValue);\n }}\n >\n {options.map((option) => {\n return (\n <Option\n key={String(option.value ?? '')}\n value={option.value}\n >\n {option.label}\n </Option>\n );\n })}\n </Select>\n <FormHelperText id={`${attr.name}-helper-text`}>\n {helperText}\n </FormHelperText>\n </Stack>\n );\n }}\n />\n </FormControl>\n );\n case AttributeType.Password:\n return (\n <FormControl key={display.key} id={display.id}>\n <Labler error={error} attr={attr} />\n <Input\n {...display}\n {...register(attr.name, fieldConfig)}\n type={AttributeType.Password}\n />\n <FormHelperText id={`${attr.name}-helper-text`}>\n {helperText}\n </FormHelperText>\n </FormControl>\n );\n case AttributeType.Number:\n return (\n <FormControl key={display.key} id={display.id}>\n <Labler error={error} attr={attr} />\n <Input\n {...display}\n {...register(attr.name, fieldConfig)}\n type={AttributeType.Number}\n />\n <FormHelperText id={`${attr.name}-helper-text`}>\n {helperText}\n </FormHelperText>\n </FormControl>\n );\n\n case AttributeType.Text:\n default:\n return (\n <FormControl key={display.key} id={display.id}>\n <Labler error={error} attr={attr} />\n <Input {...display} {...register(attr.name, fieldConfig)} />\n <FormHelperText id={`${attr.name}-helper-text`}>\n {helperText}\n </FormHelperText>\n </FormControl>\n );\n }\n })}\n {cancelButton ? (\n <Stack spacing={2} direction=\"row\">\n {cancelButton}\n <Box>\n <Button type=\"submit\">{buttonText}</Button>\n </Box>\n </Stack>\n ) : (\n <Box>\n <Stack direction=\"row\" gap={2}>\n <Button type=\"submit\" loading={loading}>\n {buttonText}\n </Button>\n {successMessage}\n </Stack>\n </Box>\n )}\n </Stack>\n </FormProvider>\n );\n}\n","import React from 'react';\nimport { useMutation } from '@tanstack/react-query';\nimport Stack from '@mui/joy/Stack';\nimport Alert from '@mui/joy/Alert';\n\nimport UserForm from '../lib/SimpleForm';\nimport { Attribute, AttributeType } from '../lib/SimpleForm/types';\nimport { useApi } from '../context';\n\nimport { Props, LoginInfo } from './types';\n\nexport default function SignUpForm(props: Props) {\n const [error, setError] = React.useState<string | void>();\n const {\n buttonText = 'Sign up',\n onSuccess,\n onError,\n attributes,\n beforeMutate,\n } = props;\n const api = useApi();\n const mutation = useMutation(\n async (_data: LoginInfo) => {\n setError(undefined);\n const possibleData = beforeMutate && beforeMutate(_data);\n const data = possibleData ?? _data;\n const { email, password, preferredName, newTenant, ...metadata } = data;\n if (Object.keys(metadata).length > 0) {\n // eslint-disable-next-line no-console\n console.warn('additional metadata not supported yet.');\n }\n return api.auth.signUp({\n signUpRequest: { email, password, preferredName, newTenant },\n });\n },\n {\n onSuccess,\n onError: (e: Error, vars) => {\n setError(e.message);\n onError && onError(e as Error, vars);\n },\n }\n );\n\n const completeAttributes = React.useMemo(() => {\n const mainAttributes: Attribute[] = [\n {\n name: 'email',\n label: 'Email',\n type: AttributeType.Text,\n defaultValue: '',\n required: true,\n },\n {\n name: 'password',\n label: 'Password',\n type: AttributeType.Password,\n defaultValue: '',\n required: true,\n },\n ];\n if (attributes && attributes.length > 0) {\n return mainAttributes.concat(attributes);\n }\n return mainAttributes;\n }, [attributes]);\n\n return (\n <Stack gap={2}>\n {error ? <Alert color=\"danger\">{error}</Alert> : null}\n <UserForm\n mutation={mutation}\n buttonText={buttonText}\n attributes={completeAttributes}\n />\n </Stack>\n );\n}\n","import React from 'react';\nimport { useMutation } from '@tanstack/react-query';\nimport Alert from '@mui/joy/Alert';\nimport Stack from '@mui/joy/Stack';\n\nimport { Attribute } from '../lib/SimpleForm/types';\nimport { useApi } from '../context';\nimport SimpleForm from '../lib/SimpleForm';\nimport { AttributeType } from '../lib/SimpleForm/types';\n\nimport { Props, LoginInfo } from './types';\n\nexport default function LoginForm(props: Props) {\n const [error, setError] = React.useState<string | void>();\n const { attributes, onSuccess, onError, beforeMutate } = props;\n const api = useApi();\n\n const mutation = useMutation(\n async (_data: LoginInfo) => {\n setError(undefined);\n const possibleData = beforeMutate && beforeMutate(_data);\n const data = possibleData ?? _data;\n return await api.auth.login({\n loginRequest: data,\n });\n },\n {\n onSuccess,\n onError,\n }\n );\n\n const completeAttributes = React.useMemo(() => {\n const mainAttributes: Attribute[] = [\n {\n name: 'email',\n label: 'Email',\n type: AttributeType.Text,\n defaultValue: '',\n required: true,\n },\n {\n name: 'password',\n label: 'Password',\n type: AttributeType.Password,\n defaultValue: '',\n required: true,\n },\n ];\n if (attributes && attributes.length > 0) {\n return mainAttributes.concat(attributes);\n }\n return mainAttributes;\n }, [attributes]);\n\n return (\n <Stack gap={2}>\n {error ? <Alert color=\"danger\">{error}</Alert> : null}\n <SimpleForm\n mutation={mutation}\n buttonText=\"Log in\"\n attributes={completeAttributes}\n />\n </Stack>\n );\n}\n","import React from 'react';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { Attribute } from '../lib/SimpleForm/types';\nimport { useApi } from '../context';\nimport SimpleForm from '../lib/SimpleForm';\nimport { AttributeType } from '../lib/SimpleForm/types';\n\nimport { Props, LoginInfo } from './types';\n\nexport default function SingleSignOnForm(\n props: Props & {\n nextButtonText?: string;\n loginButtonText?: string;\n onSuccess: () => void;\n }\n) {\n const {\n attributes,\n onSuccess,\n onError,\n beforeMutate,\n nextButtonText = 'Next',\n loginButtonText = 'Log in',\n disableSSO = false,\n } = props;\n const api = useApi();\n const [buttonText, setButtonText] = React.useState(\n disableSSO ? loginButtonText : nextButtonText\n );\n\n const mutation = useMutation(\n async (_data: LoginInfo) => {\n const possibleData = beforeMutate && beforeMutate(_data);\n const data = possibleData ?? _data;\n return await api.auth.login({\n loginRequest: { email: data.email, password: data.password },\n sso: !disableSSO,\n });\n },\n {\n onSuccess: (token, data) => {\n if (token) {\n if (token?.redirectURI) {\n window.location.href = token.redirectURI;\n } else if (buttonText !== loginButtonText) {\n setButtonText(loginButtonText);\n } else {\n onSuccess && onSuccess(token, data);\n }\n }\n },\n onError: (error, data) => {\n // it is possible SSO failed, so only show errors on if the password is available\n if (buttonText === loginButtonText) {\n onError && onError(error as Error, data);\n } else {\n setButtonText(loginButtonText);\n }\n },\n }\n );\n\n const completeAttributes = React.useMemo(() => {\n const mainAttributes: Attribute[] = [\n {\n name: 'email',\n label: 'Email',\n type: AttributeType.Text,\n defaultValue: '',\n required: true,\n },\n ];\n if (buttonText === loginButtonText) {\n mainAttributes.push({\n name: 'password',\n label: 'Password',\n type: AttributeType.Password,\n defaultValue: '',\n required: true,\n });\n }\n if (attributes && attributes.length > 0) {\n return mainAttributes.concat(attributes);\n }\n return mainAttributes;\n }, [attributes, buttonText, loginButtonText]);\n\n return (\n <SimpleForm\n mutation={mutation}\n buttonText={buttonText}\n attributes={completeAttributes}\n />\n );\n}\n","import React from 'react';\nimport {\n Button,\n Stack,\n Typography,\n FormControl,\n FormLabel,\n Input,\n Modal,\n ModalDialog,\n} from '@mui/joy';\nimport { useForm } from 'react-hook-form';\nimport { useMutation } from '@tanstack/react-query';\nimport { SignUp201Response, SignUpRequest } from '@niledatabase/browser';\n\nimport { useApi, useNileConfig } from '../context';\n\nexport type UserFormProps = {\n open: boolean;\n setOpen: (open: boolean) => void;\n refetch?: (user: SignUp201Response) => void;\n};\n\nexport default function AddUser(props: UserFormProps) {\n const { open, setOpen, refetch } = props;\n const { tenantId } = useNileConfig();\n const api = useApi();\n const [errorText, setErrorText] = React.useState<void | string>();\n const { watch, register, handleSubmit } = useForm<SignUpRequest>();\n const email = watch('email');\n\n React.useEffect(() => {\n if (errorText != null) {\n setErrorText();\n }\n // if email changes, no more error\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [email]);\n\n const mutation = useMutation(\n (data: SignUpRequest) =>\n api.users.createTenantUser({\n signUpRequest: data,\n tenantId: String(tenantId),\n }),\n {\n onSuccess(data) {\n refetch && refetch(data);\n setOpen(false);\n },\n onError(e) {\n if (e instanceof Error) {\n setErrorText(e.message);\n }\n },\n }\n );\n\n const handleUpdate = React.useCallback(\n async (data: SignUpRequest) => {\n setErrorText('');\n mutation.mutate(data);\n },\n [mutation]\n );\n\n return (\n <Modal open={open}>\n <ModalDialog>\n <Stack spacing={2}>\n <Typography level=\"h4\">Create user</Typography>\n <>\n {errorText && <Typography color=\"danger\">{errorText}</Typography>}\n </>\n <Stack\n component=\"form\"\n sx={{\n width: '40ch',\n }}\n spacing={1}\n onSubmit={handleSubmit((data) =>\n handleUpdate(data as SignUpRequest)\n )}\n >\n <FormControl\n sx={{\n '--FormHelperText-color': 'var(--joy-palette-danger-500)',\n }}\n >\n <FormLabel htmlFor=\"email\">Email</FormLabel>\n <Input\n {...register('email')}\n fullWidth\n size=\"lg\"\n id=\"email\"\n name=\"email\"\n autoComplete=\"current-email\"\n required\n error={Boolean(errorText)}\n />\n </FormControl>\n <FormControl\n sx={{\n '--FormHelperText-color': 'var(--joy-palette-danger-500)',\n }}\n >\n <FormLabel htmlFor=\"password\">Password</FormLabel>\n <Input\n {...register('password')}\n fullWidth\n size=\"lg\"\n id=\"password\"\n autoComplete=\"current-password\"\n type=\"password\"\n required\n />\n </FormControl>\n <Stack direction=\"row\" sx={{ pt: 2 }} spacing={2}>\n <Button onClick={() => setOpen(false)} variant=\"plain\">\n Cancel\n </Button>\n <Button type=\"submit\">Create</Button>\n </Stack>\n </Stack>\n </Stack>\n </ModalDialog>\n </Modal>\n );\n}\n","import React from 'react';\nimport Button from '@mui/joy/Button';\nimport Stack from '@mui/joy/Stack';\nimport { useState } from 'react';\nimport Add from '@mui/icons-material/Add';\nimport { SignUp201Response } from '@niledatabase/browser';\n\nimport UserModal from './UserModal';\n\ntype Props = {\n allowCreation: boolean;\n buttonText: string;\n onUserCreateSuccess?: (user: SignUp201Response) => void;\n};\nexport default function CreateUser(props: Props) {\n const { allowCreation, buttonText, onUserCreateSuccess } = props;\n const [open, setOpen] = useState(false);\n if (!allowCreation) {\n return null;\n }\n\n return (\n <Stack alignItems=\"flex-end\" gap={1}>\n <UserModal open={open} setOpen={setOpen} refetch={onUserCreateSuccess} />\n <Button startDecorator={<Add />} size=\"sm\" onClick={() => setOpen(true)}>\n {buttonText}\n </Button>\n </Stack>\n );\n}\n","import { useMemo } from 'react';\nimport { GridColDef, GridRowsProp } from '@mui/x-data-grid';\nimport { User } from '@niledatabase/browser';\n\nimport getColumnSize from '../utils/getColumnSize';\nimport useTextSizer from '../hooks/useTextSizer';\n\nexport const internalRowId = '_nile_data_grid_identifier';\n\ntype Cleaned = { [key: string]: string | Set<string> };\n\nconst makeRenderable = (vals: User) => {\n return Object.keys(vals).reduce((cleaned: Cleaned, key) => {\n const val = (vals as Cleaned)[key];\n if (val instanceof Set) {\n cleaned[key] = Array.from(val).join(', ');\n } else if (Array.isArray(val)) {\n cleaned[key] = val.join(', ');\n } else {\n cleaned[key] = val;\n }\n return cleaned;\n }, {});\n};\n\nconst parseResults = (\n data: void | User[],\n ctx: CanvasRenderingContext2D | void,\n include: string[]\n): [GridColDef[], GridRowsProp] => {\n if (!data) {\n return [[], []];\n }\n const rows = data.map(makeRenderable);\n const fields = Object.keys(rows[0]);\n\n const existentCols: { [key: string]: number } = {};\n\n const mapCols = (col: string): GridColDef | void => {\n const width = getColumnSize(col, rows, ctx);\n const name = col.slice();\n if (include.includes(name)) {\n // add spaces to the end of column names so they are not duplicated in the UI\n if (existentCols[name] == null) {\n existentCols[name] = name.length;\n } else {\n existentCols[name] += 1;\n }\n return {\n field: name.padEnd(existentCols[name]),\n headerName: name.padEnd(existentCols[name]),\n width,\n };\n }\n };\n const cols = fields?.map(mapCols).filter(Boolean) ?? [];\n\n return [cols as GridColDef[], rows];\n};\n\nexport default function useDataParser(\n data: void | User[],\n include: string[]\n): [GridColDef[], GridRowsProp] {\n const ctx = useTextSizer();\n const [cols, rows] = useMemo(\n () => parseResults(data, ctx, include),\n [data, ctx, include]\n );\n return [cols, rows];\n}\n","import { GridRowsProp } from '@mui/x-data-grid';\nimport isNull from 'lodash/isNull';\nimport isUndefined from 'lodash/isUndefined';\n\nexport default function getColumnSize(\n column: unknown,\n rows: GridRowsProp,\n canvasContext: void | CanvasRenderingContext2D\n) {\n const dataWidthReducer = (\n longest: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nextRow: { [key: string]: any }\n ) => {\n let value = nextRow[String(column)];\n if (isNull(value) || isUndefined(value)) {\n value = '';\n }\n value = value?.toString();\n return longest.length > value.length ? longest : value;\n };\n\n let columnHeaderLen =\n canvasContext && column\n ? canvasContext.measureText(String(column)).width\n : 50;\n /* padding 12, icon-width 15 */\n columnHeaderLen += 15 + 12;\n\n let width = columnHeaderLen;\n width =\n 16 +\n Math.ceil(\n canvasContext\n ? canvasContext.measureText(rows.reduce(dataWidthReducer, '')).width\n : 50\n );\n if (width < columnHeaderLen) {\n width = columnHeaderLen;\n }\n /* Gracefull */\n width += 8;\n return width;\n}\n","import { useEffect, useState } from 'react';\n\nexport default function useTextSizer() {\n const [ctx, setCtx] = useState<CanvasRenderingContext2D>();\n useEffect(() => {\n const canvas = document.createElement('canvas');\n const canvasContext = canvas.getContext('2d');\n if (canvasContext) {\n canvasContext.font = '18px Roboto';\n setCtx(canvasContext);\n }\n }, []);\n return ctx;\n}\n","import { DataGrid } from '@mui/x-data-grid';\nimport React from 'react';\nimport Stack from '@mui/joy/Stack';\nimport { SxProps } from '@mui/system/styleFunctionSx/styleFunctionSx';\nimport { Theme } from '@mui/system/createTheme';\nimport { SignUp201Response, User } from '@niledatabase/browser';\n\nimport CreateUser from './CreateUser';\nimport useDataParser from './useDataParser';\n\ntype ColumnNames = string;\n\ntype Props = {\n data: void | User[];\n allowCreation?: boolean;\n buttonText?: string;\n onUserCreateSuccess?: (user: SignUp201Response) => void;\n slots?: {\n dataGrid?: SxProps<Theme>;\n };\n // white list of columns to show\n include?: ColumnNames[];\n};\n\nexport default function UserList(props: Props) {\n const {\n data,\n allowCreation = true,\n buttonText = 'Add a user',\n onUserCreateSuccess,\n slots,\n include = ['email', 'preferedName'],\n } = props;\n\n const dataGridSx = {\n width: '100%',\n height: '100%',\n ...(slots?.dataGrid ?? {}),\n };\n\n const [columns, rows] = useDataParser(data, include);\n return (\n <Stack flex={1}>\n <CreateUser\n allowCreation={allowCreation}\n buttonText={buttonText}\n onUserCreateSuccess={onUserCreateSuccess}\n />\n <DataGrid\n sx={dataGridSx}\n rows={rows}\n columns={columns}\n hideFooter={true}\n />\n </Stack>\n );\n}\n","import React from 'react';\nimport { useMutation } from '@tanstack/react-query';\nimport { UpdateProviderRequest, SSOProvider } from '@niledatabase/browser';\nimport Stack from '@mui/joy/Stack';\nimport Typography from '@mui/joy/Typography';\nimport Alert from '@mui/joy/Alert';\nimport CheckCircleOutlined from '@mui/icons-material/CheckCircleOutlined';\n\nimport SimpleForm from '../lib/SimpleForm';\nimport { useApi } from '../context';\nimport { Attribute, AttributeType } from '../lib/SimpleForm/types';\n\nimport { OktaProps } from './types';\n\ntype SSOFormRequest = Omit<UpdateProviderRequest, 'emailDomains'> & {\n emailDomains: string;\n};\nexport default function BaseSSOForm(\n props: Omit<OktaProps, 'callbackUrl' | 'providers'> & {\n providerName: string;\n configurationGuide?: JSX.Element;\n config?: SSOProvider;\n }\n) {\n const {\n config,\n providerName,\n onSuccess,\n onError,\n allowEdit = true,\n configurationGuide,\n } = props;\n\n const api = useApi();\n const [loading, setLoading] = React.useState(false);\n const [success, setSuccess] = React.useState(false);\n const [optimisticConfig, setConfig] = React.useState<SSOProvider | void>(\n config\n );\n const timer = React.useRef<NodeJS.Timeout>();\n const attributes = React.useMemo(() => {\n const attributes: Attribute[] = [\n {\n name: 'enabled',\n label: 'Allow Okta logins',\n type: AttributeType.Switch,\n defaultValue: optimisticConfig?.enabled === true,\n options: [\n {\n label: 'Enabled',\n },\n {\n label: 'Disabled',\n },\n ],\n disabled: !allowEdit,\n },\n {\n name: 'clientId',\n label: 'Client id',\n type: AttributeType.Text,\n defaultValue: optimisticConfig?.clientId ?? '',\n required: true,\n disabled: !allowEdit,\n },\n {\n name: 'configUrl',\n label: 'Config url',\n type: AttributeType.Text,\n defaultValue: optimisticConfig?.configUrl ?? '',\n helpText:\n 'The URL of the .well-known/openid-configuration for the identity provider',\n required: true,\n disabled: !allowEdit,\n },\n {\n name: 'emailDomains',\n label: 'Email domains',\n type: AttributeType.Text,\n defaultValue: optimisticConfig?.emailDomains?.join(', ') ?? '',\n required: true,\n helpText:\n 'A comma seperated list of email domains (yourDomain.com) to be used',\n disabled: !allowEdit,\n },\n ];\n if (!optimisticConfig?.clientId) {\n attributes.splice(2, 0, {\n name: 'clientSecret',\n label: 'Client secret',\n type: AttributeType.Password,\n defaultValue: '',\n required: true,\n disabled: !allowEdit,\n });\n }\n return attributes;\n }, [\n allowEdit,\n optimisticConfig?.clientId,\n optimisticConfig?.configUrl,\n optimisticConfig?.emailDomains,\n optimisticConfig?.enabled,\n ]);\n\n const handleTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n }\n\n timer.current = setTimeout(() => {\n setSuccess(false);\n }, 3000);\n };\n\n const mutation = useMutation(\n (ssoRequest: SSOFormRequest) => {\n setLoading(true);\n const payload = {\n providerName: providerName.toLowerCase(),\n updateProviderRequest: {\n ...ssoRequest,\n emailDomains: ssoRequest.emailDomains.split(','),\n },\n };\n if (optimisticConfig != null) {\n return api.auth.updateProvider(payload);\n } else {\n return api.auth.createProvider(payload);\n }\n },\n {\n onSuccess: (data, vars) => {\n setConfig(data);\n setSuccess(true);\n onSuccess && onSuccess(data, vars);\n },\n onError,\n onSettled: (data, error, vars) => {\n setLoading(false);\n handleTimer();\n if (!data) {\n if (!error || error?.message.includes('Unterminated string')) {\n // something unexpected happened on the BE, but it's non-fatal\n setConfig({\n enabled: vars.enabled,\n clientId: vars.clientId,\n configUrl: vars.configUrl,\n emailDomains: vars.emailDomains.split(', '),\n } as SSOProvider);\n }\n setSuccess(true);\n onSuccess && onSuccess(data, vars);\n }\n },\n }\n );\n\n React.useEffect(() => {\n () => {\n clearTimeout(timer.current);\n };\n });\n\n return (\n <Stack gap={2} position=\"relative\">\n <Typography level=\"h4\">Step 1</Typography>\n {configurationGuide}\n <Typography level=\"h4\">Step 2</Typography>\n <SimpleForm\n mutation={mutation}\n buttonText=\"Update\"\n attributes={attributes}\n loading={loading}\n successMessage={\n <Alert\n color=\"success\"\n sx={{\n opacity: success ? 1 : 0,\n transition: 'opacity 200ms',\n height: '0.9rem',\n }}\n startDecorator={<CheckCircleOutlined />}\n >\n <Typography textAlign=\"center\" fontSize=\"sm\">\n Provider updated\n </Typography>\n </Alert>\n }\n />\n </Stack>\n );\n}\n","import React from 'react';\nimport Stack from '@mui/joy/Stack';\nimport Typography from '@mui/joy/Typography';\nimport Box from '@mui/joy/Box';\nimport Input from '@mui/joy/Input';\nimport CopyAll from '@mui/icons-material/CopyAll';\nimport { Theme } from '@mui/joy/styles';\nimport Tooltip from '@mui/joy/Tooltip';\nimport CheckCircleOutlined from '@mui/icons-material/CheckCircleOutlined';\nimport { SSOProvider } from '@niledatabase/browser';\n\nimport BaseSSOForm from './BaseSSOForm';\nimport { OktaProps } from './types';\n\nfunction ConfigGuide({ callbackUrl }: { callbackUrl?: string }) {\n const [copied, setCopied] = React.useState(false);\n\n const timer = React.useRef<NodeJS.Timeout>();\n React.useEffect(() => {\n if (timer.current) {\n clearTimeout(timer.current);\n }\n timer.current = setTimeout(() => {\n setCopied(false);\n }, 3250);\n () => {\n clearTimeout(timer.current);\n };\n }, [copied]);\n return (\n <Stack gap={2}>\n <Typography>\n In order for Okta to redirect properly, provide the following URL as the{' '}\n <Box component=\"span\" sx={{ fontFamily: 'monospace' }}>\n Sign-in redirect URIs\n </Box>{' '}\n in the admin configuration of your application.\n </Typography>\n <Input\n onClick={async () => {\n if (callbackUrl) {\n await navigator.clipboard.writeText(callbackUrl);\n setCopied(true);\n }\n }}\n sx={(theme: Theme) => ({\n input: {\n cursor: 'pointer',\n },\n span: {\n cursor: 'pointer',\n },\n '&:hover svg': {\n '--Icon-color': theme.palette.primary[500],\n },\n })}\n value={callbackUrl}\n readOnly={true}\n endDecorator={\n <Tooltip title=\"Copy Okta redirect URL\">\n <Box\n position=\"relative\"\n width={copied ? '82px' : '24px'}\n height=\"24px\"\n >\n <Box\n position=\"absolute\"\n top=\"0\"\n left=\"0\"\n sx={{\n opacity: copied ? 0 : 1,\n transition: 'opacity 300ms',\n }}\n >\n <CopyAll />\n </Box>\n <Box\n position=\"absolute\"\n top=\"0\"\n left=\"0\"\n sx={{ opacity: !copied ? 0 : 1, transition: 'opacity 300ms' }}\n >\n <Stack direction=\"row\" gap={1}>\n <CheckCircleOutlined />\n <Typography color=\"primary\">Copied!</Typography>\n </Stack>\n </Box>\n </Box>\n </Tooltip>\n }\n />\n </Stack>\n );\n}\n\nexport default function Okta(props: OktaProps) {\n const { callbackUrl, providers, ...remaining } = props;\n if (!providers) {\n return null;\n }\n const config = providers?.find((provider) => provider.provider === 'okta');\n return (\n <BaseSSOForm\n {...remaining}\n config={config as SSOProvider}\n providerName=\"Okta\"\n configurationGuide={<ConfigGuide callbackUrl={callbackUrl} />}\n />\n );\n}\n"],"names":["palette","primary","solidColor","softColor","solidDisabledBg","solidDisabledColor","plainHoverBg","outlinedHoverBg","neutral","softBg","purple","blue","divider","text","tertiary","background","surface","body","default","tableCell","border","unstable_sxConfig","muiSxConfig","muiTheme","extendMuiTheme","cssVarPrefix","colorSchemes","dark","main","joySxConfig","joyTheme","extendJoyTheme","components","JoyInput","styleOverrides","input","color","opacity","light","mergedTheme","deepmerge","typography","Themer","theme","children","React","createElement","JoyCssVarsProvider","defaultTheme","defaultMode","CssBaseline","enableColorScheme","generateCssVars","colorScheme","css","vars","queryClient","QueryClient","context","createContext","api","Browser","basePath","credentials","Provider","BaseQueryProvider","QueryClientProvider","client","NileProvider","props","tenantId","QueryProvider","values","useMemo","String","ThemeProvider","value","useNileContext","useContext","useNileConfig","useApi","_g","_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","SvgGoogle","xmlns","width","height","fillRule","fill","d","GoogleSSOButton","databaseId","newTenantName","contextHref","encodeURIComponent","query","href","Box","component","display","flex","sx","textDecoration","Button","padding","textTransform","Stack","direction","alignItems","p","fontFamily","fontSize","boxShadow","borderRadius","fontWeight","backgroundColor","GoogleLogo","Typography","CheckGroup","options","attribute","helperText","watch","control","useFormContext","currentVals","name","checkProps","Controller","rules","required","Boolean","render","field","FormLabel","htmlFor","label","role","List","orientation","wrap","map","item","id","ListItem","Checkbox","overlay","checked","includes","disableIcon","variant","onChange","event","allowMultiple","concat","remaining","filter","val","level","AttributeType","getAttributeDefault","Array","isArray","defaultValue","Labler","error","attr","Tooltip","title","cursor","Error","ml","SimpleForm","mutation","buttonText","attributes","cancelButton","loading","successMessage","defaultValues","reduce","accum","methods","useForm","register","handleSubmit","formState","errors","onSubmit","useCallback","data","mutate","FormProvider","spacing","fieldConfig","placeholder","disabled","helpText","type","Switch","FormControl","FormHelperText","endDecorator","Select","_","newValue","option","Option","Password","Input","Number","Text","gap","SignUpForm","setError","useState","onSuccess","onError","beforeMutate","useMutation","async","_data","undefined","email","password","preferredName","newTenant","metadata","keys","console","warn","auth","signUp","signUpRequest","e","message","completeAttributes","mainAttributes","Alert","UserForm","LoginForm","login","loginRequest","SingleSignOnForm","nextButtonText","loginButtonText","disableSSO","setButtonText","sso","token","redirectURI","window","location","push","AddUser","open","setOpen","refetch","errorText","setErrorText","useEffect","users","createTenantUser","handleUpdate","Modal","ModalDialog","Fragment","fullWidth","size","autoComplete","pt","onClick","CreateUser","allowCreation","onUserCreateSuccess","UserModal","startDecorator","Add","makeRenderable","vals","cleaned","Set","from","join","parseResults","ctx","include","rows","fields","existentCols","cols","col","column","canvasContext","columnHeaderLen","measureText","Math","ceil","longest","nextRow","isNull","isUndefined","toString","getColumnSize","slice","padEnd","headerName","useDataParser","setCtx","document","getContext","font","useTextSizer","UserList","slots","dataGridSx","dataGrid","columns","DataGrid","hideFooter","BaseSSOForm","config","providerName","allowEdit","configurationGuide","setLoading","success","setSuccess","optimisticConfig","setConfig","timer","useRef","enabled","clientId","configUrl","emailDomains","splice","ssoRequest","payload","toLowerCase","updateProviderRequest","split","updateProvider","createProvider","onSettled","current","clearTimeout","setTimeout","position","transition","CheckCircleOutlined","textAlign","ConfigGuide","callbackUrl","copied","setCopied","navigator","clipboard","writeText","span","readOnly","top","left","CopyAll","Okta","providers","find","provider"],"mappings":"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"}
1
+ {"version":3,"file":"react.esm.js","sources":["../src/context/theme.tsx","../src/context/index.tsx","../src/GoogleLoginButton/google.svg","../src/GoogleLoginButton/GoogleLoginButton.tsx","../src/lib/SimpleForm/CheckGroup/index.tsx","../src/lib/SimpleForm/types.ts","../src/lib/SimpleForm/index.tsx","../src/SignUpForm/SignUpForm.tsx","../src/LoginForm/LoginForm.tsx","../src/LoginForm/SingleSignOn.tsx","../src/UserTenantList/UserModal.tsx","../src/UserTenantList/CreateUser.tsx","../src/UserTenantList/useDataParser.ts","../src/utils/getColumnSize.ts","../src/hooks/useTextSizer.ts","../src/UserTenantList/UserList.tsx","../src/SSO/BaseSSOForm.tsx","../src/SSO/Okta.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nimport React from 'react';\nimport CssBaseline from '@mui/material/CssBaseline';\nimport { Theme } from '@mui/joy/styles';\nimport { CssVarsProvider as JoyCssVarsProvider } from '@mui/joy/styles';\n\nexport default function Themer({\n theme,\n children,\n slotProps,\n}: {\n theme?: Theme;\n children: JSX.Element;\n slotProps?: Record<string, string>;\n}) {\n return (\n <JoyCssVarsProvider {...slotProps} theme={theme}>\n <CssBaseline enableColorScheme />\n {children}\n </JoyCssVarsProvider>\n );\n}\n","// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nimport React, { useMemo, createContext, useContext } from 'react';\nimport Browser from '@niledatabase/browser';\nimport { QueryClientProvider, QueryClient } from '@tanstack/react-query';\n\nimport ThemeProvider from './theme';\nimport { NileContext, NileProviderProps, NileReactConfig } from './types';\n\nconst queryClient = new QueryClient();\n\nconst defaultContext: NileContext = {\n api: new Browser({\n basePath: 'https://api.thenile.dev',\n credentials: 'include',\n }),\n basePath: '',\n};\n\nconst context = createContext<NileContext>(defaultContext);\n\nconst { Provider } = context;\n\nexport const BaseQueryProvider = ({\n children,\n}: {\n children: JSX.Element;\n}): JSX.Element => {\n return (\n <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>\n );\n};\n\nexport const NileProvider = (props: NileProviderProps) => {\n const {\n children,\n theme,\n slotProps,\n tenantId,\n QueryProvider = BaseQueryProvider,\n basePath = 'https://api.thenile.dev',\n api,\n } = props;\n\n const values = useMemo<NileContext>((): NileContext => {\n return {\n api:\n api ??\n new Browser({\n basePath,\n credentials: 'include',\n }),\n tenantId: String(tenantId),\n basePath,\n };\n }, [api, basePath, tenantId]);\n\n return (\n <QueryProvider>\n <ThemeProvider slotProps={slotProps?.provider} theme={theme}>\n <Provider value={values}>{children}</Provider>\n </ThemeProvider>\n </QueryProvider>\n );\n};\n\nconst useNileContext = (): NileContext => {\n return useContext(context);\n};\n\nexport const useNileConfig = (): NileReactConfig => {\n const { basePath, tenantId } = useNileContext();\n return useMemo(\n () => ({\n tenantId,\n basePath,\n }),\n [basePath, tenantId]\n );\n};\n\nexport const useApi = (): Browser => {\n return useNileContext().api;\n};\n","<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\">\n <g fill=\"#000\" fill-rule=\"evenodd\">\n <path d=\"M9 3.48c1.69 0 2.83.73 3.48 1.34l2.54-2.48C13.46.89 11.43 0 9 0 5.48 0 2.44 2.02.96 4.96l2.91 2.26C4.6 5.05 6.62 3.48 9 3.48z\" fill=\"#EA4335\" />\n <path d=\"M17.64 9.2c0-.74-.06-1.28-.19-1.84H9v3.34h4.96c-.1.83-.64 2.08-1.84 2.92l2.84 2.2c1.7-1.57 2.68-3.88 2.68-6.62z\" fill=\"#4285F4\" />\n <path d=\"M3.88 10.78A5.54 5.54 0 0 1 3.58 9c0-.62.11-1.22.29-1.78L.96 4.96A9.008 9.008 0 0 0 0 9c0 1.45.35 2.82.96 4.04l2.92-2.26z\" fill=\"#FBBC05\" />\n <path d=\"M9 18c2.43 0 4.47-.8 5.96-2.18l-2.84-2.2c-.76.53-1.78.9-3.12.9-2.38 0-4.4-1.57-5.12-3.74L.97 13.04C2.45 15.98 5.48 18 9 18z\" fill=\"#34A853\" />\n <path fill=\"none\" d=\"M0 0h18v18H0z\" />\n </g>\n</svg>","import React from 'react';\nimport Box from '@mui/joy/Box';\nimport Button from '@mui/joy/Button';\nimport Stack from '@mui/joy/Stack';\nimport Typography from '@mui/joy/Typography';\n\nimport { useNileConfig } from '../context';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport GoogleLogo from './google.svg';\n\nconst LOGIN_PATH = 'users/oidc/google/login';\n\n/**\n * A component for a Google login button, according to their design language.\n * This works when an identity provider is configured in the admin dashboard.\n * @param props href: a string to override the URL provided by the context\n * @returns a JSX.Element to render\n */\nexport default function GoogleSSOButton(props: {\n href?: string;\n databaseId?: string;\n newTenantName?: string;\n}) {\n const { databaseId, newTenantName } = props;\n const { basePath } = useNileConfig();\n const encodedDatabase = encodeURIComponent(databaseId ?? '');\n const contextHref = `${basePath}/databases/${encodedDatabase}/${LOGIN_PATH}`;\n const query = newTenantName\n ? '?newTenant=' + encodeURIComponent(newTenantName)\n : '';\n const href = (props?.href ?? contextHref) + query;\n return (\n <Box\n component=\"a\"\n href={href}\n display=\"flex\"\n flex={1}\n sx={{ textDecoration: 'none' }}\n >\n <Box>\n <Button\n sx={{ padding: 0, textTransform: 'initial', flex: 1 }}\n aria-label=\"log in with google\"\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n p={0}\n flex={1}\n fontFamily=\"Roboto, sans-serif\"\n fontSize=\"14px\"\n display=\"inline-flex\"\n color=\"rgb(255 255, 255)\"\n boxShadow=\"rgb(0 0 0 / 24%) 0px 2px 2px 0px rgb(0 0 0 / 24%) 0px 0px 1px 0px\"\n borderRadius=\"4px\"\n border=\"1px solid transparent\"\n fontWeight=\"500\"\n sx={{\n backgroundColor: 'rgb(66 133, 244)',\n }}\n >\n <Box\n padding=\"11px\"\n display=\"flex\"\n border=\"1px solid rgb(66, 133, 244)\"\n borderRadius=\"4px\"\n sx={{\n background: 'rgb(255, 255, 255)',\n }}\n >\n <GoogleLogo aria-hidden=\"true\" />\n </Box>\n <Box padding=\"10px\" flex={1}>\n <Typography\n sx={{ color: 'white' }}\n fontWeight={700}\n fontFamily=\"Roboto, sans-serif\"\n fontSize=\"14px\"\n height=\"20px\"\n >\n Continue with Google\n </Typography>\n </Box>\n </Stack>\n </Button>\n </Box>\n </Box>\n );\n}\n","import * as React from 'react';\nimport Box from '@mui/joy/Box';\nimport Checkbox from '@mui/joy/Checkbox';\nimport List from '@mui/joy/List';\nimport { Controller, useFormContext } from 'react-hook-form';\nimport Stack from '@mui/joy/Stack';\nimport FormLabel from '@mui/joy/FormLabel';\nimport ListItem from '@mui/joy/ListItem';\nimport Typography from '@mui/joy/Typography';\n\nimport { Attribute, DisplayProps, Options } from '../types';\n\ntype Props = {\n attribute: Attribute;\n display: DisplayProps;\n options: Options;\n helperText: string;\n};\nexport default function CheckGroup(props: Props) {\n const { options, attribute, display, helperText } = props;\n const { watch, control } = useFormContext();\n const currentVals = watch(attribute.name);\n const checkProps: { color?: 'danger'; id?: string } = {};\n if (helperText) {\n checkProps.color = 'danger';\n }\n return (\n <Controller\n name={attribute.name}\n rules={{ required: Boolean(attribute.required) }}\n control={control}\n render={({ field }) => {\n return (\n <Stack>\n <FormLabel htmlFor={`${field.name}`}>{display.label}</FormLabel>\n <Box\n role=\"group\"\n aria-labelledby={attribute.name}\n sx={{\n borderRadius: 'var(--joy-radius-sm)',\n p: 0.5,\n border: helperText\n ? '1px solid var(--joy-palette-danger-outlinedBorder)'\n : 'none',\n }}\n >\n <List\n orientation=\"horizontal\"\n wrap\n sx={{\n '--List-gap': '8px',\n }}\n >\n {options.map((item) => {\n checkProps.id = String(item.value);\n return (\n <ListItem key={`${item.value}-${item.label}`}>\n <Checkbox\n overlay={options.length > 1}\n {...checkProps}\n checked={currentVals.includes(item.value)}\n disableIcon={options.length > 1}\n variant=\"soft\"\n label={item.label}\n onChange={(event) => {\n if (attribute.allowMultiple) {\n if (event.target.checked) {\n if (!currentVals) {\n field.onChange([item.value]);\n } else {\n field.onChange(currentVals.concat(item.value));\n }\n } else {\n const remaining = currentVals.filter(\n (val: string | number) => val !== item.value\n );\n if (remaining.length > 0) {\n field.onChange(remaining);\n } else {\n field.onChange('');\n }\n }\n } else {\n if (event.target.checked) {\n field.onChange(item.value);\n } else {\n field.onChange('');\n }\n }\n }}\n />\n </ListItem>\n );\n })}\n </List>\n </Box>\n <Typography\n sx={{ color: 'var(--joy-palette-danger-500)' }}\n level=\"body-sm\"\n >\n {helperText}\n </Typography>\n </Stack>\n );\n }}\n />\n );\n}\n","export enum AttributeType {\n Text = 'text',\n Password = 'password',\n Select = 'select',\n Number = 'number',\n Float = 'float',\n Checkbox = 'checkbox',\n Switch = 'switch',\n}\ntype SimplePrimitive = number | string | boolean;\n\n// possibly no value for `<Switch/>`\nexport type Options = { label: string; value?: SimplePrimitive }[];\nexport type Attribute = {\n name: string;\n type?: AttributeType;\n defaultValue?: SimplePrimitive;\n options?: Options;\n allowMultiple?: boolean;\n label?: string;\n required?: boolean;\n placeholder?: string;\n helpText?: string;\n disabled?: boolean;\n};\n\nexport type DisplayProps = {\n key: string;\n id: string;\n label: string;\n placeholder: string;\n error?: boolean;\n color?: 'danger';\n disabled?: boolean;\n};\n","import React from 'react';\nimport Button from '@mui/joy/Button';\nimport { Controller, FormProvider, useForm } from 'react-hook-form';\nimport Stack from '@mui/joy/Stack';\nimport Input from '@mui/joy/Input';\nimport FormControl from '@mui/joy/FormControl';\nimport FormHelperText from '@mui/joy/FormHelperText';\nimport Error from '@mui/icons-material/Error';\nimport FormLabel from '@mui/joy/FormLabel';\nimport Select from '@mui/joy/Select';\nimport Option from '@mui/joy/Option';\nimport Box from '@mui/joy/Box';\nimport Tooltip from '@mui/joy/Tooltip';\nimport { Switch } from '@mui/joy';\n\nimport CheckGroup from './CheckGroup';\nimport { Attribute, AttributeType, DisplayProps } from './types';\n\ntype AttrMap = {\n [key: string]: string | number | boolean | string[] | number[];\n};\n\ntype FieldConfig = {\n required?: boolean;\n};\n\nexport const getAttributeDefault = (\n attribute: Attribute\n): string | number | boolean | string[] | number[] => {\n // have to look to see if it is an enum\n if (attribute.allowMultiple === true) {\n if (!Array.isArray(attribute.defaultValue) && attribute.defaultValue) {\n if (typeof attribute.defaultValue === 'number') {\n return [attribute.defaultValue];\n }\n return [String(attribute.defaultValue)];\n }\n }\n return attribute.defaultValue ?? '';\n};\n\nfunction Labler(props: { error?: string; attr: Attribute }) {\n const { error, attr } = props;\n if (error) {\n return (\n <Tooltip title={error} color=\"danger\" sx={{ cursor: 'pointer' }}>\n <FormLabel>\n {attr.label ?? attr.name}\n <Error sx={{ ml: 0.5, '--Icon-color': '#c41c1c' }} fontSize=\"small\" />\n </FormLabel>\n </Tooltip>\n );\n }\n return <FormLabel>{attr.label ?? attr.name}</FormLabel>;\n}\nexport default function SimpleForm(props: {\n buttonText: string;\n cancelButton?: React.ReactNode;\n attributes: Attribute[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mutation: any;\n loading?: boolean;\n successMessage?: JSX.Element;\n}) {\n const {\n mutation,\n buttonText,\n attributes,\n cancelButton,\n loading,\n successMessage,\n } = props;\n\n const defaultValues = React.useMemo(\n () =>\n attributes.reduce((accum: AttrMap, attr: Attribute) => {\n accum[attr.name] = getAttributeDefault(attr);\n return accum;\n }, {}),\n [attributes]\n );\n\n const methods = useForm({\n defaultValues,\n });\n\n const {\n register,\n control,\n handleSubmit,\n formState: { errors },\n } = methods;\n const onSubmit = React.useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (data: any) => {\n mutation.mutate(data);\n },\n [mutation]\n );\n\n return (\n <FormProvider {...methods}>\n <Stack\n component=\"form\"\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSubmit={handleSubmit((data) => onSubmit(data as any))}\n spacing={2}\n >\n {attributes.map((attr: Attribute): React.ReactNode => {\n const fieldConfig: FieldConfig = {};\n const display: DisplayProps = {\n key: attr.name,\n label: attr.label ?? attr.name,\n id: attr.label ?? attr.name,\n placeholder: attr.placeholder ?? attr.label ?? attr.name,\n error: Boolean(errors[attr.name]),\n disabled: Boolean(attr.disabled),\n };\n const options = attr.options ?? [];\n const helperText = attr.helpText ?? '';\n let error = '';\n\n if (attr.required) {\n error = errors[attr.name]\n ? `${attr.label ?? attr.name} is required`\n : '';\n fieldConfig.required = true;\n }\n\n switch (attr.type) {\n case AttributeType.Switch:\n return (\n <FormControl\n key={display.key}\n id={display.id}\n orientation=\"horizontal\"\n sx={{ alignItems: 'center' }}\n >\n <Box>\n <Labler error={error} attr={attr} />\n <FormHelperText id={`${attr.name}-helper-text`}>\n {helperText}\n </FormHelperText>\n </Box>\n <Controller\n control={control}\n rules={{ required: Boolean(attr.required) }}\n name={attr.name}\n render={({ field }) => {\n const color: { color?: 'danger' } = {};\n if (errors[attr.name]) {\n color.color = 'danger';\n }\n return (\n <Switch\n id={`switch-field-${attr.name}`}\n {...color}\n {...field}\n checked={Boolean(field.value)}\n onChange={(event) => {\n field.onChange(event.target.checked);\n }}\n color={field.value ? 'success' : 'neutral'}\n endDecorator={\n field.value ? options[0].label : options[1].label\n }\n />\n );\n }}\n />\n </FormControl>\n );\n case AttributeType.Checkbox:\n return (\n <CheckGroup\n key={display.key}\n attribute={attr}\n display={display}\n options={options}\n helperText={helperText}\n />\n );\n case AttributeType.Select:\n return (\n <FormControl key={display.key} id={display.id}>\n <Labler error={error} attr={attr} />\n <Controller\n control={control}\n rules={{ required: Boolean(attr.required) }}\n name={attr.name}\n render={({ field }) => {\n const color: { color?: 'danger' } = {};\n if (errors[attr.name]) {\n color.color = 'danger';\n }\n const value = String(field.value);\n return (\n <Stack>\n <Select\n id={`select-field-${attr.name}`}\n placeholder={`${display.placeholder}...`}\n {...color}\n {...field}\n value={value}\n onChange={(_, newValue) => {\n field.onChange(newValue);\n }}\n >\n {options.map((option) => {\n return (\n <Option\n key={String(option.value ?? '')}\n value={option.value}\n >\n {option.label}\n </Option>\n );\n })}\n </Select>\n <FormHelperText id={`${attr.name}-helper-text`}>\n {helperText}\n </FormHelperText>\n </Stack>\n );\n }}\n />\n </FormControl>\n );\n case AttributeType.Password:\n return (\n <FormControl key={display.key} id={display.id}>\n <Labler error={error} attr={attr} />\n <Input\n {...display}\n {...register(attr.name, fieldConfig)}\n type={AttributeType.Password}\n />\n <FormHelperText id={`${attr.name}-helper-text`}>\n {helperText}\n </FormHelperText>\n </FormControl>\n );\n case AttributeType.Number:\n return (\n <FormControl key={display.key} id={display.id}>\n <Labler error={error} attr={attr} />\n <Input\n {...display}\n {...register(attr.name, fieldConfig)}\n type={AttributeType.Number}\n />\n <FormHelperText id={`${attr.name}-helper-text`}>\n {helperText}\n </FormHelperText>\n </FormControl>\n );\n\n case AttributeType.Text:\n default:\n return (\n <FormControl key={display.key} id={display.id}>\n <Labler error={error} attr={attr} />\n <Input {...display} {...register(attr.name, fieldConfig)} />\n <FormHelperText id={`${attr.name}-helper-text`}>\n {helperText}\n </FormHelperText>\n </FormControl>\n );\n }\n })}\n {cancelButton ? (\n <Stack spacing={2} direction=\"row\">\n {cancelButton}\n <Box>\n <Button type=\"submit\">{buttonText}</Button>\n </Box>\n </Stack>\n ) : (\n <Box>\n <Stack direction=\"row\" gap={2}>\n <Button type=\"submit\" loading={loading}>\n {buttonText}\n </Button>\n {successMessage}\n </Stack>\n </Box>\n )}\n </Stack>\n </FormProvider>\n );\n}\n","import React from 'react';\nimport { useMutation } from '@tanstack/react-query';\nimport Stack from '@mui/joy/Stack';\nimport Alert from '@mui/joy/Alert';\n\nimport UserForm from '../lib/SimpleForm';\nimport { Attribute, AttributeType } from '../lib/SimpleForm/types';\nimport { useApi } from '../context';\n\nimport { Props, LoginInfo } from './types';\n\nexport default function SignUpForm(props: Props) {\n const [error, setError] = React.useState<string | void>();\n const {\n buttonText = 'Sign up',\n onSuccess,\n onError,\n attributes,\n beforeMutate,\n } = props;\n const api = useApi();\n const mutation = useMutation(\n async (_data: LoginInfo) => {\n setError(undefined);\n const possibleData = beforeMutate && beforeMutate(_data);\n const data = possibleData ?? _data;\n const { email, password, preferredName, newTenant, ...metadata } = data;\n if (Object.keys(metadata).length > 0) {\n // eslint-disable-next-line no-console\n console.warn('additional metadata not supported yet.');\n }\n return api.auth.signUp({\n signUpRequest: { email, password, preferredName, newTenant },\n });\n },\n {\n onSuccess,\n onError: (e: Error, vars) => {\n setError(e.message);\n onError && onError(e as Error, vars);\n },\n }\n );\n\n const completeAttributes = React.useMemo(() => {\n const mainAttributes: Attribute[] = [\n {\n name: 'email',\n label: 'Email',\n type: AttributeType.Text,\n defaultValue: '',\n required: true,\n },\n {\n name: 'password',\n label: 'Password',\n type: AttributeType.Password,\n defaultValue: '',\n required: true,\n },\n ];\n if (attributes && attributes.length > 0) {\n return mainAttributes.concat(attributes);\n }\n return mainAttributes;\n }, [attributes]);\n\n return (\n <Stack gap={2}>\n {error ? <Alert color=\"danger\">{error}</Alert> : null}\n <UserForm\n mutation={mutation}\n buttonText={buttonText}\n attributes={completeAttributes}\n />\n </Stack>\n );\n}\n","import React from 'react';\nimport { useMutation } from '@tanstack/react-query';\nimport Alert from '@mui/joy/Alert';\nimport Stack from '@mui/joy/Stack';\n\nimport { Attribute } from '../lib/SimpleForm/types';\nimport { useApi } from '../context';\nimport SimpleForm from '../lib/SimpleForm';\nimport { AttributeType } from '../lib/SimpleForm/types';\n\nimport { Props, LoginInfo } from './types';\n\nexport default function LoginForm(props: Props) {\n const [error, setError] = React.useState<string | void>();\n const { attributes, onSuccess, onError, beforeMutate } = props;\n const api = useApi();\n\n const mutation = useMutation(\n async (_data: LoginInfo) => {\n setError(undefined);\n const possibleData = beforeMutate && beforeMutate(_data);\n const data = possibleData ?? _data;\n return await api.auth.login({\n loginRequest: data,\n });\n },\n {\n onSuccess,\n onError,\n }\n );\n\n const completeAttributes = React.useMemo(() => {\n const mainAttributes: Attribute[] = [\n {\n name: 'email',\n label: 'Email',\n type: AttributeType.Text,\n defaultValue: '',\n required: true,\n },\n {\n name: 'password',\n label: 'Password',\n type: AttributeType.Password,\n defaultValue: '',\n required: true,\n },\n ];\n if (attributes && attributes.length > 0) {\n return mainAttributes.concat(attributes);\n }\n return mainAttributes;\n }, [attributes]);\n\n return (\n <Stack gap={2}>\n {error ? <Alert color=\"danger\">{error}</Alert> : null}\n <SimpleForm\n mutation={mutation}\n buttonText=\"Log in\"\n attributes={completeAttributes}\n />\n </Stack>\n );\n}\n","import React from 'react';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { Attribute } from '../lib/SimpleForm/types';\nimport { useApi } from '../context';\nimport SimpleForm from '../lib/SimpleForm';\nimport { AttributeType } from '../lib/SimpleForm/types';\n\nimport { Props, LoginInfo } from './types';\n\nexport default function SingleSignOnForm(\n props: Props & {\n nextButtonText?: string;\n loginButtonText?: string;\n onSuccess: () => void;\n }\n) {\n const {\n attributes,\n onSuccess,\n onError,\n beforeMutate,\n nextButtonText = 'Next',\n loginButtonText = 'Log in',\n disableSSO = false,\n } = props;\n const api = useApi();\n const [buttonText, setButtonText] = React.useState(\n disableSSO ? loginButtonText : nextButtonText\n );\n\n const mutation = useMutation(\n async (_data: LoginInfo) => {\n const possibleData = beforeMutate && beforeMutate(_data);\n const data = possibleData ?? _data;\n return await api.auth.login({\n loginRequest: { email: data.email, password: data.password },\n sso: !disableSSO,\n });\n },\n {\n onSuccess: (token, data) => {\n if (token) {\n if (token?.redirectURI) {\n window.location.href = token.redirectURI;\n } else if (buttonText !== loginButtonText) {\n setButtonText(loginButtonText);\n } else {\n onSuccess && onSuccess(token, data);\n }\n }\n },\n onError: (error, data) => {\n // it is possible SSO failed, so only show errors on if the password is available\n if (buttonText === loginButtonText) {\n onError && onError(error as Error, data);\n } else {\n setButtonText(loginButtonText);\n }\n },\n }\n );\n\n const completeAttributes = React.useMemo(() => {\n const mainAttributes: Attribute[] = [\n {\n name: 'email',\n label: 'Email',\n type: AttributeType.Text,\n defaultValue: '',\n required: true,\n },\n ];\n if (buttonText === loginButtonText) {\n mainAttributes.push({\n name: 'password',\n label: 'Password',\n type: AttributeType.Password,\n defaultValue: '',\n required: true,\n });\n }\n if (attributes && attributes.length > 0) {\n return mainAttributes.concat(attributes);\n }\n return mainAttributes;\n }, [attributes, buttonText, loginButtonText]);\n\n return (\n <SimpleForm\n mutation={mutation}\n buttonText={buttonText}\n attributes={completeAttributes}\n />\n );\n}\n","import React from 'react';\nimport {\n Button,\n Stack,\n Typography,\n FormControl,\n FormLabel,\n Input,\n Modal,\n ModalDialog,\n} from '@mui/joy';\nimport { useForm } from 'react-hook-form';\nimport { useMutation } from '@tanstack/react-query';\nimport { SignUp201Response, SignUpRequest } from '@niledatabase/browser';\n\nimport { useApi, useNileConfig } from '../context';\n\nexport type UserFormProps = {\n open: boolean;\n setOpen: (open: boolean) => void;\n refetch?: (user: SignUp201Response) => void;\n};\n\nexport default function AddUser(props: UserFormProps) {\n const { open, setOpen, refetch } = props;\n const { tenantId } = useNileConfig();\n const api = useApi();\n const [errorText, setErrorText] = React.useState<void | string>();\n const { watch, register, handleSubmit } = useForm<SignUpRequest>();\n const email = watch('email');\n\n React.useEffect(() => {\n if (errorText != null) {\n setErrorText();\n }\n // if email changes, no more error\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [email]);\n\n const mutation = useMutation(\n (data: SignUpRequest) =>\n api.users.createTenantUser({\n signUpRequest: data,\n tenantId: String(tenantId),\n }),\n {\n onSuccess(data) {\n refetch && refetch(data);\n setOpen(false);\n },\n onError(e) {\n if (e instanceof Error) {\n setErrorText(e.message);\n }\n },\n }\n );\n\n const handleUpdate = React.useCallback(\n async (data: SignUpRequest) => {\n setErrorText('');\n mutation.mutate(data);\n },\n [mutation]\n );\n\n return (\n <Modal open={open}>\n <ModalDialog>\n <Stack spacing={2}>\n <Typography level=\"h4\">Create user</Typography>\n <>\n {errorText && <Typography color=\"danger\">{errorText}</Typography>}\n </>\n <Stack\n component=\"form\"\n sx={{\n width: '40ch',\n }}\n spacing={1}\n onSubmit={handleSubmit((data) =>\n handleUpdate(data as SignUpRequest)\n )}\n >\n <FormControl\n sx={{\n '--FormHelperText-color': 'var(--joy-palette-danger-500)',\n }}\n >\n <FormLabel htmlFor=\"email\">Email</FormLabel>\n <Input\n {...register('email')}\n fullWidth\n size=\"lg\"\n id=\"email\"\n name=\"email\"\n autoComplete=\"current-email\"\n required\n error={Boolean(errorText)}\n />\n </FormControl>\n <FormControl\n sx={{\n '--FormHelperText-color': 'var(--joy-palette-danger-500)',\n }}\n >\n <FormLabel htmlFor=\"password\">Password</FormLabel>\n <Input\n {...register('password')}\n fullWidth\n size=\"lg\"\n id=\"password\"\n autoComplete=\"current-password\"\n type=\"password\"\n required\n />\n </FormControl>\n <Stack direction=\"row\" sx={{ pt: 2 }} spacing={2}>\n <Button onClick={() => setOpen(false)} variant=\"plain\">\n Cancel\n </Button>\n <Button type=\"submit\">Create</Button>\n </Stack>\n </Stack>\n </Stack>\n </ModalDialog>\n </Modal>\n );\n}\n","import React from 'react';\nimport Button from '@mui/joy/Button';\nimport Stack from '@mui/joy/Stack';\nimport { useState } from 'react';\nimport Add from '@mui/icons-material/Add';\nimport { SignUp201Response } from '@niledatabase/browser';\n\nimport UserModal from './UserModal';\n\ntype Props = {\n allowCreation: boolean;\n buttonText: string;\n onUserCreateSuccess?: (user: SignUp201Response) => void;\n};\nexport default function CreateUser(props: Props) {\n const { allowCreation, buttonText, onUserCreateSuccess } = props;\n const [open, setOpen] = useState(false);\n if (!allowCreation) {\n return null;\n }\n\n return (\n <Stack alignItems=\"flex-end\" gap={1}>\n <UserModal open={open} setOpen={setOpen} refetch={onUserCreateSuccess} />\n <Button startDecorator={<Add />} size=\"sm\" onClick={() => setOpen(true)}>\n {buttonText}\n </Button>\n </Stack>\n );\n}\n","import { useMemo } from 'react';\nimport { GridColDef, GridRowsProp } from '@mui/x-data-grid';\nimport { User } from '@niledatabase/browser';\n\nimport getColumnSize from '../utils/getColumnSize';\nimport useTextSizer from '../hooks/useTextSizer';\n\nexport const internalRowId = '_nile_data_grid_identifier';\n\ntype Cleaned = { [key: string]: string | Set<string> };\n\nconst makeRenderable = (vals: User) => {\n return Object.keys(vals).reduce((cleaned: Cleaned, key) => {\n const val = (vals as Cleaned)[key];\n if (val instanceof Set) {\n cleaned[key] = Array.from(val).join(', ');\n } else if (Array.isArray(val)) {\n cleaned[key] = val.join(', ');\n } else {\n cleaned[key] = val;\n }\n return cleaned;\n }, {});\n};\n\nconst parseResults = (\n data: void | User[],\n ctx: CanvasRenderingContext2D | void,\n include: string[]\n): [GridColDef[], GridRowsProp] => {\n if (!data) {\n return [[], []];\n }\n const rows = data.map(makeRenderable);\n const fields = Object.keys(rows[0]);\n\n const existentCols: { [key: string]: number } = {};\n\n const mapCols = (col: string): GridColDef | void => {\n const width = getColumnSize(col, rows, ctx);\n const name = col.slice();\n if (include.includes(name)) {\n // add spaces to the end of column names so they are not duplicated in the UI\n if (existentCols[name] == null) {\n existentCols[name] = name.length;\n } else {\n existentCols[name] += 1;\n }\n return {\n field: name.padEnd(existentCols[name]),\n headerName: name.padEnd(existentCols[name]),\n width,\n };\n }\n };\n const cols = fields?.map(mapCols).filter(Boolean) ?? [];\n\n return [cols as GridColDef[], rows];\n};\n\nexport default function useDataParser(\n data: void | User[],\n include: string[]\n): [GridColDef[], GridRowsProp] {\n const ctx = useTextSizer();\n const [cols, rows] = useMemo(\n () => parseResults(data, ctx, include),\n [data, ctx, include]\n );\n return [cols, rows];\n}\n","import { GridRowsProp } from '@mui/x-data-grid';\nimport isNull from 'lodash/isNull';\nimport isUndefined from 'lodash/isUndefined';\n\nexport default function getColumnSize(\n column: unknown,\n rows: GridRowsProp,\n canvasContext: void | CanvasRenderingContext2D\n) {\n const dataWidthReducer = (\n longest: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nextRow: { [key: string]: any }\n ) => {\n let value = nextRow[String(column)];\n if (isNull(value) || isUndefined(value)) {\n value = '';\n }\n value = value?.toString();\n return longest.length > value.length ? longest : value;\n };\n\n let columnHeaderLen =\n canvasContext && column\n ? canvasContext.measureText(String(column)).width\n : 50;\n /* padding 12, icon-width 15 */\n columnHeaderLen += 15 + 12;\n\n let width = columnHeaderLen;\n width =\n 16 +\n Math.ceil(\n canvasContext\n ? canvasContext.measureText(rows.reduce(dataWidthReducer, '')).width\n : 50\n );\n if (width < columnHeaderLen) {\n width = columnHeaderLen;\n }\n /* Gracefull */\n width += 8;\n return width;\n}\n","import { useEffect, useState } from 'react';\n\nexport default function useTextSizer() {\n const [ctx, setCtx] = useState<CanvasRenderingContext2D>();\n useEffect(() => {\n const canvas = document.createElement('canvas');\n const canvasContext = canvas.getContext('2d');\n if (canvasContext) {\n canvasContext.font = '18px Roboto';\n setCtx(canvasContext);\n }\n }, []);\n return ctx;\n}\n","import { DataGrid } from '@mui/x-data-grid';\nimport React from 'react';\nimport Stack from '@mui/joy/Stack';\nimport { SxProps } from '@mui/system/styleFunctionSx/styleFunctionSx';\nimport { Theme } from '@mui/system/createTheme';\nimport { SignUp201Response, User } from '@niledatabase/browser';\n\nimport CreateUser from './CreateUser';\nimport useDataParser from './useDataParser';\n\ntype ColumnNames = string;\n\ntype Props = {\n data: void | User[];\n allowCreation?: boolean;\n buttonText?: string;\n onUserCreateSuccess?: (user: SignUp201Response) => void;\n slots?: {\n dataGrid?: SxProps<Theme>;\n };\n // white list of columns to show\n include?: ColumnNames[];\n};\n\nexport default function UserList(props: Props) {\n const {\n data,\n allowCreation = true,\n buttonText = 'Add a user',\n onUserCreateSuccess,\n slots,\n include = ['email', 'preferedName'],\n } = props;\n\n const dataGridSx = {\n width: '100%',\n height: '100%',\n ...(slots?.dataGrid ?? {}),\n };\n\n const [columns, rows] = useDataParser(data, include);\n return (\n <Stack flex={1}>\n <CreateUser\n allowCreation={allowCreation}\n buttonText={buttonText}\n onUserCreateSuccess={onUserCreateSuccess}\n />\n <DataGrid\n sx={dataGridSx}\n rows={rows}\n columns={columns}\n hideFooter={true}\n />\n </Stack>\n );\n}\n","import React from 'react';\nimport { useMutation } from '@tanstack/react-query';\nimport { UpdateProviderRequest, SSOProvider } from '@niledatabase/browser';\nimport Stack from '@mui/joy/Stack';\nimport Typography from '@mui/joy/Typography';\nimport Alert from '@mui/joy/Alert';\nimport CheckCircleOutlined from '@mui/icons-material/CheckCircleOutlined';\n\nimport SimpleForm from '../lib/SimpleForm';\nimport { useApi } from '../context';\nimport { Attribute, AttributeType } from '../lib/SimpleForm/types';\n\nimport { OktaProps } from './types';\n\ntype SSOFormRequest = Omit<UpdateProviderRequest, 'emailDomains'> & {\n emailDomains: string;\n};\nexport default function BaseSSOForm(\n props: Omit<OktaProps, 'callbackUrl' | 'providers'> & {\n providerName: string;\n configurationGuide?: JSX.Element;\n config?: SSOProvider;\n }\n) {\n const {\n config,\n providerName,\n onSuccess,\n onError,\n allowEdit = true,\n configurationGuide,\n } = props;\n\n const api = useApi();\n const [loading, setLoading] = React.useState(false);\n const [success, setSuccess] = React.useState(false);\n const [optimisticConfig, setConfig] = React.useState<SSOProvider | void>(\n config\n );\n const timer = React.useRef<NodeJS.Timeout>();\n const attributes = React.useMemo(() => {\n const attributes: Attribute[] = [\n {\n name: 'enabled',\n label: 'Allow Okta logins',\n type: AttributeType.Switch,\n defaultValue: optimisticConfig?.enabled === true,\n options: [\n {\n label: 'Enabled',\n },\n {\n label: 'Disabled',\n },\n ],\n disabled: !allowEdit,\n },\n {\n name: 'clientId',\n label: 'Client id',\n type: AttributeType.Text,\n defaultValue: optimisticConfig?.clientId ?? '',\n required: true,\n disabled: !allowEdit,\n },\n {\n name: 'configUrl',\n label: 'Config url',\n type: AttributeType.Text,\n defaultValue: optimisticConfig?.configUrl ?? '',\n helpText:\n 'The URL of the .well-known/openid-configuration for the identity provider',\n required: true,\n disabled: !allowEdit,\n },\n {\n name: 'emailDomains',\n label: 'Email domains',\n type: AttributeType.Text,\n defaultValue: optimisticConfig?.emailDomains?.join(', ') ?? '',\n required: true,\n helpText:\n 'A comma seperated list of email domains (yourDomain.com) to be used',\n disabled: !allowEdit,\n },\n ];\n if (!optimisticConfig?.clientId) {\n attributes.splice(2, 0, {\n name: 'clientSecret',\n label: 'Client secret',\n type: AttributeType.Password,\n defaultValue: '',\n required: true,\n disabled: !allowEdit,\n });\n }\n return attributes;\n }, [\n allowEdit,\n optimisticConfig?.clientId,\n optimisticConfig?.configUrl,\n optimisticConfig?.emailDomains,\n optimisticConfig?.enabled,\n ]);\n\n const handleTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n }\n\n timer.current = setTimeout(() => {\n setSuccess(false);\n }, 3000);\n };\n\n const mutation = useMutation(\n (ssoRequest: SSOFormRequest) => {\n setLoading(true);\n const payload = {\n providerName: providerName.toLowerCase(),\n updateProviderRequest: {\n ...ssoRequest,\n emailDomains: ssoRequest.emailDomains.split(','),\n },\n };\n if (optimisticConfig != null) {\n return api.auth.updateProvider(payload);\n } else {\n return api.auth.createProvider(payload);\n }\n },\n {\n onSuccess: (data, vars) => {\n setConfig(data);\n setSuccess(true);\n onSuccess && onSuccess(data, vars);\n },\n onError,\n onSettled: (data, error, vars) => {\n setLoading(false);\n handleTimer();\n if (!data) {\n if (!error || error?.message.includes('Unterminated string')) {\n // something unexpected happened on the BE, but it's non-fatal\n setConfig({\n enabled: vars.enabled,\n clientId: vars.clientId,\n configUrl: vars.configUrl,\n emailDomains: vars.emailDomains.split(', '),\n } as SSOProvider);\n }\n setSuccess(true);\n onSuccess && onSuccess(data, vars);\n }\n },\n }\n );\n\n React.useEffect(() => {\n () => {\n clearTimeout(timer.current);\n };\n });\n\n return (\n <Stack gap={2} position=\"relative\">\n <Typography level=\"h4\">Step 1</Typography>\n {configurationGuide}\n <Typography level=\"h4\">Step 2</Typography>\n <SimpleForm\n mutation={mutation}\n buttonText=\"Update\"\n attributes={attributes}\n loading={loading}\n successMessage={\n <Alert\n color=\"success\"\n sx={{\n opacity: success ? 1 : 0,\n transition: 'opacity 200ms',\n height: '0.9rem',\n }}\n startDecorator={<CheckCircleOutlined />}\n >\n <Typography textAlign=\"center\" fontSize=\"sm\">\n Provider updated\n </Typography>\n </Alert>\n }\n />\n </Stack>\n );\n}\n","import React from 'react';\nimport Stack from '@mui/joy/Stack';\nimport Typography from '@mui/joy/Typography';\nimport Box from '@mui/joy/Box';\nimport Input from '@mui/joy/Input';\nimport CopyAll from '@mui/icons-material/CopyAll';\nimport { Theme } from '@mui/joy/styles';\nimport Tooltip from '@mui/joy/Tooltip';\nimport CheckCircleOutlined from '@mui/icons-material/CheckCircleOutlined';\nimport { SSOProvider } from '@niledatabase/browser';\n\nimport BaseSSOForm from './BaseSSOForm';\nimport { OktaProps } from './types';\n\nfunction ConfigGuide({ callbackUrl }: { callbackUrl?: string }) {\n const [copied, setCopied] = React.useState(false);\n\n const timer = React.useRef<NodeJS.Timeout>();\n React.useEffect(() => {\n if (timer.current) {\n clearTimeout(timer.current);\n }\n timer.current = setTimeout(() => {\n setCopied(false);\n }, 3250);\n () => {\n clearTimeout(timer.current);\n };\n }, [copied]);\n return (\n <Stack gap={2}>\n <Typography>\n In order for Okta to redirect properly, provide the following URL as the{' '}\n <Box component=\"span\" sx={{ fontFamily: 'monospace' }}>\n Sign-in redirect URIs\n </Box>{' '}\n in the admin configuration of your application.\n </Typography>\n <Input\n onClick={async () => {\n if (callbackUrl) {\n await navigator.clipboard.writeText(callbackUrl);\n setCopied(true);\n }\n }}\n sx={(theme: Theme) => ({\n input: {\n cursor: 'pointer',\n },\n span: {\n cursor: 'pointer',\n },\n '&:hover svg': {\n '--Icon-color': theme.palette.primary[500],\n },\n })}\n value={callbackUrl}\n readOnly={true}\n endDecorator={\n <Tooltip title=\"Copy Okta redirect URL\">\n <Box\n position=\"relative\"\n width={copied ? '82px' : '24px'}\n height=\"24px\"\n >\n <Box\n position=\"absolute\"\n top=\"0\"\n left=\"0\"\n sx={{\n opacity: copied ? 0 : 1,\n transition: 'opacity 300ms',\n }}\n >\n <CopyAll />\n </Box>\n <Box\n position=\"absolute\"\n top=\"0\"\n left=\"0\"\n sx={{ opacity: !copied ? 0 : 1, transition: 'opacity 300ms' }}\n >\n <Stack direction=\"row\" gap={1}>\n <CheckCircleOutlined />\n <Typography color=\"primary\">Copied!</Typography>\n </Stack>\n </Box>\n </Box>\n </Tooltip>\n }\n />\n </Stack>\n );\n}\n\nexport default function Okta(props: OktaProps) {\n const { callbackUrl, providers, ...remaining } = props;\n if (!providers) {\n return null;\n }\n const config = providers?.find((provider) => provider.provider === 'okta');\n return (\n <BaseSSOForm\n {...remaining}\n config={config as SSOProvider}\n providerName=\"Okta\"\n configurationGuide={<ConfigGuide callbackUrl={callbackUrl} />}\n />\n );\n}\n"],"names":["Themer","theme","children","slotProps","React","JoyCssVarsProvider","createElement","CssBaseline","enableColorScheme","queryClient","QueryClient","context","createContext","api","Browser","basePath","credentials","Provider","BaseQueryProvider","QueryClientProvider","client","NileProvider","props","tenantId","QueryProvider","values","useMemo","String","ThemeProvider","provider","value","useNileContext","useContext","useNileConfig","useApi","_g","_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","SvgGoogle","xmlns","width","height","fillRule","fill","d","GoogleSSOButton","databaseId","newTenantName","contextHref","encodeURIComponent","query","href","Box","component","display","flex","sx","textDecoration","Button","padding","textTransform","Stack","direction","alignItems","p","fontFamily","fontSize","color","boxShadow","borderRadius","border","fontWeight","backgroundColor","background","GoogleLogo","Typography","CheckGroup","options","attribute","helperText","watch","control","useFormContext","currentVals","name","checkProps","Controller","rules","required","Boolean","render","field","FormLabel","htmlFor","label","role","List","orientation","wrap","map","item","id","ListItem","Checkbox","overlay","checked","includes","disableIcon","variant","onChange","event","allowMultiple","concat","remaining","filter","val","level","AttributeType","getAttributeDefault","Array","isArray","defaultValue","Labler","error","attr","Tooltip","title","cursor","Error","ml","SimpleForm","mutation","buttonText","attributes","cancelButton","loading","successMessage","defaultValues","reduce","accum","methods","useForm","register","handleSubmit","formState","errors","onSubmit","useCallback","data","mutate","FormProvider","spacing","fieldConfig","placeholder","disabled","helpText","type","Switch","FormControl","FormHelperText","endDecorator","Select","_","newValue","option","Option","Password","Input","Number","Text","gap","SignUpForm","setError","useState","onSuccess","onError","beforeMutate","useMutation","async","_data","undefined","email","password","preferredName","newTenant","metadata","keys","console","warn","auth","signUp","signUpRequest","e","vars","message","completeAttributes","mainAttributes","Alert","UserForm","LoginForm","login","loginRequest","SingleSignOnForm","nextButtonText","loginButtonText","disableSSO","setButtonText","sso","token","redirectURI","window","location","push","AddUser","open","setOpen","refetch","errorText","setErrorText","useEffect","users","createTenantUser","handleUpdate","Modal","ModalDialog","Fragment","fullWidth","size","autoComplete","pt","onClick","CreateUser","allowCreation","onUserCreateSuccess","UserModal","startDecorator","Add","makeRenderable","vals","cleaned","Set","from","join","parseResults","ctx","include","rows","fields","existentCols","cols","col","column","canvasContext","columnHeaderLen","measureText","Math","ceil","longest","nextRow","isNull","isUndefined","toString","getColumnSize","slice","padEnd","headerName","useDataParser","setCtx","document","getContext","font","useTextSizer","UserList","slots","dataGridSx","dataGrid","columns","DataGrid","hideFooter","BaseSSOForm","config","providerName","allowEdit","configurationGuide","setLoading","success","setSuccess","optimisticConfig","setConfig","timer","useRef","enabled","clientId","configUrl","emailDomains","splice","ssoRequest","payload","toLowerCase","updateProviderRequest","split","updateProvider","createProvider","onSettled","current","clearTimeout","setTimeout","position","opacity","transition","CheckCircleOutlined","textAlign","ConfigGuide","callbackUrl","copied","setCopied","navigator","clipboard","writeText","input","span","palette","primary","readOnly","top","left","CopyAll","Okta","providers","find"],"mappings":"w0CAMc,SAAUA,GAAOC,MAC7BA,EAAKC,SACLA,EAAQC,UACRA,IAMA,OACEC,gBAACC,EAAkB,IAAKF,EAAWF,MAAOA,GACxCG,EAACE,cAAAC,EAAY,CAAAC,mBAAoB,IAChCN,EAGP,CCbA,MAAMO,EAAc,IAAIC,EAUlBC,EAAUC,EARoB,CAClCC,IAAK,IAAIC,EAAQ,CACfC,SAAU,0BACVC,YAAa,YAEfD,SAAU,MAKNE,SAAEA,GAAaN,EAERO,EAAoB,EAC/BhB,cAKEE,EAACE,cAAAa,EAAoB,CAAAC,OAAQX,GAAcP,GAIlCmB,EAAgBC,IAC3B,MAAMpB,SACJA,EAAQD,MACRA,EAAKE,UACLA,EAASoB,SACTA,EAAQC,cACRA,EAAgBN,EAAiBH,SACjCA,EAAW,0BAAyBF,IACpCA,GACES,EAEEG,EAASC,GAAqB,KAC3B,CACLb,IACEA,GACA,IAAIC,EAAQ,CACVC,WACAC,YAAa,YAEjBO,SAAUI,OAAOJ,GACjBR,cAED,CAACF,EAAKE,EAAUQ,IAEnB,OACEnB,gBAACoB,EAAa,KACZpB,EAACE,cAAAsB,EAAc,CAAAzB,UAAWA,GAAW0B,SAAU5B,MAAOA,GACpDG,EAACE,cAAAW,EAAS,CAAAa,MAAOL,GAASvB,IAG9B,EAGE6B,GAAiB,IACdC,EAAWrB,GAGPsB,GAAgB,KAC3B,MAAMlB,SAAEA,EAAQQ,SAAEA,GAAaQ,KAC/B,OAAOL,GACL,KAAO,CACLH,WACAR,cAEF,CAACA,EAAUQ,GACZ,EAGUW,GAAS,IACbH,KAAiBlB,ICjF1B,IAAIsB,GACJ,SAASC,KAAiS,OAApRA,GAAWC,OAAOC,OAASD,OAAOC,OAAOC,OAAS,SAAUC,GAAU,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAUC,OAAQF,IAAK,CAAE,IAAIG,EAASF,UAAUD,GAAI,IAAK,IAAII,KAAOD,EAAcP,OAAOS,UAAUC,eAAeC,KAAKJ,EAAQC,KAAQL,EAAOK,GAAOD,EAAOC,IAAY,OAAOL,CAAS,EAASJ,GAASa,MAAMC,KAAMR,UAAa,CAEnV,IAAIS,GAAY,SAAmB7B,GACjC,OAAoBlB,EAAME,cAAc,MAAO8B,GAAS,CACtDgB,MAAO,6BACPC,MAAO,GACPC,OAAQ,IACPhC,GAAQa,KAAOA,GAAkB/B,EAAME,cAAc,IAAK,CAC3DiD,SAAU,WACInD,EAAME,cAAc,OAAQ,CAC1CkD,KAAM,UACNC,EAAG,iIACYrD,EAAME,cAAc,OAAQ,CAC3CkD,KAAM,UACNC,EAAG,mHACYrD,EAAME,cAAc,OAAQ,CAC3CkD,KAAM,UACNC,EAAG,0GACYrD,EAAME,cAAc,OAAQ,CAC3CkD,KAAM,UACNC,EAAG,+HACYrD,EAAME,cAAc,OAAQ,CAC3CkD,KAAM,OACNC,EAAG,oBAEP,ECNwB,SAAAC,GAAgBpC,GAKtC,MAAMqC,WAAEA,EAAUC,cAAEA,GAAkBtC,GAChCP,SAAEA,GAAakB,KAEf4B,EAAc,GAAG9C,eADC+C,mBAAmBH,GAAc,8BAEnDI,EAAQH,EACV,cAAgBE,mBAAmBF,GACnC,GACEI,GAAQ1C,GAAO0C,MAAQH,GAAeE,EAC5C,OACE3D,EAACE,cAAA2D,EACC,CAAAC,UAAU,IACVF,KAAMA,EACNG,QAAQ,OACRC,KAAM,EACNC,GAAI,CAAEC,eAAgB,SAEtBlE,EAAAE,cAAC2D,EAAG,KACF7D,EAAAE,cAACiE,EACC,CAAAF,GAAI,CAAEG,QAAS,EAAGC,cAAe,UAAWL,KAAM,gBACvC,sBAEXhE,EAACE,cAAAoE,GACCC,UAAU,MACVC,WAAW,SACXC,EAAG,EACHT,KAAM,EACNU,WAAW,qBACXC,SAAS,OACTZ,QAAQ,cACRa,MAAM,oBACNC,UAAU,oEACVC,aAAa,MACbC,OAAO,wBACPC,WAAW,MACXf,GAAI,CACFgB,gBAAiB,qBAGnBjF,EAAAE,cAAC2D,EACC,CAAAO,QAAQ,OACRL,QAAQ,OACRgB,OAAO,8BACPD,aAAa,MACbb,GAAI,CACFiB,WAAY,uBAGdlF,EAAAE,cAACiF,GAAU,CAAA,cAAa,UAE1BnF,EAACE,cAAA2D,GAAIO,QAAQ,OAAOJ,KAAM,GACxBhE,EAAAE,cAACkF,EAAU,CACTnB,GAAI,CAAEW,MAAO,SACbI,WAAY,IACZN,WAAW,qBACXC,SAAS,OACTzB,OAAO,QAGI,4BAO3B,CCxEwB,SAAAmC,GAAWnE,GACjC,MAAMoE,QAAEA,EAAOC,UAAEA,EAASxB,QAAEA,EAAOyB,WAAEA,GAAetE,GAC9CuE,MAAEA,EAAKC,QAAEA,GAAYC,IACrBC,EAAcH,EAAMF,EAAUM,MAC9BC,EAAgD,CAAA,EAItD,OAHIN,IACFM,EAAWlB,MAAQ,UAGnB5E,EAAAE,cAAC6F,EAAU,CACTF,KAAMN,EAAUM,KAChBG,MAAO,CAAEC,SAAUC,QAAQX,EAAUU,WACrCP,QAASA,EACTS,OAAQ,EAAGC,WAEPpG,gBAACsE,EAAK,KACJtE,EAAAE,cAACmG,EAAS,CAACC,QAAS,GAAGF,EAAMP,QAAS9B,EAAQwC,OAC9CvG,EAACE,cAAA2D,EACC,CAAA2C,KAAK,QACY,kBAAAjB,EAAUM,KAC3B5B,GAAI,CACFa,aAAc,uBACdL,EAAG,GACHM,OAAQS,EACJ,qDACA,SAGNxF,EAACE,cAAAuG,GACCC,YAAY,aACZC,MACA,EAAA1C,GAAI,CACF,aAAc,QAGfqB,EAAQsB,KAAKC,IACZf,EAAWgB,GAAKvF,OAAOsF,EAAKnF,OAE1B1B,EAAAE,cAAC6G,EAAQ,CAACtE,IAAK,GAAGoE,EAAKnF,SAASmF,EAAKN,SACnCvG,EAACE,cAAA8G,GACCC,QAAS3B,EAAQ/C,OAAS,KACtBuD,EACJoB,QAAStB,EAAYuB,SAASN,EAAKnF,OACnC0F,YAAa9B,EAAQ/C,OAAS,EAC9B8E,QAAQ,OACRd,MAAOM,EAAKN,MACZe,SAAWC,IACT,GAAIhC,EAAUiC,cACZ,GAAID,EAAMnF,OAAO8E,QACVtB,EAGHQ,EAAMkB,SAAS1B,EAAY6B,OAAOZ,EAAKnF,QAFvC0E,EAAMkB,SAAS,CAACT,EAAKnF,YAIlB,CACL,MAAMgG,EAAY9B,EAAY+B,QAC3BC,GAAyBA,IAAQf,EAAKnF,QAErCgG,EAAUnF,OAAS,EACrB6D,EAAMkB,SAASI,GAEftB,EAAMkB,SAAS,GAElB,MAEGC,EAAMnF,OAAO8E,QACfd,EAAMkB,SAAST,EAAKnF,OAEpB0E,EAAMkB,SAAS,GAElB,UAQftH,EAAAE,cAACkF,EACC,CAAAnB,GAAI,CAAEW,MAAO,iCACbiD,MAAM,WAELrC,KAOf,KC3GYsC,IAAZ,SAAYA,GACVA,EAAA,KAAA,OACAA,EAAA,SAAA,WACAA,EAAA,OAAA,SACAA,EAAA,OAAA,SACAA,EAAA,MAAA,QACAA,EAAA,SAAA,WACAA,EAAA,OAAA,QACD,CARD,CAAYA,KAAAA,GAQX,CAAA,ICkBM,MAAMC,GACXxC,IAGgC,IAA5BA,EAAUiC,gBACPQ,MAAMC,QAAQ1C,EAAU2C,eAAiB3C,EAAU2C,aAChB,iBAA3B3C,EAAU2C,aACZ,CAAC3C,EAAU2C,cAEb,CAAC3G,OAAOgE,EAAU2C,eAGtB3C,EAAU2C,cAAgB,GAGnC,SAASC,GAAOjH,GACd,MAAMkH,MAAEA,EAAKC,KAAEA,GAASnH,EACxB,OAAIkH,EAEApI,EAACE,cAAAoI,GAAQC,MAAOH,EAAOxD,MAAM,SAASX,GAAI,CAAEuE,OAAQ,YAClDxI,EAAAE,cAACmG,EAAS,KACPgC,EAAK9B,OAAS8B,EAAKxC,KACpB7F,EAACE,cAAAuI,GAAMxE,GAAI,CAAEyE,GAAI,GAAK,eAAgB,WAAa/D,SAAS,YAK7D3E,EAAAE,cAACmG,EAAS,KAAEgC,EAAK9B,OAAS8B,EAAKxC,KACxC,CACwB,SAAA8C,GAAWzH,GASjC,MAAM0H,SACJA,EAAQC,WACRA,EAAUC,WACVA,EAAUC,aACVA,EAAYC,QACZA,EAAOC,eACPA,GACE/H,EAEEgI,EAAgBlJ,EAAMsB,SAC1B,IACEwH,EAAWK,QAAO,CAACC,EAAgBf,KACjCe,EAAMf,EAAKxC,MAAQkC,GAAoBM,GAChCe,IACN,KACL,CAACN,IAGGO,EAAUC,EAAQ,CACtBJ,mBAGIK,SACJA,EAAQ7D,QACRA,EAAO8D,aACPA,EACAC,WAAWC,OAAEA,IACXL,EACEM,EAAW3J,EAAM4J,aAEpBC,IACCjB,EAASkB,OAAOD,EAAK,GAEvB,CAACjB,IAGH,OACE5I,EAAAE,cAAC6J,EAAY,IAAKV,GAChBrJ,EAAAE,cAACoE,EAAK,CACJR,UAAU,OAEV6F,SAAUH,GAAcK,GAASF,EAASE,KAC1CG,QAAS,GAERlB,EAAWlC,KAAKyB,IACf,MAAM4B,EAA2B,CAAA,EAC3BlG,EAAwB,CAC5BtB,IAAK4F,EAAKxC,KACVU,MAAO8B,EAAK9B,OAAS8B,EAAKxC,KAC1BiB,GAAIuB,EAAK9B,OAAS8B,EAAKxC,KACvBqE,YAAa7B,EAAK6B,aAAe7B,EAAK9B,OAAS8B,EAAKxC,KACpDuC,MAAOlC,QAAQwD,EAAOrB,EAAKxC,OAC3BsE,SAAUjE,QAAQmC,EAAK8B,WAEnB7E,EAAU+C,EAAK/C,SAAW,GAC1BE,EAAa6C,EAAK+B,UAAY,GACpC,IAAIhC,EAAQ,GASZ,OAPIC,EAAKpC,WACPmC,EAAQsB,EAAOrB,EAAKxC,MAChB,GAAGwC,EAAK9B,OAAS8B,EAAKxC,mBACtB,GACJoE,EAAYhE,UAAW,GAGjBoC,EAAKgC,MACX,KAAKvC,GAAcwC,OACjB,OACEtK,EAACE,cAAAqK,EACC,CAAA9H,IAAKsB,EAAQtB,IACbqE,GAAI/C,EAAQ+C,GACZJ,YAAY,aACZzC,GAAI,CAAEO,WAAY,WAElBxE,EAAAE,cAAC2D,EAAG,KACF7D,EAACE,cAAAiI,IAAOC,MAAOA,EAAOC,KAAMA,IAC5BrI,EAAAE,cAACsK,EAAc,CAAC1D,GAAI,GAAGuB,EAAKxC,oBACzBL,IAGLxF,EAAAE,cAAC6F,EAAU,CACTL,QAASA,EACTM,MAAO,CAAEC,SAAUC,QAAQmC,EAAKpC,WAChCJ,KAAMwC,EAAKxC,KACXM,OAAQ,EAAGC,YACT,MAAMxB,EAA8B,CAAA,EAIpC,OAHI8E,EAAOrB,EAAKxC,QACdjB,EAAMA,MAAQ,UAGd5E,EAAAE,cAACoK,EAAM,CACLxD,GAAI,gBAAgBuB,EAAKxC,UACrBjB,KACAwB,EACJc,QAAShB,QAAQE,EAAM1E,OACvB4F,SAAWC,IACTnB,EAAMkB,SAASC,EAAMnF,OAAO8E,QAAQ,EAEtCtC,MAAOwB,EAAM1E,MAAQ,UAAY,UACjC+I,aACErE,EAAM1E,MAAQ4D,EAAQ,GAAGiB,MAAQjB,EAAQ,GAAGiB,OAGhD,KAKZ,KAAKuB,GAAcd,SACjB,OACEhH,EAACE,cAAAmF,GACC,CAAA5C,IAAKsB,EAAQtB,IACb8C,UAAW8C,EACXtE,QAASA,EACTuB,QAASA,EACTE,WAAYA,IAGlB,KAAKsC,GAAc4C,OACjB,OACE1K,EAAAE,cAACqK,EAAW,CAAC9H,IAAKsB,EAAQtB,IAAKqE,GAAI/C,EAAQ+C,IACzC9G,EAACE,cAAAiI,IAAOC,MAAOA,EAAOC,KAAMA,IAC5BrI,EAAAE,cAAC6F,EAAU,CACTL,QAASA,EACTM,MAAO,CAAEC,SAAUC,QAAQmC,EAAKpC,WAChCJ,KAAMwC,EAAKxC,KACXM,OAAQ,EAAGC,YACT,MAAMxB,EAA8B,CAAA,EAChC8E,EAAOrB,EAAKxC,QACdjB,EAAMA,MAAQ,UAEhB,MAAMlD,EAAQH,OAAO6E,EAAM1E,OAC3B,OACE1B,gBAACsE,EAAK,KACJtE,EAAAE,cAACwK,EAAM,CACL5D,GAAI,gBAAgBuB,EAAKxC,OACzBqE,YAAa,GAAGnG,EAAQmG,oBACpBtF,KACAwB,EACJ1E,MAAOA,EACP4F,SAAU,CAACqD,EAAGC,KACZxE,EAAMkB,SAASsD,EAAS,GAGzBtF,EAAQsB,KAAKiE,GAEV7K,EAACE,cAAA4K,EACC,CAAArI,IAAKlB,OAAOsJ,EAAOnJ,OAAS,IAC5BA,MAAOmJ,EAAOnJ,OAEbmJ,EAAOtE,UAKhBvG,EAAAE,cAACsK,EAAc,CAAC1D,GAAI,GAAGuB,EAAKxC,oBACzBL,GAGL,KAKZ,KAAKsC,GAAciD,SACjB,OACE/K,EAAAE,cAACqK,EAAW,CAAC9H,IAAKsB,EAAQtB,IAAKqE,GAAI/C,EAAQ+C,IACzC9G,EAACE,cAAAiI,IAAOC,MAAOA,EAAOC,KAAMA,IAC5BrI,EAAAE,cAAC8K,EACK,IAAAjH,KACAwF,EAASlB,EAAKxC,KAAMoE,GACxBI,KAAMvC,GAAciD,WAEtB/K,EAAAE,cAACsK,EAAc,CAAC1D,GAAI,GAAGuB,EAAKxC,oBACzBL,IAIT,KAAKsC,GAAcmD,OACjB,OACEjL,EAAAE,cAACqK,EAAW,CAAC9H,IAAKsB,EAAQtB,IAAKqE,GAAI/C,EAAQ+C,IACzC9G,EAACE,cAAAiI,IAAOC,MAAOA,EAAOC,KAAMA,IAC5BrI,EAAAE,cAAC8K,EACK,IAAAjH,KACAwF,EAASlB,EAAKxC,KAAMoE,GACxBI,KAAMvC,GAAcmD,SAEtBjL,EAAAE,cAACsK,EAAc,CAAC1D,GAAI,GAAGuB,EAAKxC,oBACzBL,IAKT,KAAKsC,GAAcoD,KACnB,QACE,OACElL,EAAAE,cAACqK,EAAW,CAAC9H,IAAKsB,EAAQtB,IAAKqE,GAAI/C,EAAQ+C,IACzC9G,EAACE,cAAAiI,IAAOC,MAAOA,EAAOC,KAAMA,IAC5BrI,EAAAE,cAAC8K,EAAK,IAAKjH,KAAawF,EAASlB,EAAKxC,KAAMoE,KAC5CjK,EAAAE,cAACsK,EAAc,CAAC1D,GAAI,GAAGuB,EAAKxC,oBACzBL,IAIV,IAEFuD,EACC/I,EAACE,cAAAoE,EAAM,CAAA0F,QAAS,EAAGzF,UAAU,OAC1BwE,EACD/I,EAAAE,cAAC2D,EAAG,KACF7D,EAAAE,cAACiE,EAAO,CAAAkG,KAAK,UAAUxB,KAI3B7I,gBAAC6D,EAAG,KACF7D,EAACE,cAAAoE,GAAMC,UAAU,MAAM4G,IAAK,GAC1BnL,EAACE,cAAAiE,EAAO,CAAAkG,KAAK,SAASrB,QAASA,GAC5BH,GAEFI,KAOf,CCvRwB,SAAAmC,GAAWlK,GACjC,MAAOkH,EAAOiD,GAAYrL,EAAMsL,YAC1BzC,WACJA,EAAa,UAAS0C,UACtBA,EAASC,QACTA,EAAO1C,WACPA,EAAU2C,aACVA,GACEvK,EACET,EAAMqB,KACN8G,EAAW8C,GACfC,MAAOC,IACLP,OAASQ,GACT,MACMhC,GADe4B,GAAgBA,EAAaG,KACrBA,GACvBE,MAAEA,EAAKC,SAAEA,EAAQC,cAAEA,EAAaC,UAAEA,KAAcC,GAAarC,EAKnE,OAJI5H,OAAOkK,KAAKD,GAAU3J,OAAS,GAEjC6J,QAAQC,KAAK,0CAER5L,EAAI6L,KAAKC,OAAO,CACrBC,cAAe,CAAEV,QAAOC,WAAUC,gBAAeC,cACjD,GAEJ,CACEV,YACAC,QAAS,CAACiB,EAAUC,KAClBrB,EAASoB,EAAEE,SACXnB,GAAWA,EAAQiB,EAAYC,EAAK,IAKpCE,EAAqB5M,EAAMsB,SAAQ,KACvC,MAAMuL,EAA8B,CAClC,CACEhH,KAAM,QACNU,MAAO,QACP8D,KAAMvC,GAAcoD,KACpBhD,aAAc,GACdjC,UAAU,GAEZ,CACEJ,KAAM,WACNU,MAAO,WACP8D,KAAMvC,GAAciD,SACpB7C,aAAc,GACdjC,UAAU,IAGd,OAAI6C,GAAcA,EAAWvG,OAAS,EAC7BsK,EAAepF,OAAOqB,GAExB+D,CAAc,GACpB,CAAC/D,IAEJ,OACE9I,EAACE,cAAAoE,EAAM,CAAA6G,IAAK,GACT/C,EAAQpI,EAAAE,cAAC4M,EAAM,CAAAlI,MAAM,UAAUwD,GAAiB,KACjDpI,EAAAE,cAAC6M,GACC,CAAAnE,SAAUA,EACVC,WAAYA,EACZC,WAAY8D,IAIpB,CCjEwB,SAAAI,GAAU9L,GAChC,MAAOkH,EAAOiD,GAAYrL,EAAMsL,YAC1BxC,WAAEA,EAAUyC,UAAEA,EAASC,QAAEA,EAAOC,aAAEA,GAAiBvK,EACnDT,EAAMqB,KAEN8G,EAAW8C,GACfC,MAAOC,IACLP,OAASQ,GACT,MACMhC,GADe4B,GAAgBA,EAAaG,KACrBA,EAC7B,aAAanL,EAAI6L,KAAKW,MAAM,CAC1BC,aAAcrD,GACd,GAEJ,CACE0B,YACAC,YAIEoB,EAAqB5M,EAAMsB,SAAQ,KACvC,MAAMuL,EAA8B,CAClC,CACEhH,KAAM,QACNU,MAAO,QACP8D,KAAMvC,GAAcoD,KACpBhD,aAAc,GACdjC,UAAU,GAEZ,CACEJ,KAAM,WACNU,MAAO,WACP8D,KAAMvC,GAAciD,SACpB7C,aAAc,GACdjC,UAAU,IAGd,OAAI6C,GAAcA,EAAWvG,OAAS,EAC7BsK,EAAepF,OAAOqB,GAExB+D,CAAc,GACpB,CAAC/D,IAEJ,OACE9I,EAACE,cAAAoE,EAAM,CAAA6G,IAAK,GACT/C,EAAQpI,EAAAE,cAAC4M,EAAM,CAAAlI,MAAM,UAAUwD,GAAiB,KACjDpI,EAAAE,cAACyI,GACC,CAAAC,SAAUA,EACVC,WAAW,SACXC,WAAY8D,IAIpB,CCvDwB,SAAAO,GACtBjM,GAMA,MAAM4H,WACJA,EAAUyC,UACVA,EAASC,QACTA,EAAOC,aACPA,EAAY2B,eACZA,EAAiB,OAAMC,gBACvBA,EAAkB,SAAQC,WAC1BA,GAAa,GACXpM,EACET,EAAMqB,MACL+G,EAAY0E,GAAiBvN,EAAMsL,SACxCgC,EAAaD,EAAkBD,GAG3BxE,EAAW8C,GACfC,MAAOC,IACL,MACM/B,GADe4B,GAAgBA,EAAaG,KACrBA,EAC7B,aAAanL,EAAI6L,KAAKW,MAAM,CAC1BC,aAAc,CAAEpB,MAAOjC,EAAKiC,MAAOC,SAAUlC,EAAKkC,UAClDyB,KAAMF,GACN,GAEJ,CACE/B,UAAW,CAACkC,EAAO5D,KACb4D,IACEA,GAAOC,YACTC,OAAOC,SAAShK,KAAO6J,EAAMC,YACpB7E,IAAewE,EACxBE,EAAcF,GAEd9B,GAAaA,EAAUkC,EAAO5D,GAEjC,EAEH2B,QAAS,CAACpD,EAAOyB,KAEXhB,IAAewE,EACjB7B,GAAWA,EAAQpD,EAAgByB,GAEnC0D,EAAcF,EACf,IAKDT,EAAqB5M,EAAMsB,SAAQ,KACvC,MAAMuL,EAA8B,CAClC,CACEhH,KAAM,QACNU,MAAO,QACP8D,KAAMvC,GAAcoD,KACpBhD,aAAc,GACdjC,UAAU,IAYd,OATI4C,IAAewE,GACjBR,EAAegB,KAAK,CAClBhI,KAAM,WACNU,MAAO,WACP8D,KAAMvC,GAAciD,SACpB7C,aAAc,GACdjC,UAAU,IAGV6C,GAAcA,EAAWvG,OAAS,EAC7BsK,EAAepF,OAAOqB,GAExB+D,CAAc,GACpB,CAAC/D,EAAYD,EAAYwE,IAE5B,OACErN,EAACE,cAAAyI,GACC,CAAAC,SAAUA,EACVC,WAAYA,EACZC,WAAY8D,GAGlB,CCxEwB,SAAAkB,GAAQ5M,GAC9B,MAAM6M,KAAEA,EAAIC,QAAEA,EAAOC,QAAEA,GAAY/M,GAC7BC,SAAEA,GAAaU,KACfpB,EAAMqB,MACLoM,EAAWC,GAAgBnO,EAAMsL,YAClC7F,MAAEA,EAAK8D,SAAEA,EAAQC,aAAEA,GAAiBF,IACpCwC,EAAQrG,EAAM,SAEpBzF,EAAMoO,WAAU,KACG,MAAbF,GACFC,GACD,GAGA,CAACrC,IAEJ,MAAMlD,EAAW8C,GACd7B,GACCpJ,EAAI4N,MAAMC,iBAAiB,CACzB9B,cAAe3C,EACf1I,SAAUI,OAAOJ,MAErB,CACE,SAAAoK,CAAU1B,GACRoE,GAAWA,EAAQpE,GACnBmE,GAAQ,EACT,EACD,OAAAxC,CAAQiB,GACFA,aAAahE,OACf0F,EAAa1B,EAAEE,QAElB,IAIC4B,EAAevO,EAAM4J,aACzB+B,MAAO9B,IACLsE,EAAa,IACbvF,EAASkB,OAAOD,EAAK,GAEvB,CAACjB,IAGH,OACE5I,EAACE,cAAAsO,EAAM,CAAAT,KAAMA,GACX/N,EAAAE,cAACuO,EAAW,KACVzO,EAAAE,cAACoE,EAAK,CAAC0F,QAAS,GACdhK,EAAAE,cAACkF,EAAU,CAACyC,MAAM,MAA6B,eAC/C7H,EACGE,cAAAF,EAAA0O,SAAA,KAAAR,GAAalO,EAAAE,cAACkF,EAAU,CAACR,MAAM,UAAUsJ,IAE5ClO,EAAAE,cAACoE,EACC,CAAAR,UAAU,OACVG,GAAI,CACFhB,MAAO,QAET+G,QAAS,EACTL,SAAUH,GAAcK,GACtB0E,EAAa1E,MAGf7J,EAACE,cAAAqK,EACC,CAAAtG,GAAI,CACF,yBAA0B,kCAG5BjE,EAAAE,cAACmG,EAAS,CAACC,QAAQ,SAAyB,SAC5CtG,EAAAE,cAAC8K,EAAK,IACAzB,EAAS,SACboF,WAAS,EACTC,KAAK,KACL9H,GAAG,QACHjB,KAAK,QACLgJ,aAAa,gBACb5I,UACA,EAAAmC,MAAOlC,QAAQgI,MAGnBlO,EAACE,cAAAqK,EACC,CAAAtG,GAAI,CACF,yBAA0B,kCAG5BjE,EAAAE,cAACmG,EAAS,CAACC,QAAQ,YAA+B,YAClDtG,EAACE,cAAA8K,EACK,IAAAzB,EAAS,YACboF,WAAS,EACTC,KAAK,KACL9H,GAAG,WACH+H,aAAa,mBACbxE,KAAK,WACLpE,UAAQ,KAGZjG,EAAAE,cAACoE,EAAM,CAAAC,UAAU,MAAMN,GAAI,CAAE6K,GAAI,GAAK9E,QAAS,GAC7ChK,EAAAE,cAACiE,EAAM,CAAC4K,QAAS,IAAMf,GAAQ,GAAQ3G,QAAQ,SAEtC,UACTrH,EAAAE,cAACiE,EAAM,CAACkG,KAAK,UAAQ,cAOnC,CClHwB,SAAA2E,GAAW9N,GACjC,MAAM+N,cAAEA,EAAapG,WAAEA,EAAUqG,oBAAEA,GAAwBhO,GACpD6M,EAAMC,GAAW1C,GAAS,GACjC,OAAK2D,EAKHjP,EAACE,cAAAoE,EAAM,CAAAE,WAAW,WAAW2G,IAAK,GAChCnL,EAAAE,cAACiP,GAAS,CAACpB,KAAMA,EAAMC,QAASA,EAASC,QAASiB,IAClDlP,EAACE,cAAAiE,EAAO,CAAAiL,eAAgBpP,EAAAE,cAACmP,EAAG,MAAKT,KAAK,KAAKG,QAAS,IAAMf,GAAQ,IAC/DnF,IAPE,IAWX,CClBA,MAAMyG,GAAkBC,GACftN,OAAOkK,KAAKoD,GAAMpG,QAAO,CAACqG,EAAkB/M,KACjD,MAAMmF,EAAO2H,EAAiB9M,GAQ9B,OAPImF,aAAe6H,IACjBD,EAAQ/M,GAAOuF,MAAM0H,KAAK9H,GAAK+H,KAAK,MAC3B3H,MAAMC,QAAQL,GACvB4H,EAAQ/M,GAAOmF,EAAI+H,KAAK,MAExBH,EAAQ/M,GAAOmF,EAEV4H,CAAO,GACb,CAAE,GAGDI,GAAe,CACnB/F,EACAgG,EACAC,KAEA,IAAKjG,EACH,MAAO,CAAC,GAAI,IAEd,MAAMkG,EAAOlG,EAAKjD,IAAI0I,IAChBU,EAAS/N,OAAOkK,KAAK4D,EAAK,IAE1BE,EAA0C,CAAA,EAmB1CC,EAAOF,GAAQpJ,KAjBJuJ,IACf,MAAMlN,ECnCc,SACtBmN,EACAL,EACAM,GAeA,IAAIC,EACFD,GAAiBD,EACbC,EAAcE,YAAYhP,OAAO6O,IAASnN,MAC1C,GAENqN,GAAmB,GAEnB,IAAIrN,EAAQqN,EAaZ,OAZArN,EACE,GACAuN,KAAKC,KACHJ,EACIA,EAAcE,YAAYR,EAAK5G,QAzBd,CACvBuH,EAEAC,KAEA,IAAIjP,EAAQiP,EAAQpP,OAAO6O,IAK3B,OAJIQ,EAAOlP,IAAUmP,EAAYnP,MAC/BA,EAAQ,IAEVA,EAAQA,GAAOoP,WACRJ,EAAQnO,OAASb,EAAMa,OAASmO,EAAUhP,CAAK,GAeQ,KAAKuB,MAC7D,IAEJA,EAAQqN,IACVrN,EAAQqN,GAGVrN,GAAS,EACFA,CACT,CDJkB8N,CAAcZ,EAAKJ,EAAMF,GACjChK,EAAOsK,EAAIa,QACjB,GAAIlB,EAAQ3I,SAAStB,GAOnB,OAL0B,MAAtBoK,EAAapK,GACfoK,EAAapK,GAAQA,EAAKtD,OAE1B0N,EAAapK,IAAS,EAEjB,CACLO,MAAOP,EAAKoL,OAAOhB,EAAapK,IAChCqL,WAAYrL,EAAKoL,OAAOhB,EAAapK,IACrC5C,QAEH,IAE+B0E,OAAOzB,UAAY,GAErD,MAAO,CAACgK,EAAsBH,EAAK,EAGvB,SAAUoB,GACtBtH,EACAiG,GAEA,MAAMD,EE9DM,WACZ,MAAOA,EAAKuB,GAAU9F,IAStB,OARA8C,GAAU,KACR,MACMiC,EADSgB,SAASnR,cAAc,UACToR,WAAW,MACpCjB,IACFA,EAAckB,KAAO,cACrBH,EAAOf,GACR,GACA,IACIR,CACT,CFmDc2B,IACLtB,EAAMH,GAAQzO,GACnB,IAAMsO,GAAa/F,EAAMgG,EAAKC,IAC9B,CAACjG,EAAMgG,EAAKC,IAEd,MAAO,CAACI,EAAMH,EAChB,CG9CwB,SAAA0B,GAASvQ,GAC/B,MAAM2I,KACJA,EAAIoF,cACJA,GAAgB,EAAIpG,WACpBA,EAAa,aAAYqG,oBACzBA,EAAmBwC,MACnBA,EAAK5B,QACLA,EAAU,CAAC,QAAS,iBAClB5O,EAEEyQ,EAAa,CACjB1O,MAAO,OACPC,OAAQ,UACJwO,GAAOE,UAAY,KAGlBC,EAAS9B,GAAQoB,GAActH,EAAMiG,GAC5C,OACE9P,EAACE,cAAAoE,EAAM,CAAAN,KAAM,GACXhE,EAAAE,cAAC8O,GAAU,CACTC,cAAeA,EACfpG,WAAYA,EACZqG,oBAAqBA,IAEvBlP,EAACE,cAAA4R,GACC7N,GAAI0N,EACJ5B,KAAMA,EACN8B,QAASA,EACTE,YAAY,IAIpB,CCvCwB,SAAAC,GACtB9Q,GAMA,MAAM+Q,OACJA,EAAMC,aACNA,EAAY3G,UACZA,EAASC,QACTA,EAAO2G,UACPA,GAAY,EAAIC,mBAChBA,GACElR,EAEET,EAAMqB,MACLkH,EAASqJ,GAAcrS,EAAMsL,UAAS,IACtCgH,EAASC,GAAcvS,EAAMsL,UAAS,IACtCkH,EAAkBC,GAAazS,EAAMsL,SAC1C2G,GAEIS,EAAQ1S,EAAM2S,SACd7J,EAAa9I,EAAMsB,SAAQ,KAC/B,MAAMwH,EAA0B,CAC9B,CACEjD,KAAM,UACNU,MAAO,oBACP8D,KAAMvC,GAAcwC,OACpBpC,cAA4C,IAA9BsK,GAAkBI,QAChCtN,QAAS,CACP,CACEiB,MAAO,WAET,CACEA,MAAO,aAGX4D,UAAWgI,GAEb,CACEtM,KAAM,WACNU,MAAO,YACP8D,KAAMvC,GAAcoD,KACpBhD,aAAcsK,GAAkBK,UAAY,GAC5C5M,UAAU,EACVkE,UAAWgI,GAEb,CACEtM,KAAM,YACNU,MAAO,aACP8D,KAAMvC,GAAcoD,KACpBhD,aAAcsK,GAAkBM,WAAa,GAC7C1I,SACE,4EACFnE,UAAU,EACVkE,UAAWgI,GAEb,CACEtM,KAAM,eACNU,MAAO,gBACP8D,KAAMvC,GAAcoD,KACpBhD,aAAcsK,GAAkBO,cAAcpD,KAAK,OAAS,GAC5D1J,UAAU,EACVmE,SACE,sEACFD,UAAWgI,IAaf,OAVKK,GAAkBK,UACrB/J,EAAWkK,OAAO,EAAG,EAAG,CACtBnN,KAAM,eACNU,MAAO,gBACP8D,KAAMvC,GAAciD,SACpB7C,aAAc,GACdjC,UAAU,EACVkE,UAAWgI,IAGRrJ,CAAU,GAChB,CACDqJ,EACAK,GAAkBK,SAClBL,GAAkBM,UAClBN,GAAkBO,aAClBP,GAAkBI,UAadhK,EAAW8C,GACduH,IACCZ,GAAW,GACX,MAAMa,EAAU,CACdhB,aAAcA,EAAaiB,cAC3BC,sBAAuB,IAClBH,EACHF,aAAcE,EAAWF,aAAaM,MAAM,OAGhD,OAAwB,MAApBb,EACK/R,EAAI6L,KAAKgH,eAAeJ,GAExBzS,EAAI6L,KAAKiH,eAAeL,EAChC,GAEH,CACE3H,UAAW,CAAC1B,EAAM6C,KAChB+F,EAAU5I,GACV0I,GAAW,GACXhH,GAAaA,EAAU1B,EAAM6C,EAAK,EAEpClB,UACAgI,UAAW,CAAC3J,EAAMzB,EAAOsE,KACvB2F,GAAW,GAjCXK,EAAMe,SACRC,aAAahB,EAAMe,SAGrBf,EAAMe,QAAUE,YAAW,KACzBpB,GAAW,EAAM,GAChB,KA6BM1I,IACEzB,IAASA,GAAOuE,QAAQxF,SAAS,wBAEpCsL,EAAU,CACRG,QAASlG,EAAKkG,QACdC,SAAUnG,EAAKmG,SACfC,UAAWpG,EAAKoG,UAChBC,aAAcrG,EAAKqG,aAAaM,MAAM,QAG1Cd,GAAW,GACXhH,GAAaA,EAAU1B,EAAM6C,GAC9B,IAWP,OANA1M,EAAMoO,WAAU,SAOdpO,EAACE,cAAAoE,EAAM,CAAA6G,IAAK,EAAGyI,SAAS,YACtB5T,EAAAE,cAACkF,EAAU,CAACyC,MAAM,MAAwB,UACzCuK,EACDpS,EAAAE,cAACkF,EAAU,CAACyC,MAAM,MAAwB,UAC1C7H,EAAAE,cAACyI,GAAU,CACTC,SAAUA,EACVC,WAAW,SACXC,WAAYA,EACZE,QAASA,EACTC,eACEjJ,EAACE,cAAA4M,EACC,CAAAlI,MAAM,UACNX,GAAI,CACF4P,QAASvB,EAAU,EAAI,EACvBwB,WAAY,gBACZ5Q,OAAQ,UAEVkM,eAAgBpP,EAACE,cAAA6T,EAAsB,OAEvC/T,EAAAE,cAACkF,EAAU,CAAC4O,UAAU,SAASrP,SAAS,MAE3B,uBAMzB,CClLA,SAASsP,IAAYC,YAAEA,IACrB,MAAOC,EAAQC,GAAapU,EAAMsL,UAAS,GAErCoH,EAAQ1S,EAAM2S,SAYpB,OAXA3S,EAAMoO,WAAU,KACVsE,EAAMe,SACRC,aAAahB,EAAMe,SAErBf,EAAMe,QAAUE,YAAW,KACzBS,GAAU,EAAM,GACf,KAAK,GAIP,CAACD,IAEFnU,EAACE,cAAAoE,EAAM,CAAA6G,IAAK,GACVnL,EAAAE,cAACkF,EAAU,gFACgE,IACzEpF,EAAAE,cAAC2D,EAAG,CAACC,UAAU,OAAOG,GAAI,CAAES,WAAY,cAElC,yBAAC,IAEI,mDACb1E,EAAAE,cAAC8K,EACC,CAAA+D,QAASpD,UACHuI,UACIG,UAAUC,UAAUC,UAAUL,GACpCE,GAAU,GACX,EAEHnQ,GAAKpE,IAAkB,CACrB2U,MAAO,CACLhM,OAAQ,WAEViM,KAAM,CACJjM,OAAQ,WAEV,cAAe,CACb,eAAgB3I,EAAM6U,QAAQC,QAAQ,QAG1CjT,MAAOwS,EACPU,UAAU,EACVnK,aACEzK,EAACE,cAAAoI,EAAQ,CAAAC,MAAM,0BACbvI,EAACE,cAAA2D,GACC+P,SAAS,WACT3Q,MAAOkR,EAAS,OAAS,OACzBjR,OAAO,QAEPlD,EAAAE,cAAC2D,EAAG,CACF+P,SAAS,WACTiB,IAAI,IACJC,KAAK,IACL7Q,GAAI,CACF4P,QAASM,EAAS,EAAI,EACtBL,WAAY,kBAGd9T,EAACE,cAAA6U,SAEH/U,EAAAE,cAAC2D,EAAG,CACF+P,SAAS,WACTiB,IAAI,IACJC,KAAK,IACL7Q,GAAI,CAAE4P,QAAUM,EAAa,EAAJ,EAAOL,WAAY,kBAE5C9T,EAACE,cAAAoE,GAAMC,UAAU,MAAM4G,IAAK,GAC1BnL,EAAAE,cAAC6T,EAAsB,MACvB/T,EAAAE,cAACkF,EAAU,CAACR,MAAM,WAAS,iBAS7C,CAEwB,SAAAoQ,GAAK9T,GAC3B,MAAMgT,YAAEA,EAAWe,UAAEA,KAAcvN,GAAcxG,EACjD,IAAK+T,EACH,OAAO,KAET,MAAMhD,EAASgD,GAAWC,MAAMzT,GAAmC,SAAtBA,EAASA,WACtD,OACEzB,EAACE,cAAA8R,GACK,IAAAtK,EACJuK,OAAQA,EACRC,aAAa,OACbE,mBAAoBpS,EAAAE,cAAC+T,GAAW,CAACC,YAAaA,KAGpD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@niledatabase/react",
3
- "version": "2.2.0",
3
+ "version": "2.2.1-alpha.0",
4
4
  "license": "MIT",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/react.esm.js",
@@ -65,6 +65,7 @@
65
65
  "@storybook/blocks": "^8.0.0",
66
66
  "@storybook/react": "^8.0.0",
67
67
  "@storybook/react-webpack5": "^8.0.0",
68
+ "@storybook/test": "^8.0.0",
68
69
  "@storybook/theming": "^8.0.4",
69
70
  "@svgr/rollup": "^8.1.0",
70
71
  "@svgr/webpack": "^8.1.0",
@@ -76,6 +77,7 @@
76
77
  "@typescript-eslint/parser": "^6.12.0",
77
78
  "babel-jest": "29.7.0",
78
79
  "babel-loader": "^9.1.3",
80
+ "dts-cli": "^2.0.3",
79
81
  "eslint": "^8.54.0",
80
82
  "eslint-config-prettier": "^9.0.0",
81
83
  "eslint-config-react-app": "^7.0.1",
@@ -98,19 +100,14 @@
98
100
  "@mui/icons-material": "^5.14.18",
99
101
  "@mui/joy": "5.0.0-beta.15",
100
102
  "@mui/material": "5.14.18",
101
- "@mui/utils": "^5.15.14",
102
103
  "@mui/x-data-grid": "^7.0.0",
103
- "@mui/x-date-pickers": "^7.0.0",
104
- "@niledatabase/browser": "^2.2.0",
105
- "@storybook/test": "^8.0.0",
104
+ "@niledatabase/browser": "^2.2.1-alpha.0",
106
105
  "@tanstack/react-query": "^4.36.1",
107
- "dts-cli": "^2.0.3",
108
106
  "lodash": "^4.17.21",
109
107
  "react": "^18.2.0",
110
- "react-chartjs-2": "^5.2.0",
111
108
  "react-dom": "^18.2.0",
112
109
  "react-hook-form": "^7.48.2",
113
110
  "react-is": "^18.2.0"
114
111
  },
115
- "gitHead": "f3fcc2426219615bce80991e40f9cdf4a2cdcee9"
112
+ "gitHead": "4402b71199352fc1ab429da1b0b85e60e5ecdc58"
116
113
  }
@@ -1,2 +0,0 @@
1
- declare const mergedTheme: import("@mui/joy/styles").Theme;
2
- export default mergedTheme;