@niledatabase/react 2.2.0-alpha.0 → 2.2.0-alpha.2
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/context/index.d.ts +2 -2
- package/dist/context/types.d.ts +3 -3
- package/dist/react.cjs.development.js +1 -1
- package/dist/react.cjs.development.js.map +1 -1
- package/dist/react.cjs.production.min.js +1 -1
- package/dist/react.cjs.production.min.js.map +1 -1
- package/dist/react.esm.js +1 -1
- package/dist/react.esm.js.map +1 -1
- package/package.json +3 -13
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: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??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 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};
|
|
2
2
|
//# sourceMappingURL=react.esm.js.map
|
package/dist/react.esm.js.map
CHANGED
|
@@ -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 BrowserApi, { Client } 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: BrowserApi({\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 BrowserApi({\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 = (): Client => {\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","BrowserApi","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/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":"67CAKA,MAAMA,EAAU,CACdC,QAAS,CACP,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACPC,WAAY,4DACZC,UAAW,6DACXC,gBAAiB,+BACjBC,mBAAoB,+BACpBC,aACE,0FACFC,gBACE,8FAEJC,QAAS,CACPD,gBACE,6FACFE,OAAQ,oBAGVC,OAAQ,CACN,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,WAETC,KAAM,CACJ,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,WAETC,QAAS,UACTC,KAAM,CACJZ,QAAS,UACTa,SAAU,2BAEZC,WAAY,CACVC,QAAS,OACTC,KAAM,OACNC,QAAS,QAEXC,UAAW,CACTC,OAAQ,UAIJC,kBAAmBC,KAAgBC,GAAaC,EAAe,CACrEC,aAAc,OACdC,aAAc,CACZC,KAAM,CACJ3B,QAAS,CACPC,QAAS,CACP2B,KAAM,iBAORP,kBAAmBQ,MAAgBC,IAAaC,EAAe,CACrEN,aAAc,OACdO,WAAY,CACVC,SAAU,CACRC,eAAgB,CACdC,MAAO,CACL,YAAa,CAAEC,MAAO,mCACtB,gBAAiB,CACfC,QAAS,IAEXD,MAAO,YAKfV,aAAc,CACZC,KAAM,CAAE3B,WACRsC,MAAO,CAAEtC,cAGPuC,GAAc,IACfhB,KACAO,GACHJ,aAAcc,EAAUjB,EAASG,aAAcI,GAASJ,cACxDe,WAAY,IACPlB,EAASkB,cACTX,GAASW,aCtGQ,SAAAC,IAAOC,MAC7BA,EAAKC,SACLA,IAKA,OACEC,EAAAC,cAACC,EAAkB,CAACJ,MAAOA,GAASK,GAAcC,YAAY,QAC5DJ,EAACC,cAAAI,EAAY,CAAAC,mBAAoB,IAChCP,EAGP,CD6FAL,GAAYa,gBAAmBC,IAAiB,CAC9CC,IAAK,IACA/B,EAAS6B,gBAAgBC,GAAaC,OACtCxB,GAASsB,gBAAgBC,GAAaC,KAG3CC,KAAMf,EACJjB,EAAS6B,gBAAgBC,GAAaE,KACtCzB,GAASsB,gBAAgBC,GAAaE,QAI1ChB,GAAYlB,kBAAoB,IAC3BC,KACAO,IExHL,MAAM2B,GAAc,IAAIC,EAUlBC,GAAUC,EARoB,CAClCC,IAAK,IAAIC,EAAQ,CACfC,SAAU,0BACVC,YAAa,YAEfD,SAAU,MAKNE,SAAEA,IAAaN,GAERO,GAAoB,EAC/BrB,cAKEC,EAACC,cAAAoB,EAAoB,CAAAC,OAAQX,IAAcZ,GAIlCwB,GAAgBC,IAC3B,MAAMzB,SACJA,EAAQD,MACRA,EAAK2B,SACLA,EAAQC,cACRA,EAAgBN,GAAiBH,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,OACEzB,gBAAC0B,EAAa,KACZ1B,EAAAC,cAAC6B,GAAa,CAAChC,MAAOA,GACpBE,EAACC,cAAAkB,GAAS,CAAAY,MAAOJ,GAAS5B,IAG9B,EAGEiC,GAAiB,IACdC,EAAWpB,IAGPqB,GAAgB,KAC3B,MAAMjB,SAAEA,EAAQQ,SAAEA,GAAaO,KAC/B,OAAOJ,GACL,KAAO,CACLH,WACAR,cAEF,CAACA,EAAUQ,GACZ,EAGUU,GAAS,IACbH,KAAiBjB,IChF1B,IAAIqB,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,SAAmB5B,GACjC,OAAoBxB,EAAMC,cAAc,MAAOoC,GAAS,CACtDgB,MAAO,6BACPC,MAAO,GACPC,OAAQ,IACP/B,GAAQY,KAAOA,GAAkBpC,EAAMC,cAAc,IAAK,CAC3DuD,SAAU,WACIxD,EAAMC,cAAc,OAAQ,CAC1CwD,KAAM,UACNC,EAAG,iIACY1D,EAAMC,cAAc,OAAQ,CAC3CwD,KAAM,UACNC,EAAG,mHACY1D,EAAMC,cAAc,OAAQ,CAC3CwD,KAAM,UACNC,EAAG,0GACY1D,EAAMC,cAAc,OAAQ,CAC3CwD,KAAM,UACNC,EAAG,+HACY1D,EAAMC,cAAc,OAAQ,CAC3CwD,KAAM,OACNC,EAAG,oBAEP,ECNwB,SAAAC,GAAgBnC,GAKtC,MAAMoC,WAAEA,EAAUC,cAAEA,GAAkBrC,GAChCP,SAAEA,GAAaiB,KAEf4B,EAAc,GAAG7C,eADC8C,mBAAmBH,GAAc,8BAEnDI,EAAQH,EACV,cAAgBE,mBAAmBF,GACnC,GACEI,GAAQzC,GAAOyC,MAAQH,GAAeE,EAC5C,OACEhE,EAACC,cAAAiE,EACC,CAAAC,UAAU,IACVF,KAAMA,EACNG,QAAQ,OACRC,KAAM,EACNC,GAAI,CAAEC,eAAgB,SAEtBvE,EAAAC,cAACiE,EAAG,KACFlE,EAAAC,cAACuE,EACC,CAAAF,GAAI,CAAEG,QAAS,EAAGC,cAAe,UAAWL,KAAM,gBACvC,sBAEXrE,EAACC,cAAA0E,GACCC,UAAU,MACVC,WAAW,SACXC,EAAG,EACHT,KAAM,EACNU,WAAW,qBACXC,SAAS,OACTZ,QAAQ,cACR7E,MAAM,oBACN0F,UAAU,oEACVC,aAAa,MACb3G,OAAO,wBACP4G,WAAW,MACXb,GAAI,CACFc,gBAAiB,qBAGnBpF,EAAAC,cAACiE,EACC,CAAAO,QAAQ,OACRL,QAAQ,OACR7F,OAAO,8BACP2G,aAAa,MACbZ,GAAI,CACFpG,WAAY,uBAGd8B,EAAAC,cAACoF,GAAU,CAAA,cAAa,UAE1BrF,EAACC,cAAAiE,GAAIO,QAAQ,OAAOJ,KAAM,GACxBrE,EAAAC,cAACqF,EAAU,CACThB,GAAI,CAAE/E,MAAO,SACb4F,WAAY,IACZJ,WAAW,qBACXC,SAAS,OACTzB,OAAO,QAGI,4BAO3B,CCxEwB,SAAAgC,GAAW/D,GACjC,MAAMgE,QAAEA,EAAOC,UAAEA,EAASrB,QAAEA,EAAOsB,WAAEA,GAAelE,GAC9CmE,MAAEA,EAAKC,QAAEA,GAAYC,IACrBC,EAAcH,EAAMF,EAAUM,MAC9BC,EAAgD,CAAA,EAItD,OAHIN,IACFM,EAAWzG,MAAQ,UAGnBS,EAAAC,cAACgG,EAAU,CACTF,KAAMN,EAAUM,KAChBG,MAAO,CAAEC,SAAUC,QAAQX,EAAUU,WACrCP,QAASA,EACTS,OAAQ,EAAGC,WAEPtG,gBAAC2E,EAAK,KACJ3E,EAAAC,cAACsG,EAAS,CAACC,QAAS,GAAGF,EAAMP,QAAS3B,EAAQqC,OAC9CzG,EAACC,cAAAiE,EACC,CAAAwC,KAAK,QACY,kBAAAjB,EAAUM,KAC3BzB,GAAI,CACFY,aAAc,uBACdJ,EAAG,GACHvG,OAAQmH,EACJ,qDACA,SAGN1F,EAACC,cAAA0G,GACCC,YAAY,aACZC,MACA,EAAAvC,GAAI,CACF,aAAc,QAGfkB,EAAQsB,KAAKC,IACZf,EAAWgB,GAAKnF,OAAOkF,EAAKhF,OAE1B/B,EAAAC,cAACgH,EAAQ,CAACnE,IAAK,GAAGiE,EAAKhF,SAASgF,EAAKN,SACnCzG,EAACC,cAAAiH,GACCC,QAAS3B,EAAQ5C,OAAS,KACtBoD,EACJoB,QAAStB,EAAYuB,SAASN,EAAKhF,OACnCuF,YAAa9B,EAAQ5C,OAAS,EAC9B2E,QAAQ,OACRd,MAAOM,EAAKN,MACZe,SAAWC,IACT,GAAIhC,EAAUiC,cACZ,GAAID,EAAMhF,OAAO2E,QACVtB,EAGHQ,EAAMkB,SAAS1B,EAAY6B,OAAOZ,EAAKhF,QAFvCuE,EAAMkB,SAAS,CAACT,EAAKhF,YAIlB,CACL,MAAM6F,EAAY9B,EAAY+B,QAC3BC,GAAyBA,IAAQf,EAAKhF,QAErC6F,EAAUhF,OAAS,EACrB0D,EAAMkB,SAASI,GAEftB,EAAMkB,SAAS,GAElB,MAEGC,EAAMhF,OAAO2E,QACfd,EAAMkB,SAAST,EAAKhF,OAEpBuE,EAAMkB,SAAS,GAElB,UAQfxH,EAAAC,cAACqF,EACC,CAAAhB,GAAI,CAAE/E,MAAO,iCACbwI,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,CAACvG,OAAO4D,EAAU2C,eAGtB3C,EAAU2C,cAAgB,GAGnC,SAASC,GAAO7G,GACd,MAAM8G,MAAEA,EAAKC,KAAEA,GAAS/G,EACxB,OAAI8G,EAEAtI,EAACC,cAAAuI,GAAQC,MAAOH,EAAO/I,MAAM,SAAS+E,GAAI,CAAEoE,OAAQ,YAClD1I,EAAAC,cAACsG,EAAS,KACPgC,EAAK9B,OAAS8B,EAAKxC,KACpB/F,EAACC,cAAA0I,GAAMrE,GAAI,CAAEsE,GAAI,GAAK,eAAgB,WAAa5D,SAAS,YAK7DhF,EAAAC,cAACsG,EAAS,KAAEgC,EAAK9B,OAAS8B,EAAKxC,KACxC,CACwB,SAAA8C,GAAWrH,GASjC,MAAMsH,SACJA,EAAQC,WACRA,EAAUC,WACVA,EAAUC,aACVA,EAAYC,QACZA,EAAOC,eACPA,GACE3H,EAEE4H,EAAgBpJ,EAAM4B,SAC1B,IACEoH,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,EAAW7J,EAAM8J,aAEpBC,IACCjB,EAASkB,OAAOD,EAAK,GAEvB,CAACjB,IAGH,OACE9I,EAAAC,cAACgK,EAAY,IAAKV,GAChBvJ,EAAAC,cAAC0E,EAAK,CACJR,UAAU,OAEV0F,SAAUH,GAAcK,GAASF,EAASE,KAC1CG,QAAS,GAERlB,EAAWlC,KAAKyB,IACf,MAAM4B,EAA2B,CAAA,EAC3B/F,EAAwB,CAC5BtB,IAAKyF,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,OACExK,EAACC,cAAAwK,EACC,CAAA3H,IAAKsB,EAAQtB,IACbkE,GAAI5C,EAAQ4C,GACZJ,YAAY,aACZtC,GAAI,CAAEO,WAAY,WAElB7E,EAAAC,cAACiE,EAAG,KACFlE,EAACC,cAAAoI,IAAOC,MAAOA,EAAOC,KAAMA,IAC5BvI,EAAAC,cAACyK,EAAc,CAAC1D,GAAI,GAAGuB,EAAKxC,oBACzBL,IAGL1F,EAAAC,cAACgG,EAAU,CACTL,QAASA,EACTM,MAAO,CAAEC,SAAUC,QAAQmC,EAAKpC,WAChCJ,KAAMwC,EAAKxC,KACXM,OAAQ,EAAGC,YACT,MAAM/G,EAA8B,CAAA,EAIpC,OAHIqK,EAAOrB,EAAKxC,QACdxG,EAAMA,MAAQ,UAGdS,EAAAC,cAACuK,EAAM,CACLxD,GAAI,gBAAgBuB,EAAKxC,UACrBxG,KACA+G,EACJc,QAAShB,QAAQE,EAAMvE,OACvByF,SAAWC,IACTnB,EAAMkB,SAASC,EAAMhF,OAAO2E,QAAQ,EAEtC7H,MAAO+G,EAAMvE,MAAQ,UAAY,UACjC4I,aACErE,EAAMvE,MAAQyD,EAAQ,GAAGiB,MAAQjB,EAAQ,GAAGiB,MAE9CnC,GAAI,CACF,qBAAsB,SAG1B,KAKZ,KAAK0D,GAAcd,SACjB,OACElH,EAACC,cAAAsF,GACC,CAAAzC,IAAKsB,EAAQtB,IACb2C,UAAW8C,EACXnE,QAASA,EACToB,QAASA,EACTE,WAAYA,IAGlB,KAAKsC,GAAc4C,OACjB,OACE5K,EAAAC,cAACwK,EAAW,CAAC3H,IAAKsB,EAAQtB,IAAKkE,GAAI5C,EAAQ4C,IACzChH,EAACC,cAAAoI,IAAOC,MAAOA,EAAOC,KAAMA,IAC5BvI,EAAAC,cAACgG,EAAU,CACTL,QAASA,EACTM,MAAO,CAAEC,SAAUC,QAAQmC,EAAKpC,WAChCJ,KAAMwC,EAAKxC,KACXM,OAAQ,EAAGC,YACT,MAAM/G,EAA8B,CAAA,EAChCqK,EAAOrB,EAAKxC,QACdxG,EAAMA,MAAQ,UAEhB,MAAMwC,EAAQF,OAAOyE,EAAMvE,OAC3B,OACE/B,gBAAC2E,EAAK,KACJ3E,EAAAC,cAAC2K,EAAM,CACL5D,GAAI,gBAAgBuB,EAAKxC,OACzBqE,YAAa,GAAGhG,EAAQgG,oBACpB7K,KACA+G,EACJvE,MAAOA,EACPyF,SAAU,CAACqD,EAAGC,KACZxE,EAAMkB,SAASsD,EAAS,GAGzBtF,EAAQsB,KAAKiE,GAEV/K,EAACC,cAAA+K,EACC,CAAAlI,IAAKjB,OAAOkJ,EAAOhJ,OAAS,IAC5BA,MAAOgJ,EAAOhJ,OAEbgJ,EAAOtE,UAKhBzG,EAAAC,cAACyK,EAAc,CAAC1D,GAAI,GAAGuB,EAAKxC,oBACzBL,GAGL,KAKZ,KAAKsC,GAAciD,SACjB,OACEjL,EAAAC,cAACwK,EAAW,CAAC3H,IAAKsB,EAAQtB,IAAKkE,GAAI5C,EAAQ4C,IACzChH,EAACC,cAAAoI,IAAOC,MAAOA,EAAOC,KAAMA,IAC5BvI,EAAAC,cAACiL,EACK,IAAA9G,KACAqF,EAASlB,EAAKxC,KAAMoE,GACxBI,KAAMvC,GAAciD,WAEtBjL,EAAAC,cAACyK,EAAc,CAAC1D,GAAI,GAAGuB,EAAKxC,oBACzBL,IAIT,KAAKsC,GAAcmD,OACjB,OACEnL,EAAAC,cAACwK,EAAW,CAAC3H,IAAKsB,EAAQtB,IAAKkE,GAAI5C,EAAQ4C,IACzChH,EAACC,cAAAoI,IAAOC,MAAOA,EAAOC,KAAMA,IAC5BvI,EAAAC,cAACiL,EACK,IAAA9G,KACAqF,EAASlB,EAAKxC,KAAMoE,GACxBI,KAAMvC,GAAcmD,SAEtBnL,EAAAC,cAACyK,EAAc,CAAC1D,GAAI,GAAGuB,EAAKxC,oBACzBL,IAKT,KAAKsC,GAAcoD,KACnB,QACE,OACEpL,EAAAC,cAACwK,EAAW,CAAC3H,IAAKsB,EAAQtB,IAAKkE,GAAI5C,EAAQ4C,IACzChH,EAACC,cAAAoI,IAAOC,MAAOA,EAAOC,KAAMA,IAC5BvI,EAAAC,cAACiL,EAAK,IAAK9G,KAAaqF,EAASlB,EAAKxC,KAAMoE,KAC5CnK,EAAAC,cAACyK,EAAc,CAAC1D,GAAI,GAAGuB,EAAKxC,oBACzBL,IAIV,IAEFuD,EACCjJ,EAACC,cAAA0E,EAAM,CAAAuF,QAAS,EAAGtF,UAAU,OAC1BqE,EACDjJ,EAAAC,cAACiE,EAAG,KACFlE,EAAAC,cAACuE,EAAO,CAAA+F,KAAK,UAAUxB,KAI3B/I,gBAACkE,EAAG,KACFlE,EAACC,cAAA0E,GAAMC,UAAU,MAAMyG,IAAK,GAC1BrL,EAACC,cAAAuE,EAAO,CAAA+F,KAAK,SAASrB,QAASA,GAC5BH,GAEFI,KAOf,CC1RwB,SAAAmC,GAAW9J,GACjC,MAAO8G,EAAOiD,GAAYvL,EAAMwL,YAC1BzC,WACJA,EAAa,UAAS0C,UACtBA,EAASC,QACTA,EAAO1C,WACPA,EAAU2C,aACVA,GACEnK,EACET,EAAMoB,KACN2G,EAAW8C,GACfC,MAAOC,IACLP,OAASQ,GACT,MACMhC,GADe4B,GAAgBA,EAAaG,KACrBA,GACvBE,MAAEA,EAAKC,SAAEA,EAAQC,cAAEA,EAAaC,UAAEA,KAAcC,GAAarC,EAKnE,OAJIzH,OAAO+J,KAAKD,GAAUxJ,OAAS,GAEjC0J,QAAQC,KAAK,0CAERxL,EAAIyL,KAAKC,OAAO,CACrBC,cAAe,CAAEV,QAAOC,WAAUC,gBAAeC,cACjD,GAEJ,CACEV,YACAC,QAAS,CAACiB,EAAUjM,KAClB6K,EAASoB,EAAEC,SACXlB,GAAWA,EAAQiB,EAAYjM,EAAK,IAKpCmM,EAAqB7M,EAAM4B,SAAQ,KACvC,MAAMkL,EAA8B,CAClC,CACE/G,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,EAAWpG,OAAS,EAC7BkK,EAAenF,OAAOqB,GAExB8D,CAAc,GACpB,CAAC9D,IAEJ,OACEhJ,EAACC,cAAA0E,EAAM,CAAA0G,IAAK,GACT/C,EAAQtI,EAAAC,cAAC8M,EAAM,CAAAxN,MAAM,UAAU+I,GAAiB,KACjDtI,EAAAC,cAAC+M,GACC,CAAAlE,SAAUA,EACVC,WAAYA,EACZC,WAAY6D,IAIpB,CCjEwB,SAAAI,GAAUzL,GAChC,MAAO8G,EAAOiD,GAAYvL,EAAMwL,YAC1BxC,WAAEA,EAAUyC,UAAEA,EAASC,QAAEA,EAAOC,aAAEA,GAAiBnK,EACnDT,EAAMoB,KAEN2G,EAAW8C,GACfC,MAAOC,IACLP,OAASQ,GACT,MACMhC,GADe4B,GAAgBA,EAAaG,KACrBA,EAC7B,aAAa/K,EAAIyL,KAAKU,MAAM,CAC1BC,aAAcpD,GACd,GAEJ,CACE0B,YACAC,YAIEmB,EAAqB7M,EAAM4B,SAAQ,KACvC,MAAMkL,EAA8B,CAClC,CACE/G,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,EAAWpG,OAAS,EAC7BkK,EAAenF,OAAOqB,GAExB8D,CAAc,GACpB,CAAC9D,IAEJ,OACEhJ,EAACC,cAAA0E,EAAM,CAAA0G,IAAK,GACT/C,EAAQtI,EAAAC,cAAC8M,EAAM,CAAAxN,MAAM,UAAU+I,GAAiB,KACjDtI,EAAAC,cAAC4I,GACC,CAAAC,SAAUA,EACVC,WAAW,SACXC,WAAY6D,IAIpB,CCvDwB,SAAAO,GACtB5L,GAMA,MAAMwH,WACJA,EAAUyC,UACVA,EAASC,QACTA,EAAOC,aACPA,EAAY0B,eACZA,EAAiB,OAAMC,gBACvBA,EAAkB,SAAQC,WAC1BA,GAAa,GACX/L,EACET,EAAMoB,MACL4G,EAAYyE,GAAiBxN,EAAMwL,SACxC+B,EAAaD,EAAkBD,GAG3BvE,EAAW8C,GACfC,MAAOC,IACL,MACM/B,GADe4B,GAAgBA,EAAaG,KACrBA,EAC7B,aAAa/K,EAAIyL,KAAKU,MAAM,CAC1BC,aAAc,CAAEnB,MAAOjC,EAAKiC,MAAOC,SAAUlC,EAAKkC,UAClDwB,KAAMF,GACN,GAEJ,CACE9B,UAAW,CAACiC,EAAO3D,KACb2D,IACEA,GAAOC,YACTC,OAAOC,SAAS5J,KAAOyJ,EAAMC,YACpB5E,IAAeuE,EACxBE,EAAcF,GAEd7B,GAAaA,EAAUiC,EAAO3D,GAEjC,EAEH2B,QAAS,CAACpD,EAAOyB,KAEXhB,IAAeuE,EACjB5B,GAAWA,EAAQpD,EAAgByB,GAEnCyD,EAAcF,EACf,IAKDT,EAAqB7M,EAAM4B,SAAQ,KACvC,MAAMkL,EAA8B,CAClC,CACE/G,KAAM,QACNU,MAAO,QACP8D,KAAMvC,GAAcoD,KACpBhD,aAAc,GACdjC,UAAU,IAYd,OATI4C,IAAeuE,GACjBR,EAAegB,KAAK,CAClB/H,KAAM,WACNU,MAAO,WACP8D,KAAMvC,GAAciD,SACpB7C,aAAc,GACdjC,UAAU,IAGV6C,GAAcA,EAAWpG,OAAS,EAC7BkK,EAAenF,OAAOqB,GAExB8D,CAAc,GACpB,CAAC9D,EAAYD,EAAYuE,IAE5B,OACEtN,EAACC,cAAA4I,GACC,CAAAC,SAAUA,EACVC,WAAYA,EACZC,WAAY6D,GAGlB,CCxEwB,SAAAkB,GAAQvM,GAC9B,MAAMwM,KAAEA,EAAIC,QAAEA,EAAOC,QAAEA,GAAY1M,GAC7BC,SAAEA,GAAaS,KACfnB,EAAMoB,MACLgM,EAAWC,GAAgBpO,EAAMwL,YAClC7F,MAAEA,EAAK8D,SAAEA,EAAQC,aAAEA,GAAiBF,IACpCwC,EAAQrG,EAAM,SAEpB3F,EAAMqO,WAAU,KACG,MAAbF,GACFC,GACD,GAGA,CAACpC,IAEJ,MAAMlD,EAAW8C,GACd7B,GACChJ,EAAIuN,MAAMC,iBAAiB,CACzB7B,cAAe3C,EACftI,SAAUI,OAAOJ,MAErB,CACE,SAAAgK,CAAU1B,GACRmE,GAAWA,EAAQnE,GACnBkE,GAAQ,EACT,EACD,OAAAvC,CAAQiB,GACFA,aAAahE,OACfyF,EAAazB,EAAEC,QAElB,IAIC4B,EAAexO,EAAM8J,aACzB+B,MAAO9B,IACLqE,EAAa,IACbtF,EAASkB,OAAOD,EAAK,GAEvB,CAACjB,IAGH,OACE9I,EAACC,cAAAwO,EAAM,CAAAT,KAAMA,GACXhO,EAAAC,cAACyO,EAAW,KACV1O,EAAAC,cAAC0E,EAAK,CAACuF,QAAS,GACdlK,EAAAC,cAACqF,EAAU,CAACyC,MAAM,MAA6B,eAC/C/H,EACGC,cAAAD,EAAA2O,SAAA,KAAAR,GAAanO,EAAAC,cAACqF,EAAU,CAAC/F,MAAM,UAAU4O,IAE5CnO,EAAAC,cAAC0E,EACC,CAAAR,UAAU,OACVG,GAAI,CACFhB,MAAO,QAET4G,QAAS,EACTL,SAAUH,GAAcK,GACtByE,EAAazE,MAGf/J,EAACC,cAAAwK,EACC,CAAAnG,GAAI,CACF,yBAA0B,kCAG5BtE,EAAAC,cAACsG,EAAS,CAACC,QAAQ,SAAyB,SAC5CxG,EAAAC,cAACiL,EAAK,IACAzB,EAAS,SACbmF,WAAS,EACTC,KAAK,KACL7H,GAAG,QACHjB,KAAK,QACL+I,aAAa,gBACb3I,UACA,EAAAmC,MAAOlC,QAAQ+H,MAGnBnO,EAACC,cAAAwK,EACC,CAAAnG,GAAI,CACF,yBAA0B,kCAG5BtE,EAAAC,cAACsG,EAAS,CAACC,QAAQ,YAA+B,YAClDxG,EAACC,cAAAiL,EACK,IAAAzB,EAAS,YACbmF,WAAS,EACTC,KAAK,KACL7H,GAAG,WACH8H,aAAa,mBACbvE,KAAK,WACLpE,UAAQ,KAGZnG,EAAAC,cAAC0E,EAAM,CAAAC,UAAU,MAAMN,GAAI,CAAEyK,GAAI,GAAK7E,QAAS,GAC7ClK,EAAAC,cAACuE,EAAM,CAACwK,QAAS,IAAMf,GAAQ,GAAQ1G,QAAQ,SAEtC,UACTvH,EAAAC,cAACuE,EAAM,CAAC+F,KAAK,UAAQ,cAOnC,CClHwB,SAAA0E,GAAWzN,GACjC,MAAM0N,cAAEA,EAAanG,WAAEA,EAAUoG,oBAAEA,GAAwB3N,GACpDwM,EAAMC,GAAWzC,GAAS,GACjC,OAAK0D,EAKHlP,EAACC,cAAA0E,EAAM,CAAAE,WAAW,WAAWwG,IAAK,GAChCrL,EAAAC,cAACmP,GAAS,CAACpB,KAAMA,EAAMC,QAASA,EAASC,QAASiB,IAClDnP,EAACC,cAAAuE,EAAO,CAAA6K,eAAgBrP,EAAAC,cAACqP,EAAG,MAAKT,KAAK,KAAKG,QAAS,IAAMf,GAAQ,IAC/DlF,IAPE,IAWX,CClBA,MAAMwG,GAAkBC,GACflN,OAAO+J,KAAKmD,GAAMnG,QAAO,CAACoG,EAAkB3M,KACjD,MAAMgF,EAAO0H,EAAiB1M,GAQ9B,OAPIgF,aAAe4H,IACjBD,EAAQ3M,GAAOoF,MAAMyH,KAAK7H,GAAK8H,KAAK,MAC3B1H,MAAMC,QAAQL,GACvB2H,EAAQ3M,GAAOgF,EAAI8H,KAAK,MAExBH,EAAQ3M,GAAOgF,EAEV2H,CAAO,GACb,CAAE,GAGDI,GAAe,CACnB9F,EACA+F,EACAC,KAEA,IAAKhG,EACH,MAAO,CAAC,GAAI,IAEd,MAAMiG,EAAOjG,EAAKjD,IAAIyI,IAChBU,EAAS3N,OAAO+J,KAAK2D,EAAK,IAE1BE,EAA0C,CAAA,EAmB1CC,EAAOF,GAAQnJ,KAjBJsJ,IACf,MAAM9M,ECnCc,SACtB+M,EACAL,EACAM,GAeA,IAAIC,EACFD,GAAiBD,EACbC,EAAcE,YAAY3O,OAAOwO,IAAS/M,MAC1C,GAENiN,GAAmB,GAEnB,IAAIjN,EAAQiN,EAaZ,OAZAjN,EACE,GACAmN,KAAKC,KACHJ,EACIA,EAAcE,YAAYR,EAAK3G,QAzBd,CACvBsH,EAEAC,KAEA,IAAI7O,EAAQ6O,EAAQ/O,OAAOwO,IAK3B,OAJIQ,EAAO9O,IAAU+O,EAAY/O,MAC/BA,EAAQ,IAEVA,EAAQA,GAAOgP,WACRJ,EAAQ/N,OAASb,EAAMa,OAAS+N,EAAU5O,CAAK,GAeQ,KAAKuB,MAC7D,IAEJA,EAAQiN,IACVjN,EAAQiN,GAGVjN,GAAS,EACFA,CACT,CDJkB0N,CAAcZ,EAAKJ,EAAMF,GACjC/J,EAAOqK,EAAIa,QACjB,GAAIlB,EAAQ1I,SAAStB,GAOnB,OAL0B,MAAtBmK,EAAanK,GACfmK,EAAanK,GAAQA,EAAKnD,OAE1BsN,EAAanK,IAAS,EAEjB,CACLO,MAAOP,EAAKmL,OAAOhB,EAAanK,IAChCoL,WAAYpL,EAAKmL,OAAOhB,EAAanK,IACrCzC,QAEH,IAE+BuE,OAAOzB,UAAY,GAErD,MAAO,CAAC+J,EAAsBH,EAAK,EAGvB,SAAUoB,GACtBrH,EACAgG,GAEA,MAAMD,EE9DM,WACZ,MAAOA,EAAKuB,GAAU7F,IAStB,OARA6C,GAAU,KACR,MACMiC,EADSgB,SAASrR,cAAc,UACTsR,WAAW,MACpCjB,IACFA,EAAckB,KAAO,cACrBH,EAAOf,GACR,GACA,IACIR,CACT,CFmDc2B,IACLtB,EAAMH,GAAQpO,GACnB,IAAMiO,GAAa9F,EAAM+F,EAAKC,IAC9B,CAAChG,EAAM+F,EAAKC,IAEd,MAAO,CAACI,EAAMH,EAChB,CG9CwB,SAAA0B,GAASlQ,GAC/B,MAAMuI,KACJA,EAAImF,cACJA,GAAgB,EAAInG,WACpBA,EAAa,aAAYoG,oBACzBA,EAAmBwC,MACnBA,EAAK5B,QACLA,EAAU,CAAC,QAAS,iBAClBvO,EAEEoQ,EAAa,CACjBtO,MAAO,OACPC,OAAQ,UACJoO,GAAOE,UAAY,KAGlBC,EAAS9B,GAAQoB,GAAcrH,EAAMgG,GAC5C,OACE/P,EAACC,cAAA0E,EAAM,CAAAN,KAAM,GACXrE,EAAAC,cAACgP,GAAU,CACTC,cAAeA,EACfnG,WAAYA,EACZoG,oBAAqBA,IAEvBnP,EAACC,cAAA8R,GACCzN,GAAIsN,EACJ5B,KAAMA,EACN8B,QAASA,EACTE,YAAY,IAIpB,CCvCwB,SAAAC,GACtBzQ,GAMA,MAAM0Q,OACJA,EAAMC,aACNA,EAAY1G,UACZA,EAASC,QACTA,EAAO0G,UACPA,GAAY,EAAIC,mBAChBA,GACE7Q,EAEET,EAAMoB,MACL+G,EAASoJ,GAActS,EAAMwL,UAAS,IACtC+G,EAASC,GAAcxS,EAAMwL,UAAS,IACtCiH,EAAkBC,GAAa1S,EAAMwL,SAC1C0G,GAEIS,EAAQ3S,EAAM4S,SACd5J,EAAahJ,EAAM4B,SAAQ,KAC/B,MAAMoH,EAA0B,CAC9B,CACEjD,KAAM,UACNU,MAAO,oBACP8D,KAAMvC,GAAcwC,OACpBpC,cAA4C,IAA9BqK,GAAkBI,QAChCrN,QAAS,CACP,CACEiB,MAAO,WAET,CACEA,MAAO,aAGX4D,UAAW+H,GAEb,CACErM,KAAM,WACNU,MAAO,YACP8D,KAAMvC,GAAcoD,KACpBhD,aAAcqK,GAAkBK,UAAY,GAC5C3M,UAAU,EACVkE,UAAW+H,GAEb,CACErM,KAAM,YACNU,MAAO,aACP8D,KAAMvC,GAAcoD,KACpBhD,aAAcqK,GAAkBM,WAAa,GAC7CzI,SACE,4EACFnE,UAAU,EACVkE,UAAW+H,GAEb,CACErM,KAAM,eACNU,MAAO,gBACP8D,KAAMvC,GAAcoD,KACpBhD,aAAcqK,GAAkBO,cAAcpD,KAAK,OAAS,GAC5DzJ,UAAU,EACVmE,SACE,sEACFD,UAAW+H,IAaf,OAVKK,GAAkBK,UACrB9J,EAAWiK,OAAO,EAAG,EAAG,CACtBlN,KAAM,eACNU,MAAO,gBACP8D,KAAMvC,GAAciD,SACpB7C,aAAc,GACdjC,UAAU,EACVkE,UAAW+H,IAGRpJ,CAAU,GAChB,CACDoJ,EACAK,GAAkBK,SAClBL,GAAkBM,UAClBN,GAAkBO,aAClBP,GAAkBI,UAad/J,EAAW8C,GACdsH,IACCZ,GAAW,GACX,MAAMa,EAAU,CACdhB,aAAcA,EAAaiB,cAC3BC,sBAAuB,IAClBH,EACHF,aAAcE,EAAWF,aAAaM,MAAM,OAGhD,OAAwB,MAApBb,EACK1R,EAAIyL,KAAK+G,eAAeJ,GAExBpS,EAAIyL,KAAKgH,eAAeL,EAChC,GAEH,CACE1H,UAAW,CAAC1B,EAAMrJ,KAChBgS,EAAU3I,GACVyI,GAAW,GACX/G,GAAaA,EAAU1B,EAAMrJ,EAAK,EAEpCgL,UACA+H,UAAW,CAAC1J,EAAMzB,EAAO5H,KACvB4R,GAAW,GAjCXK,EAAMe,SACRC,aAAahB,EAAMe,SAGrBf,EAAMe,QAAUE,YAAW,KACzBpB,GAAW,EAAM,GAChB,KA6BMzI,IACEzB,IAASA,GAAOsE,QAAQvF,SAAS,wBAEpCqL,EAAU,CACRG,QAASnS,EAAKmS,QACdC,SAAUpS,EAAKoS,SACfC,UAAWrS,EAAKqS,UAChBC,aAActS,EAAKsS,aAAaM,MAAM,QAG1Cd,GAAW,GACX/G,GAAaA,EAAU1B,EAAMrJ,GAC9B,IAWP,OANAV,EAAMqO,WAAU,SAOdrO,EAACC,cAAA0E,EAAM,CAAA0G,IAAK,EAAGwI,SAAS,YACtB7T,EAAAC,cAACqF,EAAU,CAACyC,MAAM,MAAwB,UACzCsK,EACDrS,EAAAC,cAACqF,EAAU,CAACyC,MAAM,MAAwB,UAC1C/H,EAAAC,cAAC4I,GAAU,CACTC,SAAUA,EACVC,WAAW,SACXC,WAAYA,EACZE,QAASA,EACTC,eACEnJ,EAACC,cAAA8M,EACC,CAAAxN,MAAM,UACN+E,GAAI,CACF9E,QAAS+S,EAAU,EAAI,EACvBuB,WAAY,gBACZvQ,OAAQ,UAEV8L,eAAgBrP,EAACC,cAAA8T,EAAsB,OAEvC/T,EAAAC,cAACqF,EAAU,CAAC0O,UAAU,SAAShP,SAAS,MAE3B,uBAMzB,CClLA,SAASiP,IAAYC,YAAEA,IACrB,MAAOC,EAAQC,GAAapU,EAAMwL,UAAS,GAErCmH,EAAQ3S,EAAM4S,SAYpB,OAXA5S,EAAMqO,WAAU,KACVsE,EAAMe,SACRC,aAAahB,EAAMe,SAErBf,EAAMe,QAAUE,YAAW,KACzBQ,GAAU,EAAM,GACf,KAAK,GAIP,CAACD,IAEFnU,EAACC,cAAA0E,EAAM,CAAA0G,IAAK,GACVrL,EAAAC,cAACqF,EAAU,gFACgE,IACzEtF,EAAAC,cAACiE,EAAG,CAACC,UAAU,OAAOG,GAAI,CAAES,WAAY,cAElC,yBAAC,IAEI,mDACb/E,EAAAC,cAACiL,EACC,CAAA8D,QAASnD,UACHqI,UACIG,UAAUC,UAAUC,UAAUL,GACpCE,GAAU,GACX,EAEH9P,GAAKxE,IAAkB,CACrBR,MAAO,CACLoJ,OAAQ,WAEV8L,KAAM,CACJ9L,OAAQ,WAEV,cAAe,CACb,eAAgB5I,EAAM3C,QAAQC,QAAQ,QAG1C2E,MAAOmS,EACPO,UAAU,EACV9J,aACE3K,EAACC,cAAAuI,EAAQ,CAAAC,MAAM,0BACbzI,EAACC,cAAAiE,GACC2P,SAAS,WACTvQ,MAAO6Q,EAAS,OAAS,OACzB5Q,OAAO,QAEPvD,EAAAC,cAACiE,EAAG,CACF2P,SAAS,WACTa,IAAI,IACJC,KAAK,IACLrQ,GAAI,CACF9E,QAAS2U,EAAS,EAAI,EACtBL,WAAY,kBAGd9T,EAACC,cAAA2U,SAEH5U,EAAAC,cAACiE,EAAG,CACF2P,SAAS,WACTa,IAAI,IACJC,KAAK,IACLrQ,GAAI,CAAE9E,QAAU2U,EAAa,EAAJ,EAAOL,WAAY,kBAE5C9T,EAACC,cAAA0E,GAAMC,UAAU,MAAMyG,IAAK,GAC1BrL,EAAAC,cAAC8T,EAAsB,MACvB/T,EAAAC,cAACqF,EAAU,CAAC/F,MAAM,WAAS,iBAS7C,CAEwB,SAAAsV,GAAKrT,GAC3B,MAAM0S,YAAEA,EAAWY,UAAEA,KAAclN,GAAcpG,EACjD,IAAKsT,EACH,OAAO,KAET,MAAM5C,EAAS4C,GAAWC,MAAMC,GAAmC,SAAtBA,EAASA,WACtD,OACEhV,EAACC,cAAAgS,GACK,IAAArK,EACJsK,OAAQA,EACRC,aAAa,OACbE,mBAAoBrS,EAAAC,cAACgU,GAAW,CAACC,YAAaA,KAGpD"}
|
package/package.json
CHANGED
|
@@ -1,19 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@niledatabase/react",
|
|
3
|
-
"version": "2.2.0-alpha.
|
|
3
|
+
"version": "2.2.0-alpha.2",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"exports": {
|
|
6
|
-
".": {
|
|
7
|
-
"require": "./dist/index.js",
|
|
8
|
-
"default": "./dist/react.esm.js"
|
|
9
|
-
},
|
|
10
|
-
"./src": {
|
|
11
|
-
"default": "./src/index.ts"
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
5
|
"main": "./dist/index.js",
|
|
15
6
|
"module": "./dist/react.esm.js",
|
|
16
|
-
"types": "./dist/index.d.ts",
|
|
17
7
|
"files": [
|
|
18
8
|
"dist"
|
|
19
9
|
],
|
|
@@ -111,7 +101,7 @@
|
|
|
111
101
|
"@mui/utils": "^5.15.14",
|
|
112
102
|
"@mui/x-data-grid": "^7.0.0",
|
|
113
103
|
"@mui/x-date-pickers": "^7.0.0",
|
|
114
|
-
"@niledatabase/browser": "^2.2.0-alpha.
|
|
104
|
+
"@niledatabase/browser": "^2.2.0-alpha.2",
|
|
115
105
|
"@storybook/test": "^8.0.0",
|
|
116
106
|
"@tanstack/react-query": "^4.36.1",
|
|
117
107
|
"dts-cli": "^2.0.3",
|
|
@@ -122,5 +112,5 @@
|
|
|
122
112
|
"react-hook-form": "^7.48.2",
|
|
123
113
|
"react-is": "^18.2.0"
|
|
124
114
|
},
|
|
125
|
-
"gitHead": "
|
|
115
|
+
"gitHead": "740c3008828dfb70d13cf8b2a9f6ac63829251e1"
|
|
126
116
|
}
|