@vuu-ui/vuu-shell 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/index.js +2 -2
- package/cjs/index.js.map +4 -4
- package/esm/index.js +2 -2
- package/esm/index.js.map +4 -4
- package/index.css +1 -1
- package/index.css.map +3 -3
- package/package.json +4 -4
- package/types/index.d.ts +1 -0
- package/types/layout-config/index.d.ts +1 -0
- package/types/layout-config/local-config.d.ts +4 -0
- package/types/layout-config/remote-config.d.ts +4 -0
- package/types/layout-config/use-layout-config.d.ts +15 -0
- package/types/session-editing-form/SessionEditingForm.d.ts +25 -0
- package/types/session-editing-form/index.d.ts +1 -0
- package/types/shell.d.ts +4 -1
- package/types/shellTypes.d.ts +1 -0
- package/types/use-layout-config.d.ts +0 -2
package/cjs/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var _e=Object.create;var A=Object.defineProperty;var $e=Object.getOwnPropertyDescriptor;var Ge=Object.getOwnPropertyNames;var Je=Object.getPrototypeOf,ze=Object.prototype.hasOwnProperty;var Ye=(t,e)=>{for(var o in e)A(t,o,{get:e[o],enumerable:!0})},Q=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ge(e))!ze.call(t,n)&&n!==o&&A(t,n,{get:()=>e[n],enumerable:!(r=$e(e,n))||r.enumerable});return t};var y=(t,e,o)=>(o=t!=null?_e(Je(t)):{},Q(e||!t||!t.__esModule?A(o,"default",{value:t,enumerable:!0}):o,t)),qe=t=>Q(A({},"__esModule",{value:!0}),t);var pt={};Ye(pt,{ConnectionStatusIcon:()=>We,DEFAULT_DENSITY:()=>He,DEFAULT_THEME:()=>Ne,DEFAULT_THEME_MODE:()=>be,DensitySwitch:()=>Ze,Feature:()=>_,LoginPanel:()=>et,Shell:()=>ut,ShellContextProvider:()=>Y,ThemeContext:()=>W,ThemeProvider:()=>ke,ThemeSwitch:()=>q,getAuthDetailsFromCookies:()=>tt,logout:()=>J,redirectToLogin:()=>le,useShellContext:()=>nt});module.exports=qe(pt);var w=y(require("react")),X=y(require("classnames"));var P=require("react/jsx-runtime"),We=({connectionStatus:t,className:e,element:o="span",...r})=>{let[n,s]=(0,w.useState)("vuuConnectingStatus");(0,w.useEffect)(()=>{switch(t){case"connected":case"reconnected":s("vuuActiveStatus");break;case"connecting":s("vuuConnectingStatus");break;case"disconnected":s("vuuDisconnectedStatus");break;default:break}},[t]);let a=w.default.createElement(o,{...r,className:(0,X.default)("vuuStatus vuuIcon",n,e)});return(0,P.jsx)(P.Fragment,{children:(0,P.jsxs)("div",{className:"vuuStatus-container salt-theme",children:[a,(0,P.jsxs)("div",{className:"vuuStatus-text",children:["Status: ",t.toUpperCase()]})]})})};var Z=require("@heswell/salt-lab"),j=require("react"),ee=y(require("classnames")),te=require("react/jsx-runtime"),Ke="vuuDensitySwitch",Qe=["high","medium","low","touch"],Xe="high",Ze=({className:t,defaultDensity:e=Xe,onDensityChange:o})=>{let r=(0,j.useCallback)((s,a)=>{o(a)},[o]),n=(0,ee.default)(Ke,t);return(0,te.jsx)(Z.Dropdown,{className:n,source:Qe,defaultSelected:e,onSelectionChange:r})};var k=y(require("react")),se=require("@vuu-ui/vuu-layout");var oe=y(require("react")),M=require("react/jsx-runtime"),B=class extends oe.default.Component{constructor(e){super(e),this.state={errorMessage:null}}static getDerivedStateFromError(e){return{errorMessage:e.message}}componentDidCatch(e,o){console.log(e,o)}render(){return this.state.errorMessage?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)("h1",{children:"Something went wrong."}),(0,M.jsx)("p",{children:this.state.errorMessage})]}):this.props.children}};var ne=require("react/jsx-runtime"),re=()=>(0,ne.jsx)("div",{className:"hwLoader",children:"loading"});var b=require("react/jsx-runtime");function je({url:t,css:e,params:o,...r}){e&&import(e).then(s=>{document.adoptedStyleSheets=[...document.adoptedStyleSheets,s.default]});let n=k.default.lazy(()=>import(t));return(0,b.jsx)(B,{children:(0,b.jsx)(k.Suspense,{fallback:(0,b.jsx)(re,{}),children:(0,b.jsx)(n,{...r,...o})})})}var _=k.default.memo(je);_.displayName="Feature";(0,se.registerComponent)("Feature",_,"view");var $=require("react"),ie=require("@salt-ds/core"),D=require("@heswell/salt-lab");var x=require("react/jsx-runtime"),ae="vuuLoginPanel",et=({onSubmit:t})=>{let[e,o]=(0,$.useState)(""),[r,n]=(0,$.useState)(""),s=()=>{t(e,r)},a=(l,c)=>{o(c)},m=(l,c)=>{n(c)},i=e.trim()!==""&&r.trim()!=="";return(0,x.jsxs)("div",{className:ae,children:[(0,x.jsx)(D.FormField,{label:"Username",style:{width:200},children:(0,x.jsx)(D.Input,{value:e,id:"text-username",onChange:a})}),(0,x.jsx)(D.FormField,{label:"Password",style:{width:200},children:(0,x.jsx)(D.Input,{type:"password",value:r,id:"text-password",onChange:m})}),(0,x.jsx)(ie.Button,{className:`${ae}-login`,disabled:!i,onClick:s,variant:"cta",children:"Login"})]})};var G=require("@vuu-ui/vuu-utils"),tt=()=>{let t=(0,G.getCookieValue)("vuu-username"),e=(0,G.getCookieValue)("vuu-auth-token");return[t,e]},le=(t="login.html")=>{window.location.href=t},J=t=>{document.cookie="vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",document.cookie="vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",le(t)};var Ee=require("@vuu-ui/vuu-data"),we=y(require("classnames")),p=require("react");var V=require("react"),F=require("react/jsx-runtime"),ot={},z=(0,V.createContext)(ot),rt=({children:t,context:e,inheritedContext:o})=>{let r={...o,...e};return(0,F.jsx)(z.Provider,{value:r,children:t})},Y=({children:t,value:e})=>(0,F.jsx)(z.Consumer,{children:o=>(0,F.jsx)(rt,{context:e,inheritedContext:o,children:t})}),nt=()=>(0,V.useContext)(z);var T=require("react"),st=(t,e)=>{let[o,r]=(0,T.useState)(e),n=i=>{r(i)},s=(0,T.useCallback)(async(i="latest")=>{fetch(`api/vui/${t.username}/${i}`,{}).then(l=>l.ok?l.json():e).then(n).catch(()=>{n(e)})},[e,t.username]);(0,T.useEffect)(()=>{s()},[s]);let a=(0,T.useCallback)(i=>{fetch(`api/vui/${t.username}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(l=>l.ok?l.json():e)},[e,t]),m=(0,T.useCallback)(i=>{s(i)},[s]);return[o,a,m]},me=st;var u=require("@vuu-ui/vuu-layout");var Se=require("react");var ge=require("@salt-ds/core"),fe=require("@heswell/salt-lab"),ye=require("@salt-ds/icons");var ue=require("@vuu-ui/vuu-utils"),O=require("@heswell/salt-lab"),de=require("@salt-ds/core"),pe=require("@salt-ds/icons"),v=require("react");var ce=async t=>await fetch(`api/vui/${t.username}`,{}).then(o=>o.ok?o.json():null).catch(()=>{console.log("error getting history")});var C=require("react/jsx-runtime"),at=({lastUpdate:t},{lastUpdate:e})=>e===t?0:e<t?-1:1,it=t=>(0,C.jsx)(O.ListItem,{...t}),he=(0,v.forwardRef)(function({loginUrl:e,onNavigate:o,user:r,layoutId:n="latest"},s){let[a,m]=(0,v.useState)([]);(0,v.useEffect)(()=>{async function h(){let S=(await ce(r)).filter(E=>E.id!=="latest").sort(at).map(({id:E,lastUpdate:N})=>({lastUpdate:N,id:E,label:`Saved at ${(0,ue.formatDate)(new Date(N),"kk:mm:ss")}`}));console.log({sortedHistory:S}),m(S)}h()},[r]);let i=(0,v.useCallback)((h,d)=>{d&&o(d.id)},[o]),l=(0,v.useCallback)(()=>{J(e)},[e]),c=a.length===0?null:n==="latest"?a[0]:a.find(h=>h.id===n);return(0,C.jsxs)("div",{className:"vuuUserPanel",ref:s,children:[(0,C.jsx)(O.List,{ListItem:it,className:"vuuUserPanel-history",onSelect:i,selected:c,source:a}),(0,C.jsx)("div",{className:"vuuUserPanel-buttonBar",children:(0,C.jsxs)(de.Button,{"aria-label":"logout",onClick:l,children:[(0,C.jsx)(pe.ExportIcon,{})," Logout"]})})]})});var H=require("react/jsx-runtime"),ve=({layoutId:t,loginUrl:e,onNavigate:o,user:r})=>(0,H.jsxs)(fe.DropdownBase,{className:"vuuUserProfile",placement:"bottom-end",children:[(0,H.jsx)(ge.Button,{variant:"secondary",children:(0,H.jsx)(ye.UserSolidIcon,{})}),(0,H.jsx)(he,{layoutId:t,loginUrl:e,onNavigate:s=>{o(s)},user:r})]});var U=require("@heswell/salt-lab"),Te=y(require("classnames")),Ce=require("@salt-ds/core"),Le=require("react");var I=require("react/jsx-runtime"),lt="vuuThemeSwitch",xe=["light","dark"],q=({className:t,defaultMode:e,mode:o,onChange:r,...n})=>{let[s,a]=(0,Ce.useControlled)({controlled:o,default:e!=null?e:"light",name:"ThemeSwitch",state:"mode"}),m=xe.indexOf(s),i=(0,Le.useCallback)((c,h)=>{let d=xe[h];a(d),r(d)},[r,a]),l=(0,Te.default)(lt,t);return(0,I.jsxs)(U.ToggleButtonGroup,{className:l,...n,onChange:i,selectedIndex:m,children:[(0,I.jsx)(U.ToggleButton,{"aria-label":"alert",tooltipText:"Light Theme","data-icon":"light"}),(0,I.jsx)(U.ToggleButton,{"aria-label":"home",tooltipText:"Dark Theme","data-icon":"dark"})]})};var Pe=y(require("classnames"));var R=require("react/jsx-runtime"),mt="vuuAppHeader",Me=({className:t,layoutId:e,loginUrl:o,onNavigate:r,onSwitchTheme:n,themeMode:s="light",user:a,...m})=>{let i=(0,Pe.default)(mt,t),l=(0,Se.useCallback)(c=>n==null?void 0:n(c),[n]);return(0,R.jsxs)("header",{className:i,...m,children:[(0,R.jsx)(q,{defaultMode:s,onChange:l}),(0,R.jsx)(ve,{layoutId:e,loginUrl:o,onNavigate:r,user:a})]})};var f=require("react/jsx-runtime"),ct={type:"View",props:{style:{height:"calc(100% - 6px)"}},children:[{props:{className:"vuuShell-warningPlaceholder"},type:"Placeholder"}]},ut=({children:t,className:e,defaultLayout:o=ct,leftSidePanel:r,loginUrl:n,serverUrl:s,user:a,...m})=>{let i=(0,p.useRef)(null),l=(0,p.useRef)(null),[c,h]=(0,p.useState)(!1),d=(0,p.useRef)("latest"),[S,E,N]=me(a,o),Ie=(0,p.useCallback)(g=>{E(g)},[E]),Re=(0,p.useCallback)(g=>{i.current&&(i.current.dataset.mode=g)},[]),Ae=g=>{var K;let Oe=g.target;(K=l.current)!=null&&K.contains(Oe)||h(!c)},Be=(0,p.useCallback)(g=>{d.current=g,N(g)},[N]);(0,p.useEffect)(()=>{s&&a.token&&(0,Ee.connectToServer)({authToken:a.token,url:s,username:a.username})},[s,a.token,a.username]);let Fe=()=>{let g=[];return r&&g.push((0,f.jsx)(u.Drawer,{onClick:Ae,open:c,position:"left",inline:!0,peekaboo:!0,sizeOpen:200,toggleButton:"end",children:(0,f.jsx)(u.View,{className:"vuuShell-palette",id:"vw-app-palette",ref:l,style:{height:"100%"},children:r},"app-palette")},"left-panel")),g},Ve=(0,we.default)("vuuShell",e,"salt-theme","salt-density-high");return(0,f.jsxs)(Y,{value:void 0,children:[(0,f.jsx)(u.LayoutProvider,{layout:S,onLayoutChange:Ie,children:(0,f.jsx)(u.DraggableLayout,{className:Ve,"data-mode":"light",ref:i,...m,children:(0,f.jsxs)(u.Flexbox,{className:"App",style:{flexDirection:"column",height:"100%",width:"100%"},children:[(0,f.jsx)(Me,{layoutId:d.current,loginUrl:n,user:a,onNavigate:Be,onSwitchTheme:Re}),(0,f.jsx)(u.DockLayout,{style:{flex:1},children:Fe().concat((0,f.jsx)(u.DraggableLayout,{dropTarget:!0,style:{width:"100%",height:"100%"}},"main-content"))})]})})}),t]})};var L=require("react"),De=y(require("classnames")),Ue=require("react/jsx-runtime"),He="medium",Ne="salt-theme",be="light",W=(0,L.createContext)({density:"high",theme:"salt-theme",themeMode:"light"}),dt=(t,e,o,r)=>{var n;return(0,L.isValidElement)(t)?(0,L.cloneElement)(t,{className:(0,De.default)((n=t.props)==null?void 0:n.className,e,`salt-density-${r}`),"data-mode":o}):(console.warn(`
|
|
1
|
+
"use strict";var pt=Object.create;var W=Object.defineProperty;var ft=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames;var ht=Object.getPrototypeOf,yt=Object.prototype.hasOwnProperty;var vt=(e,t)=>{for(var o in t)W(e,o,{get:t[o],enumerable:!0})},Se=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of gt(t))!yt.call(e,n)&&n!==o&&W(e,n,{get:()=>t[n],enumerable:!(r=ft(t,n))||r.enumerable});return e};var w=(e,t,o)=>(o=e!=null?pt(ht(e)):{},Se(t||!e||!e.__esModule?W(o,"default",{value:e,enumerable:!0}):o,e)),St=e=>Se(W({},"__esModule",{value:!0}),e);var $t={};vt($t,{ConnectionStatusIcon:()=>Tt,DEFAULT_DENSITY:()=>it,DEFAULT_THEME:()=>lt,DEFAULT_THEME_MODE:()=>ut,DensitySwitch:()=>wt,Feature:()=>ie,LoginPanel:()=>bt,SessionEditingForm:()=>Nt,Shell:()=>At,ShellContextProvider:()=>fe,ThemeContext:()=>ye,ThemeProvider:()=>ct,ThemeSwitch:()=>ge,getAuthDetailsFromCookies:()=>Mt,logout:()=>ce,redirectToLogin:()=>He,useShellContext:()=>Ft});module.exports=St($t);var A=w(require("react")),Te=w(require("classnames"));var k=require("react/jsx-runtime"),Tt=({connectionStatus:e,className:t,element:o="span",...r})=>{let[n,a]=(0,A.useState)("vuuConnectingStatus");(0,A.useEffect)(()=>{switch(e){case"connected":case"reconnected":a("vuuActiveStatus");break;case"connecting":a("vuuConnectingStatus");break;case"disconnected":a("vuuDisconnectedStatus");break;default:break}},[e]);let l=A.default.createElement(o,{...r,className:(0,Te.default)("vuuStatus vuuIcon",n,t)});return(0,k.jsx)(k.Fragment,{children:(0,k.jsxs)("div",{className:"vuuStatus-container salt-theme",children:[l,(0,k.jsxs)("div",{className:"vuuStatus-text",children:["Status: ",e.toUpperCase()]})]})})};var xe=require("@heswell/salt-lab"),Ce=require("react"),Le=w(require("classnames")),we=require("react/jsx-runtime"),xt="vuuDensitySwitch",Ct=["high","medium","low","touch"],Lt="high",wt=({className:e,defaultDensity:t=Lt,onDensityChange:o})=>{let r=(0,Ce.useCallback)((a,l)=>{o(l)},[o]),n=(0,Le.default)(xt,e);return(0,we.jsx)(xe.Dropdown,{className:n,source:Ct,defaultSelected:t,onSelectionChange:r})};var N=w(require("react")),Me=require("@vuu-ui/vuu-layout");var De=w(require("react")),U=require("react/jsx-runtime"),Q=class extends De.default.Component{constructor(t){super(t),this.state={errorMessage:null}}static getDerivedStateFromError(t){return{errorMessage:t.message}}componentDidCatch(t,o){console.log(t,o)}render(){return this.state.errorMessage?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)("h1",{children:"Something went wrong."}),(0,U.jsx)("p",{children:this.state.errorMessage})]}):this.props.children}};var be=require("react/jsx-runtime"),Ee=()=>(0,be.jsx)("div",{className:"hwLoader",children:"loading"});var q=require("react/jsx-runtime"),X=new Map,Dt=e=>((0,N.useEffect)(()=>()=>{X.delete(e)},[e]),X.has(e)||X.set(e,N.default.lazy(()=>import(e))),X.get(e));function Et({url:e,css:t,params:o,...r}){console.log("Feature render",{css:t,url:e,props:r}),(0,N.useEffect)(()=>(console.log("%cFeature mount","color: green;"),()=>{console.log("%cFeature unmount","color:red;")}),[]),t&&import(t).then(a=>{console.log("%cInject Styles","color: blue;font-weight: bold"),document.adoptedStyleSheets=[...document.adoptedStyleSheets,a.default]});let n=Dt(e);return(0,q.jsx)(Q,{children:(0,q.jsx)(N.Suspense,{fallback:(0,q.jsx)(Ee,{}),children:(0,q.jsx)(n,{...r,...o})})})}var ie=N.default.memo(Et);ie.displayName="Feature";(0,Me.registerComponent)("Feature",ie,"view");var le=require("react"),Ne=require("@salt-ds/core"),O=require("@heswell/salt-lab");var H=require("react/jsx-runtime"),Pe="vuuLoginPanel",bt=({onSubmit:e})=>{let[t,o]=(0,le.useState)(""),[r,n]=(0,le.useState)(""),a=()=>{e(t,r)},l=(m,u)=>{o(u)},c=(m,u)=>{n(u)},i=t.trim()!==""&&r.trim()!=="";return(0,H.jsxs)("div",{className:Pe,children:[(0,H.jsx)(O.FormField,{label:"Username",style:{width:200},children:(0,H.jsx)(O.Input,{value:t,id:"text-username",onChange:l})}),(0,H.jsx)(O.FormField,{label:"Password",style:{width:200},children:(0,H.jsx)(O.Input,{type:"password",value:r,id:"text-password",onChange:c})}),(0,H.jsx)(Ne.Button,{className:`${Pe}-login`,disabled:!i,onClick:a,variant:"cta",children:"Login"})]})};var ue=require("@vuu-ui/vuu-utils"),Mt=()=>{let e=(0,ue.getCookieValue)("vuu-username"),t=(0,ue.getCookieValue)("vuu-auth-token");return[e,t]},He=(e="login.html")=>{window.location.href=e},ce=e=>{document.cookie="vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",document.cookie="vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",He(e)};var g=require("react"),me=w(require("classnames")),ke=require("@salt-ds/core"),de=require("@salt-ds/core"),Z=require("@vuu-ui/vuu-data"),I=require("@vuu-ui/vuu-utils");var T=require("react/jsx-runtime"),b="vuuSessionEditingForm",Re=(e,t)=>{let o=e.find(r=>r.name===t);if(o)return o;throw Error(`SessionEditingForm, no field '${t}' found`)},Fe=e=>{let{dataset:{field:t},value:o}=e.target;if(t===void 0)throw Error("SessionEditingForm, form field has no field name");return[t,o]},M={uninitialised:0,unchanged:1,changed:2,invalid:3};function Ve(e,t,o=!1){switch(t){case"int":case"long":{let r=parseInt(e,10);if((0,I.isValidNumber)(r))return r;if(o)throw Error("SessionEditingForm getTypedValue");return}case"double":{let r=parseFloat(e);return(0,I.isValidNumber)(r)?r:void 0}case"boolean":return e==="true";default:return e}}var Pt=(e,t)=>{if(e)return e;if(t)return new Z.RemoteDataSource({bufferSize:0,table:t.table,columns:t.columns.map(o=>o.name)});throw Error("SessionEditingForm: either a DataSource or a TableSchema must be provided")},Nt=({className:e,config:{fields:t,key:o},dataSource:r,id:n,onClose:a,schema:l,...c})=>{let[i,m]=(0,g.useState)(),[u,h]=(0,g.useState)(""),d=(0,g.useRef)(null),p=(0,g.useRef)(),y=(0,g.useRef)(M.uninitialised),L=(0,g.useMemo)(()=>{let s=D=>{if(S){let E={};for(let B of L.columns)E[B]=D[S[B]];y.current===M.uninitialised&&(y.current=M.unchanged,p.current=E),m(E)}},f=Pt(r,l),S=(0,I.buildColumnMap)(f.columns);return f.subscribe({range:{from:0,to:5}},D=>{D.type==="viewport-update"&&D.rows&&(y.current===M.uninitialised?s(D.rows[0]):console.log("what do we do with server updates"))}),f},[r,l]),J=(0,ke.useIdMemo)(n),Y=(0,g.useCallback)(s=>{let[f,S]=Fe(s),{type:D}=Re(t,f),E=Ve(S,D);m((B={})=>{let ve={...B,[f]:E},dt=(0,I.shallowEquals)(ve,p.current);return y.current=dt?M.unchanged:E!==void 0?M.changed:M.invalid,ve})},[t]),oe=(0,g.useCallback)(s=>{let[f,S]=Fe(s),{type:D}=Re(t,f);console.log("BLUR",{keyField:o});let E=i==null?void 0:i[o],B=Ve(S,D,!0);typeof E=="string"&&L.menuRpcCall({rowKey:E,field:f,value:B,type:"VP_EDIT_CELL_RPC"})},[L,t,o,i]),_=(0,g.useCallback)(async()=>{let s=await L.menuRpcCall({type:"VP_EDIT_SUBMIT_FORM_RPC"});(0,Z.isErrorResponse)(s)&&h(s.error)},[L]),re=(0,g.useCallback)(s=>{s.key==="Enter"&&y.current===M.changed&&_()},[_]),ne=(0,g.useCallback)(()=>{a()},[a]),se=s=>{var S;let f=String((S=i==null?void 0:i[s.name])!=null?S:"");return s.readonly||s.name===o?(0,T.jsx)("div",{className:`${b}-fieldValue vuuReadOnly`,children:f}):(0,T.jsx)("input",{className:`${b}-fieldValue`,"data-field":s.name,onBlur:oe,onChange:Y,type:"text",value:f,id:`${J}-input-${s.name}`})};(0,g.useEffect)(()=>{if(d.current){let s=d.current.querySelector("input");s&&setTimeout(()=>{s.focus(),console.log("select item"),s.select()},100)}},[]);let ae=y.current===M.changed;return(0,T.jsxs)("div",{...c,className:(0,me.default)(b,e),children:[u?(0,T.jsx)("div",{className:`${b}-errorBanner`,"data-icon":"error",title:u,children:"Error, edit(s) not saved"}):void 0,(0,T.jsx)("div",{className:`${b}-content`,ref:d,onKeyDown:re,children:t.map(s=>{var f;return(0,T.jsxs)("div",{className:`${b}-field`,children:[(0,T.jsx)("label",{className:(0,me.default)(`${b}-fieldLabel`,{[`${b}-required`]:s.required}),htmlFor:`${J}-input-${s.name}`,children:(f=s==null?void 0:s.label)!=null?f:s.description}),se(s)]},s.name)})}),(0,T.jsxs)("div",{className:`${b}-buttonbar salt-theme salt-density-high`,children:[(0,T.jsx)(de.Button,{type:"submit",variant:"cta",disabled:!ae,onClick:_,children:"Submit"}),(0,T.jsx)(de.Button,{variant:"secondary",onClick:ne,children:"Cancel"})]})]})};var rt=require("@vuu-ui/vuu-data"),nt=w(require("classnames")),x=require("react");var ee=require("react"),j=require("react/jsx-runtime"),Ht={},pe=(0,ee.createContext)(Ht),Rt=({children:e,context:t,inheritedContext:o})=>{let r={...o,...t};return(0,j.jsx)(pe.Provider,{value:r,children:e})},fe=({children:e,value:t})=>(0,j.jsx)(pe.Consumer,{children:o=>(0,j.jsx)(Rt,{context:t,inheritedContext:o,children:e})}),Ft=()=>(0,ee.useContext)(pe);var R=require("react");var Ue=(e,t,o="latest")=>new Promise((r,n)=>{console.log(`load local config at ${e} for user ${t.username}, id ${o}`);let a=localStorage.getItem(e);if(a){let l=JSON.parse(a);r(l)}else n()}),Ie=(e,t,o)=>new Promise((r,n)=>{try{localStorage.setItem(e,JSON.stringify(o)),r(void 0)}catch{n()}});var Be=(e,t,o="latest")=>new Promise((r,n)=>{fetch(`${e}/${t.username}/${o}`,{}).then(a=>{a.ok?r(a.json()):n(void 0)}).catch(()=>{n(void 0)})}),Ae=(e,t,o)=>new Promise((r,n)=>{fetch(`${e}/${t.username}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}).then(a=>{a.ok?r(void 0):n()})});var Oe=({saveLocation:e,saveUrl:t="api/vui",user:o,defaultLayout:r})=>{let[n,a]=(0,R.useState)(r),l=e==="remote",c=l?Be:Ue,i=l?Ae:Ie,m=p=>{a(p)},u=(0,R.useCallback)(async(p="latest")=>{try{let y=await c(t,o,p);m(y)}catch{m(r)}},[r,c,t,o]);(0,R.useEffect)(()=>{u()},[u]);let h=(0,R.useCallback)(p=>{i(t,o,p)},[i,t,o]),d=(0,R.useCallback)(p=>{u(p)},[u]);return[n,h,d]};var v=require("@vuu-ui/vuu-layout");var et=require("react");var ze=require("@salt-ds/core"),Ke=require("@heswell/salt-lab"),Ye=require("@salt-ds/icons");var Je=require("@vuu-ui/vuu-utils"),te=require("@heswell/salt-lab"),_e=require("@salt-ds/core"),qe=require("@salt-ds/icons"),P=require("react");var $e=async e=>await fetch(`api/vui/${e.username}`,{}).then(o=>o.ok?o.json():null).catch(()=>{console.log("error getting history")});var F=require("react/jsx-runtime"),Vt=({lastUpdate:e},{lastUpdate:t})=>t===e?0:t<e?-1:1,kt=e=>(0,F.jsx)(te.ListItem,{...e}),Ge=(0,P.forwardRef)(function({loginUrl:t,onNavigate:o,user:r,layoutId:n="latest"},a){let[l,c]=(0,P.useState)([]);(0,P.useEffect)(()=>{async function h(){let p=(await $e(r)).filter(y=>y.id!=="latest").sort(Vt).map(({id:y,lastUpdate:L})=>({lastUpdate:L,id:y,label:`Saved at ${(0,Je.formatDate)(new Date(L),"kk:mm:ss")}`}));console.log({sortedHistory:p}),c(p)}h()},[r]);let i=(0,P.useCallback)((h,d)=>{d&&o(d.id)},[o]),m=(0,P.useCallback)(()=>{ce(t)},[t]),u=l.length===0?null:n==="latest"?l[0]:l.find(h=>h.id===n);return(0,F.jsxs)("div",{className:"vuuUserPanel",ref:a,children:[(0,F.jsx)(te.List,{ListItem:kt,className:"vuuUserPanel-history",onSelect:i,selected:u,source:l}),(0,F.jsx)("div",{className:"vuuUserPanel-buttonBar",children:(0,F.jsxs)(_e.Button,{"aria-label":"logout",onClick:m,children:[(0,F.jsx)(qe.ExportIcon,{})," Logout"]})})]})});var $=require("react/jsx-runtime"),We=({layoutId:e,loginUrl:t,onNavigate:o,user:r})=>(0,$.jsxs)(Ke.DropdownBase,{className:"vuuUserProfile",placement:"bottom-end",children:[(0,$.jsx)(ze.Button,{variant:"secondary",children:(0,$.jsx)(Ye.UserSolidIcon,{})}),(0,$.jsx)(Ge,{layoutId:e,loginUrl:t,onNavigate:a=>{o(a)},user:r})]});var G=require("@heswell/salt-lab"),Xe=w(require("classnames")),Ze=require("@salt-ds/core"),je=require("react");var z=require("react/jsx-runtime"),Ut="vuuThemeSwitch",Qe=["light","dark"],ge=({className:e,defaultMode:t,mode:o,onChange:r,...n})=>{let[a,l]=(0,Ze.useControlled)({controlled:o,default:t!=null?t:"light",name:"ThemeSwitch",state:"mode"}),c=Qe.indexOf(a),i=(0,je.useCallback)((u,h)=>{let d=Qe[h];l(d),r(d)},[r,l]),m=(0,Xe.default)(Ut,e);return(0,z.jsxs)(G.ToggleButtonGroup,{className:m,...n,onChange:i,selectedIndex:c,children:[(0,z.jsx)(G.ToggleButton,{"aria-label":"alert",tooltipText:"Light Theme","data-icon":"light"}),(0,z.jsx)(G.ToggleButton,{"aria-label":"home",tooltipText:"Dark Theme","data-icon":"dark"})]})};var tt=w(require("classnames"));var K=require("react/jsx-runtime"),It="vuuAppHeader",ot=({className:e,layoutId:t,loginUrl:o,onNavigate:r,onSwitchTheme:n,themeMode:a="light",user:l,...c})=>{let i=(0,tt.default)(It,e),m=(0,et.useCallback)(u=>n==null?void 0:n(u),[n]);return(0,K.jsxs)("header",{className:i,...c,children:[(0,K.jsx)(ge,{defaultMode:a,onChange:m}),(0,K.jsx)(We,{layoutId:t,loginUrl:o,onNavigate:r,user:l})]})};var st=require("@vuu-ui/vuu-utils");var C=require("react/jsx-runtime"),{error:he}=(0,st.logger)("Shell"),Bt={type:"View",props:{style:{height:"calc(100% - 6px)"}},children:[{props:{className:"vuuShell-warningPlaceholder"},type:"Placeholder"}]},At=({children:e,className:t,defaultLayout:o=Bt,leftSidePanel:r,loginUrl:n,saveLocation:a="remote",saveUrl:l,serverUrl:c,user:i,...m})=>{let u=(0,x.useRef)(null),h=(0,x.useRef)(null),[d,p]=(0,x.useState)(!1),y=(0,x.useRef)("latest"),[L,J,Y]=Oe({defaultLayout:o,saveLocation:a,user:i}),oe=(0,x.useCallback)(s=>{try{J(s)}catch{he==null||he("Failed to save layout")}},[J]),_=(0,x.useCallback)(s=>{u.current&&(u.current.dataset.mode=s)},[]),re=s=>{var S;let f=s.target;(S=h.current)!=null&&S.contains(f)||p(!d)},ne=(0,x.useCallback)(s=>{y.current=s,Y(s)},[Y]);(0,x.useEffect)(()=>{c&&i.token&&(0,rt.connectToServer)({authToken:i.token,url:c,username:i.username})},[c,i.token,i.username]);let se=()=>{let s=[];return r&&s.push((0,C.jsx)(v.Drawer,{onClick:re,open:d,position:"left",inline:!0,peekaboo:!0,sizeOpen:200,toggleButton:"end",children:(0,C.jsx)(v.View,{className:"vuuShell-palette",id:"vw-app-palette",ref:h,style:{height:"100%"},children:r},"app-palette")},"left-panel")),s},ae=(0,nt.default)("vuuShell",t,"salt-theme","salt-density-high");return(0,C.jsxs)(fe,{value:void 0,children:[(0,C.jsx)(v.LayoutProvider,{layout:L,onLayoutChange:oe,children:(0,C.jsx)(v.DraggableLayout,{className:ae,"data-mode":"light",ref:u,...m,children:(0,C.jsxs)(v.Flexbox,{className:"App",style:{flexDirection:"column",height:"100%",width:"100%"},children:[(0,C.jsx)(ot,{layoutId:y.current,loginUrl:n,user:i,onNavigate:ne,onSwitchTheme:_}),(0,C.jsx)(v.DockLayout,{style:{flex:1},children:se().concat((0,C.jsx)(v.DraggableLayout,{dropTarget:!0,style:{width:"100%",height:"100%"}},"main-content"))})]})})}),e]})};var V=require("react"),at=w(require("classnames")),mt=require("react/jsx-runtime"),it="medium",lt="salt-theme",ut="light",ye=(0,V.createContext)({density:"high",theme:"salt-theme",themeMode:"light"}),Ot=(e,t,o,r)=>{var n;return(0,V.isValidElement)(e)?(0,V.cloneElement)(e,{className:(0,at.default)((n=e.props)==null?void 0:n.className,t,`salt-density-${r}`),"data-mode":o}):(console.warn(`
|
|
2
2
|
ThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.
|
|
3
|
-
Wrap elements with a single container`),
|
|
3
|
+
Wrap elements with a single container`),e)},ct=({children:e,theme:t,themeMode:o,density:r})=>{var h,d,p;let{density:n,themeMode:a,theme:l}=(0,V.useContext)(ye),c=(h=r!=null?r:n)!=null?h:it,i=(d=o!=null?o:a)!=null?d:ut,m=(p=t!=null?t:l)!=null?p:lt,u=Ot(e,m,i,c);return(0,mt.jsx)(ye.Provider,{value:{themeMode:i,density:c,theme:m},children:u})};ct.displayName="ThemeProvider";
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../packages/vuu-shell/src/index.ts", "../../../packages/vuu-shell/src/connection-status/ConnectionStatusIcon.tsx", "../../../packages/vuu-shell/src/density-switch/DensitySwitch.tsx", "../../../packages/vuu-shell/src/feature/Feature.tsx", "../../../packages/vuu-shell/src/feature/ErrorBoundary.jsx", "../../../packages/vuu-shell/src/feature/Loader.tsx", "../../../packages/vuu-shell/src/login/LoginPanel.tsx", "../../../packages/vuu-shell/src/login/login-utils.ts", "../../../packages/vuu-shell/src/shell.tsx", "../../../packages/vuu-shell/src/ShellContextProvider.tsx", "../../../packages/vuu-shell/src/use-layout-config.
|
|
4
|
-
"sourcesContent": ["export * from \"./connection-status\";\nexport * from \"./density-switch\";\nexport * from \"./feature\";\nexport * from \"./login\";\nexport * from \"./shell\";\nexport * from \"./shellTypes\";\nexport * from \"./ShellContextProvider\";\nexport * from \"./theme-provider\";\nexport * from \"./theme-switch\";\n", "import React, { useEffect, useState } from 'react';\nimport cx from 'classnames';\nimport './ConnectionStatusIcon.css';\n\ntype connectionStatus = 'connected' | 'reconnected' | 'connecting' | 'disconnected';\n\ninterface ConnectionStatusProps {\n\tconnectionStatus: connectionStatus\n\tclassName?: string;\n\tprops?: unknown;\n\telement?: string;\n}\n\nexport const ConnectionStatusIcon = ({ connectionStatus, className, element = 'span', ...props}: ConnectionStatusProps) => {\n\tconst [classBase, setClassBase] = useState<string>('vuuConnectingStatus');\n\tuseEffect(() => {\n\t\tswitch(connectionStatus) {\n\t\t\tcase 'connected':\n\t\t\tcase 'reconnected':\n\t\t\t\tsetClassBase('vuuActiveStatus');\n\t\t\t\tbreak;\n\t\t\tcase 'connecting':\n\t\t\t\tsetClassBase('vuuConnectingStatus');\n\t\t\t\tbreak;\n\t\t\tcase 'disconnected':\n\t\t\t\tsetClassBase('vuuDisconnectedStatus');\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}, [connectionStatus]);\n\n\tconst statusIcon = React.createElement (\n\t\telement,\n\t\t{\n\t\t\t...props,\n\t\t\tclassName: cx('vuuStatus vuuIcon', classBase, className)\n\t\t},\n\t)\n\n\treturn (\n\t\t<>\n\t\t\t<div className='vuuStatus-container salt-theme'>\n\t\t\t\t{statusIcon}\n\t\t\t\t<div\tclassName='vuuStatus-text'>Status: {connectionStatus.toUpperCase()}</div>\n\t\t\t</div>\n\t\t</>\n\t)\n}", "import { Dropdown } from \"@heswell/salt-lab\";\nimport { Density } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport cx from \"classnames\";\n\nconst classBase = \"vuuDensitySwitch\";\n\nconst densities:Density[] = [\"high\", \"medium\", \"low\", \"touch\"];\nconst DEFAULT_DENSITY = \"high\";\n\nexport interface DensitySwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultDensity?: Density;\n density?: Density;\n onDensityChange: (density: Density) => void;\n}\n\nexport const DensitySwitch = ({\n className: classNameProp,\n defaultDensity=DEFAULT_DENSITY,\n onDensityChange,\n}:DensitySwitchProps) => {\n const handleSelectionChange = useCallback((_event, selectedItem) => {\n onDensityChange(selectedItem);\n }, [onDensityChange])\n\n const className = cx(classBase, classNameProp);\n\n return (\n <Dropdown\n className={className}\n source={densities}\n defaultSelected={defaultDensity}\n onSelectionChange={handleSelectionChange}\n />\n )\n}", "import React, { Suspense } from \"react\";\nimport { registerComponent } from \"@vuu-ui/vuu-layout\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\nimport { Loader } from \"./Loader\";\n// import { importCSS } from \"./css-module-loader\";\n\nexport interface FeatureProps<Params extends object | undefined = undefined> {\n height?: number;\n url: string;\n css?: string;\n width?: number;\n params: Params;\n}\n\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n params,\n ...props\n}: FeatureProps<Params>) {\n if (css) {\n import(/* @vite-ignore */ css, { assert: { type: \"css\" } }).then(\n (cssModule) => {\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n cssModule.default,\n ];\n }\n );\n // Polyfill until vite build supports import assertions\n // Note: already fully supported in esbuild, so vite dev\n // importCSS(css).then((styleSheet) => {\n // document.adoptedStyleSheets = [\n // ...document.adoptedStyleSheets,\n // styleSheet,\n // ];\n // });\n }\n const LazyFeature = React.lazy(() => import(/* @vite-ignore */ url));\n return (\n <ErrorBoundary>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </ErrorBoundary>\n );\n}\n\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n", "import React from 'react';\n// TODO\nexport class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error, errorInfo) {\n // You can also log the error to an error reporting service\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>Something went wrong.</h1>\n <p>{this.state.errorMessage}</p>\n </>\n );\n }\n\n return this.props.children;\n }\n}\n", "// TODO\nexport const Loader = () => <div className=\"hwLoader\">loading</div>;\n", "import { ChangeEvent, HTMLAttributes, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { FormField, Input } from \"@heswell/salt-lab\";\n\nimport \"./LoginPanel.css\";\n\nconst classBase = \"vuuLoginPanel\";\n\nexport interface LoginPanelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\"> {\n onSubmit: (username: string, password: string) => void;\n}\n\nexport const LoginPanel = ({ onSubmit }: LoginPanelProps) => {\n const [username, setUserName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n\n const login = () => {\n onSubmit(username, password);\n };\n\n const handleUsername = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setUserName(value);\n };\n\n const handlePassword = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setPassword(value);\n };\n\n const dataIsValid = username.trim() !== \"\" && password.trim() !== \"\";\n\n return (\n <div className={classBase}>\n <FormField label=\"Username\" style={{ width: 200 }}>\n <Input value={username} id=\"text-username\" onChange={handleUsername} />\n </FormField>\n\n <FormField label=\"Password\" style={{ width: 200 }}>\n <Input\n type=\"password\"\n value={password}\n id=\"text-password\"\n onChange={handlePassword}\n />\n </FormField>\n\n <Button\n className={`${classBase}-login`}\n disabled={!dataIsValid}\n onClick={login}\n variant=\"cta\"\n >\n Login\n </Button>\n </div>\n );\n};\n", "import { getCookieValue } from \"@vuu-ui/vuu-utils\";\n\nexport const getAuthDetailsFromCookies = () => {\n const username = getCookieValue(\"vuu-username\");\n const token = getCookieValue(\"vuu-auth-token\");\n return [username, token];\n};\n\nexport const redirectToLogin = (loginUrl = \"login.html\") => {\n window.location.href = loginUrl;\n};\n\nexport const logout = (loginUrl?: string) => {\n document.cookie = \"vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = \"vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n redirectToLogin(loginUrl);\n};\n", "import { connectToServer } from \"@vuu-ui/vuu-data\";\nimport cx from \"classnames\";\nimport {\n HTMLAttributes,\n MouseEvent,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { ShellContextProvider } from \"./ShellContextProvider\";\nimport useLayoutConfig from \"./use-layout-config\";\nimport {\n DockLayout,\n DraggableLayout,\n Drawer,\n Flexbox,\n LayoutProvider,\n View,\n} from \"@vuu-ui/vuu-layout\";\nimport { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { AppHeader } from \"./app-header\";\nimport { ThemeMode } from \"./theme-provider\";\n\nimport \"./shell.css\";\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst warningLayout = {\n type: \"View\",\n props: {\n style: { height: \"calc(100% - 6px)\" },\n },\n children: [\n {\n props: {\n className: \"vuuShell-warningPlaceholder\",\n },\n type: \"Placeholder\",\n },\n ],\n};\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n defaultLayout?: LayoutJSON;\n leftSidePanel?: ReactElement;\n loginUrl?: string;\n // paletteConfig: any;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n children,\n className: classNameProp,\n defaultLayout = warningLayout,\n leftSidePanel,\n loginUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const paletteView = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const layoutId = useRef(\"latest\");\n\n const [layout, setLayoutConfig, loadLayoutById] = useLayoutConfig(\n user,\n defaultLayout\n );\n\n const handleLayoutChange = useCallback(\n (layout) => {\n setLayoutConfig(layout);\n },\n [setLayoutConfig]\n );\n\n const handleSwitchTheme = useCallback((mode: ThemeMode) => {\n if (rootRef.current) {\n rootRef.current.dataset.mode = mode;\n }\n }, []);\n\n const handleDrawerClick = (e: MouseEvent<HTMLElement>) => {\n const target = e.target as HTMLElement;\n if (!paletteView.current?.contains(target)) {\n setOpen(!open);\n }\n };\n\n const handleNavigate = useCallback(\n (id) => {\n layoutId.current = id;\n loadLayoutById(id);\n },\n [loadLayoutById]\n );\n\n useEffect(() => {\n if (serverUrl && user.token) {\n connectToServer({\n authToken: user.token,\n url: serverUrl,\n username: user.username,\n });\n }\n }, [serverUrl, user.token, user.username]);\n\n const getDrawers = () => {\n const drawers: ReactElement[] = [];\n if (leftSidePanel) {\n drawers.push(\n <Drawer\n key=\"left-panel\"\n onClick={handleDrawerClick}\n open={open}\n position=\"left\"\n inline\n peekaboo\n sizeOpen={200}\n toggleButton=\"end\"\n >\n <View\n className=\"vuuShell-palette\"\n id=\"vw-app-palette\"\n key=\"app-palette\"\n ref={paletteView}\n style={{ height: \"100%\" }}\n >\n {leftSidePanel}\n </View>\n </Drawer>\n );\n }\n\n return drawers;\n };\n\n const className = cx(\n \"vuuShell\",\n classNameProp,\n \"salt-theme\",\n \"salt-density-high\"\n );\n\n return (\n // ShellContext TBD\n <ShellContextProvider value={undefined}>\n <LayoutProvider layout={layout} onLayoutChange={handleLayoutChange}>\n <DraggableLayout\n className={className}\n data-mode=\"light\"\n ref={rootRef}\n {...htmlAttributes}\n >\n <Flexbox\n className=\"App\"\n style={{ flexDirection: \"column\", height: \"100%\", width: \"100%\" }}\n >\n <AppHeader\n layoutId={layoutId.current}\n loginUrl={loginUrl}\n user={user}\n onNavigate={handleNavigate}\n onSwitchTheme={handleSwitchTheme}\n />\n <DockLayout style={{ flex: 1 }}>\n {getDrawers().concat(\n <DraggableLayout\n dropTarget\n key=\"main-content\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n </DockLayout>\n </Flexbox>\n </DraggableLayout>\n </LayoutProvider>\n {children}\n </ShellContextProvider>\n );\n};\n", "import { MenuRpcResponse } from \"@vuu-ui/vuu-data\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\n\nexport interface ShellContextProps {\n getDefaultColumnConfig?: (\n tableName: string,\n columnName: string\n ) => Partial<ColumnDescriptor>;\n handleRpcResponse?: (response?: MenuRpcResponse) => void;\n}\n\nconst defaultConfig = {};\n\nconst ShellContext = createContext<ShellContextProps>(defaultConfig);\n\nexport interface ShellProviderProps {\n children: ReactNode;\n value?: ShellContextProps;\n}\n\nconst Provider = ({\n children,\n context,\n inheritedContext,\n}: {\n children: ReactNode;\n context?: ShellContextProps;\n inheritedContext?: ShellContextProps;\n}) => {\n // TODO functions provided at multiple levels must be merged\n const mergedContext = {\n ...inheritedContext,\n ...context,\n };\n return (\n <ShellContext.Provider value={mergedContext}>\n {children}\n </ShellContext.Provider>\n );\n};\n\nexport const ShellContextProvider = ({\n children,\n value,\n}: ShellProviderProps): ReactElement => {\n return (\n <ShellContext.Consumer>\n {(context) => (\n <Provider context={value} inheritedContext={context}>\n {children}\n </Provider>\n )}\n </ShellContext.Consumer>\n );\n};\n\nexport const useShellContext = () => {\n return useContext(ShellContext);\n};\n", "import { useCallback, useEffect, useState } from \"react\";\n\nconst useLayoutConfig = (user, defaultLayout) => {\n const [layout, _setLayout] = useState(defaultLayout);\n\n const setLayout = (layout) => {\n _setLayout(layout);\n };\n\n const load = useCallback(\n async (id = \"latest\") => {\n fetch(`api/vui/${user.username}/${id}`, {})\n .then((response) => {\n return response.ok ? response.json() : defaultLayout;\n })\n .then(setLayout)\n .catch(() => {\n // TODO we should set a layout with a warning here\n setLayout(defaultLayout);\n });\n },\n [defaultLayout, user.username]\n );\n\n useEffect(() => {\n load();\n }, [load]);\n\n const saveData = useCallback(\n (data) => {\n fetch(`api/vui/${user.username}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }).then((response) => {\n return response.ok ? response.json() : defaultLayout;\n });\n },\n [defaultLayout, user]\n );\n\n const loadLayoutById = useCallback(\n (id) => {\n load(id);\n },\n [load]\n );\n\n return [layout, saveData, loadLayoutById];\n};\n\nexport default useLayoutConfig;\n", "import { HTMLAttributes, useCallback } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { UserProfile } from \"../user-profile\";\nimport { ThemeSwitch } from \"../theme-switch\";\nimport { ThemeMode } from \"../theme-provider\";\nimport cx from \"classnames\";\n\nimport \"./AppHeader.css\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n onSwitchTheme?: (mode: ThemeMode) => void;\n themeMode?: ThemeMode;\n user: VuuUser;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n layoutId,\n loginUrl,\n onNavigate,\n onSwitchTheme,\n themeMode = \"light\",\n user,\n ...htmlAttributes\n}: AppHeaderProps) => {\n const className = cx(classBase, classNameProp);\n const handleSwitchTheme = useCallback(\n (mode: ThemeMode) => onSwitchTheme?.(mode),\n [onSwitchTheme]\n );\n return (\n <header className={className} {...htmlAttributes}>\n <ThemeSwitch defaultMode={themeMode} onChange={handleSwitchTheme} />\n <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n />\n </header>\n );\n};\n", "import { Button } from \"@salt-ds/core\";\nimport { DropdownBase } from \"@heswell/salt-lab\";\nimport { UserSolidIcon } from \"@salt-ds/icons\";\nimport { UserPanel } from \"./UserPanel\";\n\nimport \"./UserProfile.css\";\nimport { VuuUser } from \"../shell\";\n\nexport interface UserProfileProps {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n}\n\nexport const UserProfile = ({\n layoutId,\n loginUrl,\n onNavigate,\n user,\n}: UserProfileProps) => {\n const handleNavigate = (id: string) => {\n onNavigate(id);\n };\n\n return (\n <DropdownBase className=\"vuuUserProfile\" placement=\"bottom-end\">\n <Button variant=\"secondary\">\n <UserSolidIcon />\n </Button>\n <UserPanel\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={handleNavigate}\n user={user}\n />\n </DropdownBase>\n );\n};\n", "import { formatDate } from \"@vuu-ui/vuu-utils\";\nimport { List, ListItem, ListItemProps } from \"@heswell/salt-lab\";\nimport { Button } from \"@salt-ds/core\";\nimport { ExportIcon } from \"@salt-ds/icons\";\nimport {\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { getLayoutHistory, LayoutHistoryItem } from \"../get-layout-history\";\nimport { logout } from \"../login\";\nimport { VuuUser } from \"../shell\";\n\nimport \"./UserPanel.css\";\n\nconst byLastUpdate = (\n { lastUpdate: l1 }: LayoutHistoryItem,\n { lastUpdate: l2 }: LayoutHistoryItem\n) => {\n return l2 === l1 ? 0 : l2 < l1 ? -1 : 1;\n};\n\ntype HistoryEntry = {\n id: string;\n label: string;\n lastUpdate: number;\n};\n\nconst HistoryListItem = (props: ListItemProps<HistoryEntry>) => {\n return <ListItem {...props} />;\n};\n\nexport interface UserPanelProps extends HTMLAttributes<HTMLDivElement> {\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n layoutId: string;\n}\n\nexport const UserPanel = forwardRef(function UserPanel(\n { loginUrl, onNavigate, user, layoutId = \"latest\" }: UserPanelProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const [history, setHistory] = useState<HistoryEntry[]>([]);\n\n useEffect(() => {\n async function getHistory() {\n const history = await getLayoutHistory(user);\n const sortedHistory = history\n .filter((item) => item.id !== \"latest\")\n .sort(byLastUpdate)\n .map<HistoryEntry>(({ id, lastUpdate }) => ({\n lastUpdate,\n id,\n label: `Saved at ${formatDate(new Date(lastUpdate), \"kk:mm:ss\")}`,\n }));\n console.log({ sortedHistory });\n setHistory(sortedHistory);\n }\n\n getHistory();\n }, [user]);\n\n const handleHisorySelected = useCallback(\n (evt, selected) => {\n if (selected) {\n onNavigate(selected.id);\n }\n },\n [onNavigate]\n );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const selected =\n history.length === 0\n ? null\n : layoutId === \"latest\"\n ? history[0]\n : history.find((i) => i.id === layoutId);\n\n return (\n <div className=\"vuuUserPanel\" ref={forwardedRef}>\n <List<HistoryEntry>\n ListItem={HistoryListItem}\n className=\"vuuUserPanel-history\"\n onSelect={handleHisorySelected}\n selected={selected}\n source={history}\n />\n <div className=\"vuuUserPanel-buttonBar\">\n <Button aria-label=\"logout\" onClick={handleLogout}>\n <ExportIcon /> Logout\n </Button>\n </div>\n </div>\n );\n});\n", "import { VuuUser } from \"./shell\";\n\nexport interface LayoutHistoryItem {\n user: string;\n id: string;\n uniqueId: string;\n lastUpdate: number;\n}\n\nexport const getLayoutHistory = async (\n user: VuuUser\n): Promise<LayoutHistoryItem[]> => {\n const history = await fetch(`api/vui/${user.username}`, {})\n .then((response) => {\n return response.ok ? response.json() : null;\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n console.log(\"error getting history\");\n });\n\n return history;\n};\n", "import {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupChangeEventHandler,\n} from \"@heswell/salt-lab\";\nimport cx from \"classnames\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback } from \"react\";\n\nimport \"./ThemeSwitch.css\";\nimport { ThemeMode } from \"../theme-provider\";\n\nconst classBase = \"vuuThemeSwitch\";\nexport interface ThemeSwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultMode?: ThemeMode;\n mode?: ThemeMode;\n onChange: (mode: ThemeMode) => void;\n}\n\nconst modes: ThemeMode[] = [\"light\", \"dark\"];\n\nexport const ThemeSwitch = ({\n className: classNameProp,\n defaultMode: defaultModeProp,\n mode: modeProp,\n onChange,\n ...htmlAttributes\n}: ThemeSwitchProps) => {\n const [mode, setMode] = useControlled<ThemeMode>({\n controlled: modeProp,\n default: defaultModeProp ?? \"light\",\n name: \"ThemeSwitch\",\n state: \"mode\",\n });\n\n const selectedIndex = modes.indexOf(mode);\n\n const handleChangeSecondary: ToggleButtonGroupChangeEventHandler =\n useCallback(\n (_evt, index) => {\n const mode = modes[index];\n setMode(mode);\n onChange(mode);\n },\n [onChange, setMode]\n );\n const className = cx(classBase, classNameProp);\n return (\n <ToggleButtonGroup\n className={className}\n {...htmlAttributes}\n onChange={handleChangeSecondary}\n selectedIndex={selectedIndex}\n >\n <ToggleButton\n aria-label=\"alert\"\n tooltipText=\"Light Theme\"\n data-icon=\"light\"\n />\n <ToggleButton\n aria-label=\"home\"\n tooltipText=\"Dark Theme\"\n data-icon=\"dark\"\n />\n </ToggleButtonGroup>\n );\n};\n", "import React, {\n createContext,\n HTMLAttributes,\n ReactNode,\n ReactElement,\n isValidElement,\n cloneElement,\n useContext,\n} from \"react\";\nimport cx from \"classnames\";\n\nexport const DEFAULT_DENSITY: Density = \"medium\";\nexport const DEFAULT_THEME = \"salt-theme\";\nexport const DEFAULT_THEME_MODE: ThemeMode = \"light\";\n\nexport type Density = \"high\" | \"medium\" | \"low\" | \"touch\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type TargetElement = \"root\" | \"scope\" | \"child\";\n\nexport interface ThemeContextProps {\n density: Density;\n theme: string;\n themeMode: ThemeMode;\n}\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n density: \"high\",\n theme: \"salt-theme\",\n themeMode: \"light\",\n});\n\nconst createThemedChildren = (\n children: ReactNode,\n theme: string,\n themeMode: ThemeMode,\n density: Density\n) => {\n if (isValidElement<HTMLAttributes<HTMLElement>>(children)) {\n return cloneElement(children, {\n className: cx(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n children.props?.className,\n theme,\n `salt-density-${density}`\n ),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n \"data-mode\": themeMode,\n });\n } else {\n console.warn(\n `\\nThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.\n Wrap elements with a single container`\n );\n return children;\n }\n};\n\ninterface ThemeProviderProps {\n children: ReactElement;\n density?: Density;\n theme?: string;\n themeMode?: ThemeMode;\n applyClassesTo?: TargetElement;\n}\n\nexport const ThemeProvider = ({\n children,\n theme: themeProp,\n themeMode: themeModeProp,\n density: densityProp,\n}: ThemeProviderProps) => {\n const {\n density: inheritedDensity,\n themeMode: inheritedThemeMode,\n theme: inheritedTheme,\n } = useContext(ThemeContext);\n\n const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;\n const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;\n const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;\n const themedChildren = createThemedChildren(\n children,\n theme,\n themeMode,\n density\n );\n\n return (\n <ThemeContext.Provider value={{ themeMode, density, theme }}>\n {themedChildren}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["src_exports", "__export", "ConnectionStatusIcon", "DEFAULT_DENSITY", "DEFAULT_THEME", "DEFAULT_THEME_MODE", "DensitySwitch", "Feature", "LoginPanel", "Shell", "ShellContextProvider", "ThemeContext", "ThemeProvider", "ThemeSwitch", "getAuthDetailsFromCookies", "logout", "redirectToLogin", "useShellContext", "__toCommonJS", "import_react", "import_classnames", "import_jsx_runtime", "ConnectionStatusIcon", "connectionStatus", "className", "element", "props", "classBase", "setClassBase", "statusIcon", "React", "cx", "import_salt_lab", "import_react", "import_classnames", "import_jsx_runtime", "classBase", "densities", "DEFAULT_DENSITY", "DensitySwitch", "classNameProp", "defaultDensity", "onDensityChange", "handleSelectionChange", "_event", "selectedItem", "className", "cx", "import_react", "import_vuu_layout", "import_react", "import_jsx_runtime", "ErrorBoundary", "React", "props", "error", "errorInfo", "import_jsx_runtime", "Loader", "import_jsx_runtime", "
|
|
3
|
+
"sources": ["../../../packages/vuu-shell/src/index.ts", "../../../packages/vuu-shell/src/connection-status/ConnectionStatusIcon.tsx", "../../../packages/vuu-shell/src/density-switch/DensitySwitch.tsx", "../../../packages/vuu-shell/src/feature/Feature.tsx", "../../../packages/vuu-shell/src/feature/ErrorBoundary.jsx", "../../../packages/vuu-shell/src/feature/Loader.tsx", "../../../packages/vuu-shell/src/login/LoginPanel.tsx", "../../../packages/vuu-shell/src/login/login-utils.ts", "../../../packages/vuu-shell/src/session-editing-form/SessionEditingForm.tsx", "../../../packages/vuu-shell/src/shell.tsx", "../../../packages/vuu-shell/src/ShellContextProvider.tsx", "../../../packages/vuu-shell/src/layout-config/use-layout-config.ts", "../../../packages/vuu-shell/src/layout-config/local-config.ts", "../../../packages/vuu-shell/src/layout-config/remote-config.ts", "../../../packages/vuu-shell/src/app-header/AppHeader.tsx", "../../../packages/vuu-shell/src/user-profile/UserProfile.tsx", "../../../packages/vuu-shell/src/user-profile/UserPanel.tsx", "../../../packages/vuu-shell/src/get-layout-history.ts", "../../../packages/vuu-shell/src/theme-switch/ThemeSwitch.tsx", "../../../packages/vuu-shell/src/theme-provider/ThemeProvider.tsx"],
|
|
4
|
+
"sourcesContent": ["export * from \"./connection-status\";\nexport * from \"./density-switch\";\nexport * from \"./feature\";\nexport * from \"./login\";\nexport * from \"./session-editing-form\";\nexport * from \"./shell\";\nexport * from \"./shellTypes\";\nexport * from \"./ShellContextProvider\";\nexport * from \"./theme-provider\";\nexport * from \"./theme-switch\";\n", "import React, { useEffect, useState } from 'react';\nimport cx from 'classnames';\nimport './ConnectionStatusIcon.css';\n\ntype connectionStatus = 'connected' | 'reconnected' | 'connecting' | 'disconnected';\n\ninterface ConnectionStatusProps {\n\tconnectionStatus: connectionStatus\n\tclassName?: string;\n\tprops?: unknown;\n\telement?: string;\n}\n\nexport const ConnectionStatusIcon = ({ connectionStatus, className, element = 'span', ...props}: ConnectionStatusProps) => {\n\tconst [classBase, setClassBase] = useState<string>('vuuConnectingStatus');\n\tuseEffect(() => {\n\t\tswitch(connectionStatus) {\n\t\t\tcase 'connected':\n\t\t\tcase 'reconnected':\n\t\t\t\tsetClassBase('vuuActiveStatus');\n\t\t\t\tbreak;\n\t\t\tcase 'connecting':\n\t\t\t\tsetClassBase('vuuConnectingStatus');\n\t\t\t\tbreak;\n\t\t\tcase 'disconnected':\n\t\t\t\tsetClassBase('vuuDisconnectedStatus');\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}, [connectionStatus]);\n\n\tconst statusIcon = React.createElement (\n\t\telement,\n\t\t{\n\t\t\t...props,\n\t\t\tclassName: cx('vuuStatus vuuIcon', classBase, className)\n\t\t},\n\t)\n\n\treturn (\n\t\t<>\n\t\t\t<div className='vuuStatus-container salt-theme'>\n\t\t\t\t{statusIcon}\n\t\t\t\t<div\tclassName='vuuStatus-text'>Status: {connectionStatus.toUpperCase()}</div>\n\t\t\t</div>\n\t\t</>\n\t)\n}", "import { Dropdown } from \"@heswell/salt-lab\";\nimport { Density } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport cx from \"classnames\";\n\nconst classBase = \"vuuDensitySwitch\";\n\nconst densities:Density[] = [\"high\", \"medium\", \"low\", \"touch\"];\nconst DEFAULT_DENSITY = \"high\";\n\nexport interface DensitySwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultDensity?: Density;\n density?: Density;\n onDensityChange: (density: Density) => void;\n}\n\nexport const DensitySwitch = ({\n className: classNameProp,\n defaultDensity=DEFAULT_DENSITY,\n onDensityChange,\n}:DensitySwitchProps) => {\n const handleSelectionChange = useCallback((_event, selectedItem) => {\n onDensityChange(selectedItem);\n }, [onDensityChange])\n\n const className = cx(classBase, classNameProp);\n\n return (\n <Dropdown\n className={className}\n source={densities}\n defaultSelected={defaultDensity}\n onSelectionChange={handleSelectionChange}\n />\n )\n}", "import React, { Suspense, useEffect } from \"react\";\nimport { registerComponent } from \"@vuu-ui/vuu-layout\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\nimport { Loader } from \"./Loader\";\n\nconst componentsMap = new Map();\n\nconst useCachedFeature = (url: string) => {\n useEffect(\n () => () => {\n componentsMap.delete(url);\n },\n [url]\n );\n\n if (!componentsMap.has(url)) {\n componentsMap.set(\n url,\n React.lazy(() => import(/* @vite-ignore */ url))\n );\n }\n\n return componentsMap.get(url);\n};\n\nexport interface FeatureProps<Params extends object | undefined = undefined> {\n height?: number;\n url: string;\n css?: string;\n width?: number;\n params: Params;\n}\n\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n params,\n ...props\n}: FeatureProps<Params>) {\n console.log(\"Feature render\", { css, url, props });\n useEffect(() => {\n console.log(\"%cFeature mount\", \"color: green;\");\n return () => {\n console.log(\"%cFeature unmount\", \"color:red;\");\n };\n }, []);\n\n if (css) {\n import(/* @vite-ignore */ css, { assert: { type: \"css\" } }).then(\n (cssModule) => {\n console.log(\"%cInject Styles\", \"color: blue;font-weight: bold\");\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n cssModule.default,\n ];\n }\n );\n }\n\n const LazyFeature = useCachedFeature(url);\n return (\n <ErrorBoundary>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </ErrorBoundary>\n );\n}\n\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n", "import React from 'react';\n// TODO\nexport class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error, errorInfo) {\n // You can also log the error to an error reporting service\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>Something went wrong.</h1>\n <p>{this.state.errorMessage}</p>\n </>\n );\n }\n\n return this.props.children;\n }\n}\n", "// TODO\nexport const Loader = () => <div className=\"hwLoader\">loading</div>;\n", "import { ChangeEvent, HTMLAttributes, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { FormField, Input } from \"@heswell/salt-lab\";\n\nimport \"./LoginPanel.css\";\n\nconst classBase = \"vuuLoginPanel\";\n\nexport interface LoginPanelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\"> {\n onSubmit: (username: string, password: string) => void;\n}\n\nexport const LoginPanel = ({ onSubmit }: LoginPanelProps) => {\n const [username, setUserName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n\n const login = () => {\n onSubmit(username, password);\n };\n\n const handleUsername = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setUserName(value);\n };\n\n const handlePassword = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setPassword(value);\n };\n\n const dataIsValid = username.trim() !== \"\" && password.trim() !== \"\";\n\n return (\n <div className={classBase}>\n <FormField label=\"Username\" style={{ width: 200 }}>\n <Input value={username} id=\"text-username\" onChange={handleUsername} />\n </FormField>\n\n <FormField label=\"Password\" style={{ width: 200 }}>\n <Input\n type=\"password\"\n value={password}\n id=\"text-password\"\n onChange={handlePassword}\n />\n </FormField>\n\n <Button\n className={`${classBase}-login`}\n disabled={!dataIsValid}\n onClick={login}\n variant=\"cta\"\n >\n Login\n </Button>\n </div>\n );\n};\n", "import { getCookieValue } from \"@vuu-ui/vuu-utils\";\n\nexport const getAuthDetailsFromCookies = () => {\n const username = getCookieValue(\"vuu-username\");\n const token = getCookieValue(\"vuu-auth-token\");\n return [username, token];\n};\n\nexport const redirectToLogin = (loginUrl = \"login.html\") => {\n window.location.href = loginUrl;\n};\n\nexport const logout = (loginUrl?: string) => {\n document.cookie = \"vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = \"vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n redirectToLogin(loginUrl);\n};\n", "import {\n ChangeEvent,\n FocusEvent,\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport cx from \"classnames\";\nimport {\n VuuColumnDataType,\n VuuDataRow,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useIdMemo } from \"@salt-ds/core\";\nimport { Button } from \"@salt-ds/core\";\nimport {\n DataSource,\n isErrorResponse,\n RemoteDataSource,\n TableSchema,\n} from \"@vuu-ui/vuu-data\";\nimport {\n buildColumnMap,\n isValidNumber,\n shallowEquals,\n} from \"@vuu-ui/vuu-utils\";\n\nimport \"./SessionEditingForm.css\";\n\ntype FormFieldDescriptor = {\n label?: string;\n name: string;\n type: VuuColumnDataType;\n description: string;\n readonly?: boolean;\n required?: boolean;\n};\n\nexport type FormConfig = {\n title: string;\n key: string;\n fields: FormFieldDescriptor[];\n};\n\nexport interface SessionEditingFormProps\n extends HTMLAttributes<HTMLDivElement> {\n config: FormConfig;\n onClose: () => void;\n dataSource?: DataSource;\n schema?: TableSchema;\n}\n\nconst classBase = \"vuuSessionEditingForm\";\n\nconst getField = (\n fields: FormFieldDescriptor[],\n name: string\n): FormFieldDescriptor => {\n const field = fields.find((f) => f.name === name);\n if (field) {\n return field;\n } else {\n throw Error(`SessionEditingForm, no field '${name}' found`);\n }\n};\n\nconst getFieldNameAndValue = (\n evt: ChangeEvent | FocusEvent\n): [string, string] => {\n const {\n dataset: { field },\n value,\n } = evt.target as HTMLInputElement;\n if (field === undefined) {\n throw Error(\"SessionEditingForm, form field has no field name\");\n }\n return [field, value];\n};\n\nconst Status = {\n uninitialised: 0,\n unchanged: 1,\n changed: 2,\n invalid: 3,\n};\n\nfunction getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined?: false\n): VuuRowDataItemType | undefined;\nfunction getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined: true\n): VuuRowDataItemType;\nfunction getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined = false\n): VuuRowDataItemType | undefined {\n switch (type) {\n case \"int\":\n case \"long\": {\n const typedValue = parseInt(value, 10);\n if (isValidNumber(typedValue)) {\n return typedValue;\n } else if (throwIfUndefined) {\n throw Error(\"SessionEditingForm getTypedValue\");\n } else {\n return undefined;\n }\n }\n\n case \"double\": {\n const typedValue = parseFloat(value);\n if (isValidNumber(typedValue)) {\n return typedValue;\n }\n return undefined;\n }\n\n case \"boolean\":\n return value === \"true\" ? true : false;\n default:\n return value;\n }\n}\n\nconst getDataSource = (\n dataSource?: DataSource,\n schema?: TableSchema\n): DataSource => {\n if (dataSource) {\n return dataSource;\n } else if (schema) {\n return new RemoteDataSource({\n bufferSize: 0,\n table: schema.table,\n columns: schema.columns.map((col) => col.name),\n }) as DataSource;\n } else {\n throw Error(\n \"SessionEditingForm: either a DataSource or a TableSchema must be provided\"\n );\n }\n};\n\ntype FormValues = { [key: string]: VuuRowDataItemType | undefined };\n\nexport const SessionEditingForm = ({\n className,\n config: { fields, key: keyField },\n dataSource: dataSourceProp,\n id: idProp,\n onClose,\n schema,\n ...htmlAttributes\n}: SessionEditingFormProps) => {\n const [values, setValues] = useState<FormValues>();\n const [errorMessage, setErrorMessage] = useState(\"\");\n const formContentRef = useRef<HTMLDivElement>(null);\n const initialDataRef = useRef<FormValues>();\n const dataStatusRef = useRef(Status.uninitialised);\n\n const dataSource = useMemo(() => {\n const applyServerData = (data: VuuDataRow) => {\n if (columnMap) {\n const values: { [key: string]: VuuRowDataItemType } = {};\n for (const column of dataSource.columns) {\n values[column] = data[columnMap[column]];\n }\n if (dataStatusRef.current === Status.uninitialised) {\n dataStatusRef.current = Status.unchanged;\n initialDataRef.current = values;\n }\n setValues(values);\n }\n };\n\n const ds = getDataSource(dataSourceProp, schema);\n const columnMap = buildColumnMap(ds.columns);\n ds.subscribe({ range: { from: 0, to: 5 } }, (message) => {\n if (message.type === \"viewport-update\" && message.rows) {\n if (dataStatusRef.current === Status.uninitialised) {\n applyServerData(message.rows[0]);\n } else {\n console.log(\"what do we do with server updates\");\n }\n }\n });\n return ds;\n }, [dataSourceProp, schema]);\n\n const id = useIdMemo(idProp);\n\n const handleChange = useCallback(\n (evt) => {\n const [field, value] = getFieldNameAndValue(evt);\n const { type } = getField(fields, field);\n const typedValue = getTypedValue(value, type);\n setValues((values = {}) => {\n const newValues = {\n ...values,\n [field]: typedValue,\n };\n const notUpdated = shallowEquals(newValues, initialDataRef.current);\n dataStatusRef.current = notUpdated\n ? Status.unchanged\n : typedValue !== undefined\n ? Status.changed\n : Status.invalid;\n return newValues;\n });\n },\n [fields]\n );\n\n const handleBlur = useCallback(\n (evt: FocusEvent) => {\n const [field, value] = getFieldNameAndValue(evt);\n const { type } = getField(fields, field);\n console.log(\"BLUR\", {\n keyField,\n });\n const rowKey = values?.[keyField];\n const typedValue = getTypedValue(value, type, true);\n if (typeof rowKey === \"string\") {\n dataSource.menuRpcCall({\n rowKey,\n field: field,\n value: typedValue,\n type: \"VP_EDIT_CELL_RPC\",\n });\n }\n },\n [dataSource, fields, keyField, values]\n );\n\n const handleSubmit = useCallback(async () => {\n const response = await dataSource.menuRpcCall({\n type: \"VP_EDIT_SUBMIT_FORM_RPC\",\n });\n if (isErrorResponse(response)) {\n setErrorMessage(response.error);\n }\n }, [dataSource]);\n\n const handleKeyDown = useCallback(\n (evt) => {\n if (evt.key === \"Enter\" && dataStatusRef.current === Status.changed) {\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const handleCancel = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const getFormControl = (field: FormFieldDescriptor) => {\n const value = String(values?.[field.name] ?? \"\");\n if (field.readonly || field.name === keyField) {\n return (\n <div className={`${classBase}-fieldValue vuuReadOnly`}>{value}</div>\n );\n } else {\n return (\n <input\n className={`${classBase}-fieldValue`}\n data-field={field.name}\n onBlur={handleBlur}\n onChange={handleChange}\n type=\"text\"\n value={value}\n id={`${id}-input-${field.name}`}\n />\n );\n }\n };\n\n useEffect(() => {\n if (formContentRef.current) {\n const firstInput = formContentRef.current.querySelector(\n \"input\"\n ) as HTMLInputElement;\n if (firstInput) {\n setTimeout(() => {\n firstInput.focus();\n console.log(\"select item\");\n firstInput.select();\n }, 100);\n }\n }\n }, []);\n\n const isDirty = dataStatusRef.current === Status.changed;\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n {errorMessage ? (\n <div\n className={`${classBase}-errorBanner`}\n data-icon=\"error\"\n title={errorMessage}\n >\n Error, edit(s) not saved\n </div>\n ) : undefined}\n <div\n className={`${classBase}-content`}\n ref={formContentRef}\n onKeyDown={handleKeyDown}\n >\n {fields.map((field) => (\n <div className={`${classBase}-field`} key={field.name}>\n <label\n className={cx(`${classBase}-fieldLabel`, {\n [`${classBase}-required`]: field.required,\n })}\n htmlFor={`${id}-input-${field.name}`}\n >\n {field?.label ?? field.description}\n </label>\n {getFormControl(field)}\n </div>\n ))}\n </div>\n <div className={`${classBase}-buttonbar salt-theme salt-density-high`}>\n <Button\n type=\"submit\"\n variant=\"cta\"\n disabled={!isDirty}\n onClick={handleSubmit}\n >\n Submit\n </Button>\n <Button variant=\"secondary\" onClick={handleCancel}>\n Cancel\n </Button>\n </div>\n </div>\n );\n};\n", "import { connectToServer } from \"@vuu-ui/vuu-data\";\nimport cx from \"classnames\";\nimport {\n HTMLAttributes,\n MouseEvent,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { ShellContextProvider } from \"./ShellContextProvider\";\nimport { useLayoutConfig } from \"./layout-config\";\nimport {\n DockLayout,\n DraggableLayout,\n Drawer,\n Flexbox,\n LayoutProvider,\n View,\n} from \"@vuu-ui/vuu-layout\";\nimport { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { AppHeader } from \"./app-header\";\nimport { ThemeMode } from \"./theme-provider\";\nimport { logger } from \"@vuu-ui/vuu-utils\";\n\nimport \"./shell.css\";\nimport { SaveLocation } from \"./shellTypes\";\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst { error } = logger(\"Shell\");\n\nconst warningLayout = {\n type: \"View\",\n props: {\n style: { height: \"calc(100% - 6px)\" },\n },\n children: [\n {\n props: {\n className: \"vuuShell-warningPlaceholder\",\n },\n type: \"Placeholder\",\n },\n ],\n};\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n defaultLayout?: LayoutJSON;\n leftSidePanel?: ReactElement;\n loginUrl?: string;\n // paletteConfig: any;\n saveLocation?: SaveLocation;\n saveUrl?: string;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n children,\n className: classNameProp,\n defaultLayout = warningLayout,\n leftSidePanel,\n loginUrl,\n saveLocation = \"remote\",\n saveUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const paletteView = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const layoutId = useRef(\"latest\");\n\n const [layout, saveLayoutConfig, loadLayoutById] = useLayoutConfig({\n defaultLayout,\n saveLocation,\n user,\n });\n\n const handleLayoutChange = useCallback(\n (layout) => {\n try {\n saveLayoutConfig(layout);\n } catch {\n error?.(\"Failed to save layout\");\n }\n },\n [saveLayoutConfig]\n );\n\n const handleSwitchTheme = useCallback((mode: ThemeMode) => {\n if (rootRef.current) {\n rootRef.current.dataset.mode = mode;\n }\n }, []);\n\n const handleDrawerClick = (e: MouseEvent<HTMLElement>) => {\n const target = e.target as HTMLElement;\n if (!paletteView.current?.contains(target)) {\n setOpen(!open);\n }\n };\n\n const handleNavigate = useCallback(\n (id) => {\n layoutId.current = id;\n loadLayoutById(id);\n },\n [loadLayoutById]\n );\n\n useEffect(() => {\n if (serverUrl && user.token) {\n connectToServer({\n authToken: user.token,\n url: serverUrl,\n username: user.username,\n });\n }\n }, [serverUrl, user.token, user.username]);\n\n const getDrawers = () => {\n const drawers: ReactElement[] = [];\n if (leftSidePanel) {\n drawers.push(\n <Drawer\n key=\"left-panel\"\n onClick={handleDrawerClick}\n open={open}\n position=\"left\"\n inline\n peekaboo\n sizeOpen={200}\n toggleButton=\"end\"\n >\n <View\n className=\"vuuShell-palette\"\n id=\"vw-app-palette\"\n key=\"app-palette\"\n ref={paletteView}\n style={{ height: \"100%\" }}\n >\n {leftSidePanel}\n </View>\n </Drawer>\n );\n }\n\n return drawers;\n };\n\n const className = cx(\n \"vuuShell\",\n classNameProp,\n \"salt-theme\",\n \"salt-density-high\"\n );\n\n return (\n // ShellContext TBD\n <ShellContextProvider value={undefined}>\n <LayoutProvider layout={layout} onLayoutChange={handleLayoutChange}>\n <DraggableLayout\n className={className}\n data-mode=\"light\"\n ref={rootRef}\n {...htmlAttributes}\n >\n <Flexbox\n className=\"App\"\n style={{ flexDirection: \"column\", height: \"100%\", width: \"100%\" }}\n >\n <AppHeader\n layoutId={layoutId.current}\n loginUrl={loginUrl}\n user={user}\n onNavigate={handleNavigate}\n onSwitchTheme={handleSwitchTheme}\n />\n <DockLayout style={{ flex: 1 }}>\n {getDrawers().concat(\n <DraggableLayout\n dropTarget\n key=\"main-content\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n </DockLayout>\n </Flexbox>\n </DraggableLayout>\n </LayoutProvider>\n {children}\n </ShellContextProvider>\n );\n};\n", "import { MenuRpcResponse } from \"@vuu-ui/vuu-data\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\n\nexport interface ShellContextProps {\n getDefaultColumnConfig?: (\n tableName: string,\n columnName: string\n ) => Partial<ColumnDescriptor>;\n handleRpcResponse?: (response?: MenuRpcResponse) => void;\n}\n\nconst defaultConfig = {};\n\nconst ShellContext = createContext<ShellContextProps>(defaultConfig);\n\nexport interface ShellProviderProps {\n children: ReactNode;\n value?: ShellContextProps;\n}\n\nconst Provider = ({\n children,\n context,\n inheritedContext,\n}: {\n children: ReactNode;\n context?: ShellContextProps;\n inheritedContext?: ShellContextProps;\n}) => {\n // TODO functions provided at multiple levels must be merged\n const mergedContext = {\n ...inheritedContext,\n ...context,\n };\n return (\n <ShellContext.Provider value={mergedContext}>\n {children}\n </ShellContext.Provider>\n );\n};\n\nexport const ShellContextProvider = ({\n children,\n value,\n}: ShellProviderProps): ReactElement => {\n return (\n <ShellContext.Consumer>\n {(context) => (\n <Provider context={value} inheritedContext={context}>\n {children}\n </Provider>\n )}\n </ShellContext.Consumer>\n );\n};\n\nexport const useShellContext = () => {\n return useContext(ShellContext);\n};\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { SaveLocation } from \"../shellTypes\";\nimport { loadLocalConfig, saveLocalConfig } from \"./local-config\";\nimport { loadRemoteConfig, saveRemoteConfig } from \"./remote-config\";\n\nexport interface LayoutConfigHookProps {\n defaultLayout: LayoutJSON;\n saveLocation: SaveLocation;\n saveUrl?: string;\n user: VuuUser;\n}\n\nexport type LayoutHookResult = [\n LayoutJSON,\n (layout: LayoutJSON) => void,\n (id: string) => void\n];\n\nexport const useLayoutConfig = ({\n saveLocation,\n saveUrl = \"api/vui\",\n user,\n defaultLayout,\n}: LayoutConfigHookProps): LayoutHookResult => {\n const [layout, _setLayout] = useState(defaultLayout);\n const usingRemote = saveLocation === \"remote\";\n const loadConfig = usingRemote ? loadRemoteConfig : loadLocalConfig;\n const saveConfig = usingRemote ? saveRemoteConfig : saveLocalConfig;\n\n const setLayout = (layout: LayoutJSON) => {\n _setLayout(layout);\n };\n\n const load = useCallback(\n async (id = \"latest\") => {\n try {\n const layout = await loadConfig(saveUrl, user, id);\n setLayout(layout);\n } catch {\n setLayout(defaultLayout);\n }\n },\n [defaultLayout, loadConfig, saveUrl, user]\n );\n\n useEffect(() => {\n load();\n }, [load]);\n\n const saveData = useCallback(\n (data) => {\n saveConfig(saveUrl, user, data);\n },\n [saveConfig, saveUrl, user]\n );\n\n const loadLayoutById = useCallback(\n (id) => {\n load(id);\n },\n [load]\n );\n\n return [layout, saveData, loadLayoutById];\n};\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { VuuUser } from \"../shell\";\n\nexport const loadLocalConfig = (\n saveUrl: string,\n user: VuuUser,\n id = \"latest\"\n): Promise<LayoutJSON> =>\n new Promise((resolve, reject) => {\n console.log(\n `load local config at ${saveUrl} for user ${user.username}, id ${id}`\n );\n const data = localStorage.getItem(saveUrl);\n if (data) {\n const layout = JSON.parse(data);\n resolve(layout);\n } else {\n reject();\n }\n });\n\nexport const saveLocalConfig = (\n saveUrl: string,\n user: VuuUser,\n data: LayoutJSON\n): Promise<undefined> =>\n new Promise((resolve, reject) => {\n try {\n localStorage.setItem(saveUrl, JSON.stringify(data));\n resolve(undefined);\n } catch {\n reject();\n }\n });\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { VuuUser } from \"../shell\";\n\nexport const loadRemoteConfig = (\n saveUrl: string,\n user: VuuUser,\n id = \"latest\"\n): Promise<LayoutJSON> =>\n new Promise((resolve, reject) => {\n fetch(`${saveUrl}/${user.username}/${id}`, {})\n .then((response) => {\n if (response.ok) {\n resolve(response.json());\n } else {\n reject(undefined);\n }\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n // setLayout(defaultLayout);\n reject(undefined);\n });\n });\n\nexport const saveRemoteConfig = (\n saveUrl: string,\n user: VuuUser,\n data: LayoutJSON\n) =>\n new Promise((resolve, reject) => {\n fetch(`${saveUrl}/${user.username}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }).then((response) => {\n if (response.ok) {\n resolve(undefined);\n } else {\n reject();\n }\n });\n });\n", "import { HTMLAttributes, useCallback } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { UserProfile } from \"../user-profile\";\nimport { ThemeSwitch } from \"../theme-switch\";\nimport { ThemeMode } from \"../theme-provider\";\nimport cx from \"classnames\";\n\nimport \"./AppHeader.css\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n onSwitchTheme?: (mode: ThemeMode) => void;\n themeMode?: ThemeMode;\n user: VuuUser;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n layoutId,\n loginUrl,\n onNavigate,\n onSwitchTheme,\n themeMode = \"light\",\n user,\n ...htmlAttributes\n}: AppHeaderProps) => {\n const className = cx(classBase, classNameProp);\n const handleSwitchTheme = useCallback(\n (mode: ThemeMode) => onSwitchTheme?.(mode),\n [onSwitchTheme]\n );\n return (\n <header className={className} {...htmlAttributes}>\n <ThemeSwitch defaultMode={themeMode} onChange={handleSwitchTheme} />\n <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n />\n </header>\n );\n};\n", "import { Button } from \"@salt-ds/core\";\nimport { DropdownBase } from \"@heswell/salt-lab\";\nimport { UserSolidIcon } from \"@salt-ds/icons\";\nimport { UserPanel } from \"./UserPanel\";\n\nimport \"./UserProfile.css\";\nimport { VuuUser } from \"../shell\";\n\nexport interface UserProfileProps {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n}\n\nexport const UserProfile = ({\n layoutId,\n loginUrl,\n onNavigate,\n user,\n}: UserProfileProps) => {\n const handleNavigate = (id: string) => {\n onNavigate(id);\n };\n\n return (\n <DropdownBase className=\"vuuUserProfile\" placement=\"bottom-end\">\n <Button variant=\"secondary\">\n <UserSolidIcon />\n </Button>\n <UserPanel\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={handleNavigate}\n user={user}\n />\n </DropdownBase>\n );\n};\n", "import { formatDate } from \"@vuu-ui/vuu-utils\";\nimport { List, ListItem, ListItemProps } from \"@heswell/salt-lab\";\nimport { Button } from \"@salt-ds/core\";\nimport { ExportIcon } from \"@salt-ds/icons\";\nimport {\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { getLayoutHistory, LayoutHistoryItem } from \"../get-layout-history\";\nimport { logout } from \"../login\";\nimport { VuuUser } from \"../shell\";\n\nimport \"./UserPanel.css\";\n\nconst byLastUpdate = (\n { lastUpdate: l1 }: LayoutHistoryItem,\n { lastUpdate: l2 }: LayoutHistoryItem\n) => {\n return l2 === l1 ? 0 : l2 < l1 ? -1 : 1;\n};\n\ntype HistoryEntry = {\n id: string;\n label: string;\n lastUpdate: number;\n};\n\nconst HistoryListItem = (props: ListItemProps<HistoryEntry>) => {\n return <ListItem {...props} />;\n};\n\nexport interface UserPanelProps extends HTMLAttributes<HTMLDivElement> {\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n layoutId: string;\n}\n\nexport const UserPanel = forwardRef(function UserPanel(\n { loginUrl, onNavigate, user, layoutId = \"latest\" }: UserPanelProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const [history, setHistory] = useState<HistoryEntry[]>([]);\n\n useEffect(() => {\n async function getHistory() {\n const history = await getLayoutHistory(user);\n const sortedHistory = history\n .filter((item) => item.id !== \"latest\")\n .sort(byLastUpdate)\n .map<HistoryEntry>(({ id, lastUpdate }) => ({\n lastUpdate,\n id,\n label: `Saved at ${formatDate(new Date(lastUpdate), \"kk:mm:ss\")}`,\n }));\n console.log({ sortedHistory });\n setHistory(sortedHistory);\n }\n\n getHistory();\n }, [user]);\n\n const handleHisorySelected = useCallback(\n (evt, selected) => {\n if (selected) {\n onNavigate(selected.id);\n }\n },\n [onNavigate]\n );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const selected =\n history.length === 0\n ? null\n : layoutId === \"latest\"\n ? history[0]\n : history.find((i) => i.id === layoutId);\n\n return (\n <div className=\"vuuUserPanel\" ref={forwardedRef}>\n <List<HistoryEntry>\n ListItem={HistoryListItem}\n className=\"vuuUserPanel-history\"\n onSelect={handleHisorySelected}\n selected={selected}\n source={history}\n />\n <div className=\"vuuUserPanel-buttonBar\">\n <Button aria-label=\"logout\" onClick={handleLogout}>\n <ExportIcon /> Logout\n </Button>\n </div>\n </div>\n );\n});\n", "import { VuuUser } from \"./shell\";\n\nexport interface LayoutHistoryItem {\n user: string;\n id: string;\n uniqueId: string;\n lastUpdate: number;\n}\n\nexport const getLayoutHistory = async (\n user: VuuUser\n): Promise<LayoutHistoryItem[]> => {\n const history = await fetch(`api/vui/${user.username}`, {})\n .then((response) => {\n return response.ok ? response.json() : null;\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n console.log(\"error getting history\");\n });\n\n return history;\n};\n", "import {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupChangeEventHandler,\n} from \"@heswell/salt-lab\";\nimport cx from \"classnames\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback } from \"react\";\n\nimport \"./ThemeSwitch.css\";\nimport { ThemeMode } from \"../theme-provider\";\n\nconst classBase = \"vuuThemeSwitch\";\nexport interface ThemeSwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultMode?: ThemeMode;\n mode?: ThemeMode;\n onChange: (mode: ThemeMode) => void;\n}\n\nconst modes: ThemeMode[] = [\"light\", \"dark\"];\n\nexport const ThemeSwitch = ({\n className: classNameProp,\n defaultMode: defaultModeProp,\n mode: modeProp,\n onChange,\n ...htmlAttributes\n}: ThemeSwitchProps) => {\n const [mode, setMode] = useControlled<ThemeMode>({\n controlled: modeProp,\n default: defaultModeProp ?? \"light\",\n name: \"ThemeSwitch\",\n state: \"mode\",\n });\n\n const selectedIndex = modes.indexOf(mode);\n\n const handleChangeSecondary: ToggleButtonGroupChangeEventHandler =\n useCallback(\n (_evt, index) => {\n const mode = modes[index];\n setMode(mode);\n onChange(mode);\n },\n [onChange, setMode]\n );\n const className = cx(classBase, classNameProp);\n return (\n <ToggleButtonGroup\n className={className}\n {...htmlAttributes}\n onChange={handleChangeSecondary}\n selectedIndex={selectedIndex}\n >\n <ToggleButton\n aria-label=\"alert\"\n tooltipText=\"Light Theme\"\n data-icon=\"light\"\n />\n <ToggleButton\n aria-label=\"home\"\n tooltipText=\"Dark Theme\"\n data-icon=\"dark\"\n />\n </ToggleButtonGroup>\n );\n};\n", "import React, {\n createContext,\n HTMLAttributes,\n ReactNode,\n ReactElement,\n isValidElement,\n cloneElement,\n useContext,\n} from \"react\";\nimport cx from \"classnames\";\n\nexport const DEFAULT_DENSITY: Density = \"medium\";\nexport const DEFAULT_THEME = \"salt-theme\";\nexport const DEFAULT_THEME_MODE: ThemeMode = \"light\";\n\nexport type Density = \"high\" | \"medium\" | \"low\" | \"touch\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type TargetElement = \"root\" | \"scope\" | \"child\";\n\nexport interface ThemeContextProps {\n density: Density;\n theme: string;\n themeMode: ThemeMode;\n}\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n density: \"high\",\n theme: \"salt-theme\",\n themeMode: \"light\",\n});\n\nconst createThemedChildren = (\n children: ReactNode,\n theme: string,\n themeMode: ThemeMode,\n density: Density\n) => {\n if (isValidElement<HTMLAttributes<HTMLElement>>(children)) {\n return cloneElement(children, {\n className: cx(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n children.props?.className,\n theme,\n `salt-density-${density}`\n ),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n \"data-mode\": themeMode,\n });\n } else {\n console.warn(\n `\\nThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.\n Wrap elements with a single container`\n );\n return children;\n }\n};\n\ninterface ThemeProviderProps {\n children: ReactElement;\n density?: Density;\n theme?: string;\n themeMode?: ThemeMode;\n applyClassesTo?: TargetElement;\n}\n\nexport const ThemeProvider = ({\n children,\n theme: themeProp,\n themeMode: themeModeProp,\n density: densityProp,\n}: ThemeProviderProps) => {\n const {\n density: inheritedDensity,\n themeMode: inheritedThemeMode,\n theme: inheritedTheme,\n } = useContext(ThemeContext);\n\n const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;\n const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;\n const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;\n const themedChildren = createThemedChildren(\n children,\n theme,\n themeMode,\n density\n );\n\n return (\n <ThemeContext.Provider value={{ themeMode, density, theme }}>\n {themedChildren}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["src_exports", "__export", "ConnectionStatusIcon", "DEFAULT_DENSITY", "DEFAULT_THEME", "DEFAULT_THEME_MODE", "DensitySwitch", "Feature", "LoginPanel", "SessionEditingForm", "Shell", "ShellContextProvider", "ThemeContext", "ThemeProvider", "ThemeSwitch", "getAuthDetailsFromCookies", "logout", "redirectToLogin", "useShellContext", "__toCommonJS", "import_react", "import_classnames", "import_jsx_runtime", "ConnectionStatusIcon", "connectionStatus", "className", "element", "props", "classBase", "setClassBase", "statusIcon", "React", "cx", "import_salt_lab", "import_react", "import_classnames", "import_jsx_runtime", "classBase", "densities", "DEFAULT_DENSITY", "DensitySwitch", "classNameProp", "defaultDensity", "onDensityChange", "handleSelectionChange", "_event", "selectedItem", "className", "cx", "import_react", "import_vuu_layout", "import_react", "import_jsx_runtime", "ErrorBoundary", "React", "props", "error", "errorInfo", "import_jsx_runtime", "Loader", "import_jsx_runtime", "componentsMap", "useCachedFeature", "url", "React", "RawFeature", "css", "params", "props", "cssModule", "LazyFeature", "ErrorBoundary", "Loader", "Feature", "import_react", "import_core", "import_salt_lab", "import_jsx_runtime", "classBase", "LoginPanel", "onSubmit", "username", "setUserName", "password", "setPassword", "login", "handleUsername", "_event", "value", "handlePassword", "dataIsValid", "import_vuu_utils", "getAuthDetailsFromCookies", "username", "token", "redirectToLogin", "loginUrl", "logout", "import_react", "import_classnames", "import_core", "import_vuu_data", "import_vuu_utils", "import_jsx_runtime", "classBase", "getField", "fields", "name", "field", "f", "getFieldNameAndValue", "evt", "value", "Status", "getTypedValue", "type", "throwIfUndefined", "typedValue", "getDataSource", "dataSource", "schema", "col", "SessionEditingForm", "className", "keyField", "dataSourceProp", "idProp", "onClose", "htmlAttributes", "values", "setValues", "errorMessage", "setErrorMessage", "formContentRef", "initialDataRef", "dataStatusRef", "applyServerData", "data", "columnMap", "column", "ds", "message", "id", "handleChange", "newValues", "notUpdated", "handleBlur", "rowKey", "handleSubmit", "response", "handleKeyDown", "handleCancel", "getFormControl", "_a", "firstInput", "isDirty", "cx", "import_vuu_data", "import_classnames", "import_react", "import_react", "import_jsx_runtime", "defaultConfig", "ShellContext", "Provider", "children", "context", "inheritedContext", "mergedContext", "ShellContextProvider", "value", "useShellContext", "import_react", "loadLocalConfig", "saveUrl", "user", "id", "resolve", "reject", "data", "layout", "saveLocalConfig", "loadRemoteConfig", "saveUrl", "user", "id", "resolve", "reject", "response", "saveRemoteConfig", "data", "useLayoutConfig", "saveLocation", "saveUrl", "user", "defaultLayout", "layout", "_setLayout", "usingRemote", "loadConfig", "loadRemoteConfig", "loadLocalConfig", "saveConfig", "saveRemoteConfig", "saveLocalConfig", "setLayout", "load", "id", "saveData", "data", "loadLayoutById", "import_vuu_layout", "import_react", "import_core", "import_salt_lab", "import_icons", "import_vuu_utils", "import_salt_lab", "import_core", "import_icons", "import_react", "getLayoutHistory", "user", "response", "import_jsx_runtime", "byLastUpdate", "l1", "l2", "HistoryListItem", "props", "UserPanel", "loginUrl", "onNavigate", "user", "layoutId", "forwardedRef", "history", "setHistory", "getHistory", "sortedHistory", "getLayoutHistory", "item", "id", "lastUpdate", "handleHisorySelected", "evt", "selected", "handleLogout", "logout", "i", "import_jsx_runtime", "UserProfile", "layoutId", "loginUrl", "onNavigate", "user", "UserPanel", "id", "import_salt_lab", "import_classnames", "import_core", "import_react", "import_jsx_runtime", "classBase", "modes", "ThemeSwitch", "classNameProp", "defaultModeProp", "modeProp", "onChange", "htmlAttributes", "mode", "setMode", "selectedIndex", "handleChangeSecondary", "_evt", "index", "className", "cx", "import_classnames", "import_jsx_runtime", "classBase", "AppHeader", "classNameProp", "layoutId", "loginUrl", "onNavigate", "onSwitchTheme", "themeMode", "user", "htmlAttributes", "className", "cx", "handleSwitchTheme", "mode", "ThemeSwitch", "UserProfile", "import_vuu_utils", "import_jsx_runtime", "error", "warningLayout", "Shell", "children", "classNameProp", "defaultLayout", "leftSidePanel", "loginUrl", "saveLocation", "saveUrl", "serverUrl", "user", "htmlAttributes", "rootRef", "paletteView", "open", "setOpen", "layoutId", "layout", "saveLayoutConfig", "loadLayoutById", "useLayoutConfig", "handleLayoutChange", "handleSwitchTheme", "mode", "handleDrawerClick", "e", "_a", "target", "handleNavigate", "id", "getDrawers", "drawers", "className", "cx", "ShellContextProvider", "AppHeader", "import_react", "import_classnames", "import_jsx_runtime", "DEFAULT_DENSITY", "DEFAULT_THEME", "DEFAULT_THEME_MODE", "ThemeContext", "createThemedChildren", "children", "theme", "themeMode", "density", "_a", "cx", "ThemeProvider", "themeProp", "themeModeProp", "densityProp", "_b", "_c", "inheritedDensity", "inheritedThemeMode", "inheritedTheme", "themedChildren"]
|
|
7
7
|
}
|
package/esm/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import me,{useEffect as ce,useState as ue}from"react";import de from"classnames";import{Fragment as pe,jsx as he,jsxs as H}from"react/jsx-runtime";var Rt=({connectionStatus:t,className:e,element:o="span",...r})=>{let[n,s]=ue("vuuConnectingStatus");ce(()=>{switch(t){case"connected":case"reconnected":s("vuuActiveStatus");break;case"connecting":s("vuuConnectingStatus");break;case"disconnected":s("vuuDisconnectedStatus");break;default:break}},[t]);let a=me.createElement(o,{...r,className:de("vuuStatus vuuIcon",n,e)});return he(pe,{children:H("div",{className:"vuuStatus-container salt-theme",children:[a,H("div",{className:"vuuStatus-text",children:["Status: ",t.toUpperCase()]})]})})};import{Dropdown as ge}from"@heswell/salt-lab";import{useCallback as fe}from"react";import ye from"classnames";import{jsx as Ce}from"react/jsx-runtime";var ve="vuuDensitySwitch",xe=["high","medium","low","touch"],Te="high",Jt=({className:t,defaultDensity:e=Te,onDensityChange:o})=>{let r=fe((s,a)=>{o(a)},[o]),n=ye(ve,t);return Ce(ge,{className:n,source:xe,defaultSelected:e,onSelectionChange:r})};import k,{Suspense as Ee}from"react";import{registerComponent as we}from"@vuu-ui/vuu-layout";import Le from"react";import{Fragment as Se,jsx as N,jsxs as Pe}from"react/jsx-runtime";var x=class extends Le.Component{constructor(e){super(e),this.state={errorMessage:null}}static getDerivedStateFromError(e){return{errorMessage:e.message}}componentDidCatch(e,o){console.log(e,o)}render(){return this.state.errorMessage?Pe(Se,{children:[N("h1",{children:"Something went wrong."}),N("p",{children:this.state.errorMessage})]}):this.props.children}};import{jsx as Me}from"react/jsx-runtime";var b=()=>Me("div",{className:"hwLoader",children:"loading"});import{jsx as T}from"react/jsx-runtime";function De({url:t,css:e,params:o,...r}){e&&import(e).then(s=>{document.adoptedStyleSheets=[...document.adoptedStyleSheets,s.default]});let n=k.lazy(()=>import(t));return T(x,{children:T(Ee,{fallback:T(b,{}),children:T(n,{...r,...o})})})}var U=k.memo(De);U.displayName="Feature";we("Feature",U,"view");import{useState as I}from"react";import{Button as He}from"@salt-ds/core";import{FormField as R,Input as A}from"@heswell/salt-lab";import{jsx as v,jsxs as Ne}from"react/jsx-runtime";var B="vuuLoginPanel",yo=({onSubmit:t})=>{let[e,o]=I(""),[r,n]=I(""),s=()=>{t(e,r)},a=(l,c)=>{o(c)},m=(l,c)=>{n(c)},i=e.trim()!==""&&r.trim()!=="";return Ne("div",{className:B,children:[v(R,{label:"Username",style:{width:200},children:v(A,{value:e,id:"text-username",onChange:a})}),v(R,{label:"Password",style:{width:200},children:v(A,{type:"password",value:r,id:"text-password",onChange:m})}),v(He,{className:`${B}-login`,disabled:!i,onClick:s,variant:"cta",children:"Login"})]})};import{getCookieValue as F}from"@vuu-ui/vuu-utils";var Co=()=>{let t=F("vuu-username"),e=F("vuu-auth-token");return[t,e]},be=(t="login.html")=>{window.location.href=t},V=t=>{document.cookie="vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",document.cookie="vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",be(t)};import{connectToServer as mt}from"@vuu-ui/vuu-data";import ct from"classnames";import{useCallback as E,useEffect as ut,useRef as w,useState as dt}from"react";import{createContext as ke,useContext as Ue}from"react";import{jsx as L}from"react/jsx-runtime";var Ie={},S=ke(Ie),Re=({children:t,context:e,inheritedContext:o})=>{let r={...o,...e};return L(S.Provider,{value:r,children:t})},O=({children:t,value:e})=>L(S.Consumer,{children:o=>L(Re,{context:e,inheritedContext:o,children:t})}),Ho=()=>Ue(S);import{useCallback as P,useEffect as Ae,useState as Be}from"react";var Fe=(t,e)=>{let[o,r]=Be(e),n=i=>{r(i)},s=P(async(i="latest")=>{fetch(`api/vui/${t.username}/${i}`,{}).then(l=>l.ok?l.json():e).then(n).catch(()=>{n(e)})},[e,t.username]);Ae(()=>{s()},[s]);let a=P(i=>{fetch(`api/vui/${t.username}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(l=>l.ok?l.json():e)},[e,t]),m=P(i=>{s(i)},[s]);return[o,a,m]},_=Fe;import{DockLayout as pt,DraggableLayout as j,Drawer as ht,Flexbox as gt,LayoutProvider as ft,View as yt}from"@vuu-ui/vuu-layout";import{useCallback as st}from"react";import{Button as Ke}from"@salt-ds/core";import{DropdownBase as Qe}from"@heswell/salt-lab";import{UserSolidIcon as Xe}from"@salt-ds/icons";import{formatDate as Ve}from"@vuu-ui/vuu-utils";import{List as Oe,ListItem as _e}from"@heswell/salt-lab";import{Button as $e}from"@salt-ds/core";import{ExportIcon as Ge}from"@salt-ds/icons";import{forwardRef as Je,useCallback as G,useEffect as ze,useState as Ye}from"react";var $=async t=>await fetch(`api/vui/${t.username}`,{}).then(o=>o.ok?o.json():null).catch(()=>{console.log("error getting history")});import{jsx as C,jsxs as J}from"react/jsx-runtime";var qe=({lastUpdate:t},{lastUpdate:e})=>e===t?0:e<t?-1:1,We=t=>C(_e,{...t}),z=Je(function({loginUrl:e,onNavigate:o,user:r,layoutId:n="latest"},s){let[a,m]=Ye([]);ze(()=>{async function d(){let h=(await $(r)).filter(f=>f.id!=="latest").sort(qe).map(({id:f,lastUpdate:y})=>({lastUpdate:y,id:f,label:`Saved at ${Ve(new Date(y),"kk:mm:ss")}`}));console.log({sortedHistory:h}),m(h)}d()},[r]);let i=G((d,u)=>{u&&o(u.id)},[o]),l=G(()=>{V(e)},[e]),c=a.length===0?null:n==="latest"?a[0]:a.find(d=>d.id===n);return J("div",{className:"vuuUserPanel",ref:s,children:[C(Oe,{ListItem:We,className:"vuuUserPanel-history",onSelect:i,selected:c,source:a}),C("div",{className:"vuuUserPanel-buttonBar",children:J($e,{"aria-label":"logout",onClick:l,children:[C(Ge,{})," Logout"]})})]})});import{jsx as M,jsxs as Ze}from"react/jsx-runtime";var Y=({layoutId:t,loginUrl:e,onNavigate:o,user:r})=>Ze(Qe,{className:"vuuUserProfile",placement:"bottom-end",children:[M(Ke,{variant:"secondary",children:M(Xe,{})}),M(z,{layoutId:t,loginUrl:e,onNavigate:s=>{o(s)},user:r})]});import{ToggleButton as q,ToggleButtonGroup as je}from"@heswell/salt-lab";import et from"classnames";import{useControlled as tt}from"@salt-ds/core";import{useCallback as ot}from"react";import{jsx as K,jsxs as nt}from"react/jsx-runtime";var rt="vuuThemeSwitch",W=["light","dark"],Q=({className:t,defaultMode:e,mode:o,onChange:r,...n})=>{let[s,a]=tt({controlled:o,default:e!=null?e:"light",name:"ThemeSwitch",state:"mode"}),m=W.indexOf(s),i=ot((c,d)=>{let u=W[d];a(u),r(u)},[r,a]),l=et(rt,t);return nt(je,{className:l,...n,onChange:i,selectedIndex:m,children:[K(q,{"aria-label":"alert",tooltipText:"Light Theme","data-icon":"light"}),K(q,{"aria-label":"home",tooltipText:"Dark Theme","data-icon":"dark"})]})};import at from"classnames";import{jsx as X,jsxs as lt}from"react/jsx-runtime";var it="vuuAppHeader",Z=({className:t,layoutId:e,loginUrl:o,onNavigate:r,onSwitchTheme:n,themeMode:s="light",user:a,...m})=>{let i=at(it,t),l=st(c=>n==null?void 0:n(c),[n]);return lt("header",{className:i,...m,children:[X(Q,{defaultMode:s,onChange:l}),X(Y,{layoutId:e,loginUrl:o,onNavigate:r,user:a})]})};import{jsx as g,jsxs as ee}from"react/jsx-runtime";var vt={type:"View",props:{style:{height:"calc(100% - 6px)"}},children:[{props:{className:"vuuShell-warningPlaceholder"},type:"Placeholder"}]},qr=({children:t,className:e,defaultLayout:o=vt,leftSidePanel:r,loginUrl:n,serverUrl:s,user:a,...m})=>{let i=w(null),l=w(null),[c,d]=dt(!1),u=w("latest"),[h,f,y]=_(a,o),oe=E(p=>{f(p)},[f]),re=E(p=>{i.current&&(i.current.dataset.mode=p)},[]),ne=p=>{var D;let le=p.target;(D=l.current)!=null&&D.contains(le)||d(!c)},se=E(p=>{u.current=p,y(p)},[y]);ut(()=>{s&&a.token&&mt({authToken:a.token,url:s,username:a.username})},[s,a.token,a.username]);let ae=()=>{let p=[];return r&&p.push(g(ht,{onClick:ne,open:c,position:"left",inline:!0,peekaboo:!0,sizeOpen:200,toggleButton:"end",children:g(yt,{className:"vuuShell-palette",id:"vw-app-palette",ref:l,style:{height:"100%"},children:r},"app-palette")},"left-panel")),p},ie=ct("vuuShell",e,"salt-theme","salt-density-high");return ee(O,{value:void 0,children:[g(ft,{layout:h,onLayoutChange:oe,children:g(j,{className:ie,"data-mode":"light",ref:i,...m,children:ee(gt,{className:"App",style:{flexDirection:"column",height:"100%",width:"100%"},children:[g(Z,{layoutId:u.current,loginUrl:n,user:a,onNavigate:se,onSwitchTheme:re}),g(pt,{style:{flex:1},children:ae().concat(g(j,{dropTarget:!0,style:{width:"100%",height:"100%"}},"main-content"))})]})})}),t]})};import{createContext as xt,isValidElement as Tt,cloneElement as Ct,useContext as Lt}from"react";import St from"classnames";import{jsx as Ht}from"react/jsx-runtime";var Pt="medium",Mt="salt-theme",Et="light",te=xt({density:"high",theme:"salt-theme",themeMode:"light"}),wt=(t,e,o,r)=>{var n;return Tt(t)?Ct(t,{className:St((n=t.props)==null?void 0:n.className,e,`salt-density-${r}`),"data-mode":o}):(console.warn(`
|
|
1
|
+
import Ue,{useEffect as Ie,useState as Be}from"react";import Ae from"classnames";import{Fragment as Oe,jsx as $e,jsxs as Q}from"react/jsx-runtime";var vo=({connectionStatus:e,className:t,element:o="span",...r})=>{let[s,a]=Be("vuuConnectingStatus");Ie(()=>{switch(e){case"connected":case"reconnected":a("vuuActiveStatus");break;case"connecting":a("vuuConnectingStatus");break;case"disconnected":a("vuuDisconnectedStatus");break;default:break}},[e]);let l=Ue.createElement(o,{...r,className:Ae("vuuStatus vuuIcon",s,t)});return $e(Oe,{children:Q("div",{className:"vuuStatus-container salt-theme",children:[l,Q("div",{className:"vuuStatus-text",children:["Status: ",e.toUpperCase()]})]})})};import{Dropdown as Je}from"@heswell/salt-lab";import{useCallback as _e}from"react";import qe from"classnames";import{jsx as Ye}from"react/jsx-runtime";var Ge="vuuDensitySwitch",ze=["high","medium","low","touch"],Ke="high",bo=({className:e,defaultDensity:t=Ke,onDensityChange:o})=>{let r=_e((a,l)=>{o(l)},[o]),s=qe(Ge,e);return Ye(Je,{className:s,source:ze,defaultSelected:t,onSelectionChange:r})};import j,{Suspense as je,useEffect as ee}from"react";import{registerComponent as et}from"@vuu-ui/vuu-layout";import We from"react";import{Fragment as Qe,jsx as X,jsxs as Xe}from"react/jsx-runtime";var H=class extends We.Component{constructor(t){super(t),this.state={errorMessage:null}}static getDerivedStateFromError(t){return{errorMessage:t.message}}componentDidCatch(t,o){console.log(t,o)}render(){return this.state.errorMessage?Xe(Qe,{children:[X("h1",{children:"Something went wrong."}),X("p",{children:this.state.errorMessage})]}):this.props.children}};import{jsx as Ze}from"react/jsx-runtime";var Z=()=>Ze("div",{className:"hwLoader",children:"loading"});import{jsx as F}from"react/jsx-runtime";var R=new Map,tt=e=>(ee(()=>()=>{R.delete(e)},[e]),R.has(e)||R.set(e,j.lazy(()=>import(e))),R.get(e));function ot({url:e,css:t,params:o,...r}){console.log("Feature render",{css:t,url:e,props:r}),ee(()=>(console.log("%cFeature mount","color: green;"),()=>{console.log("%cFeature unmount","color:red;")}),[]),t&&import(t).then(a=>{console.log("%cInject Styles","color: blue;font-weight: bold"),document.adoptedStyleSheets=[...document.adoptedStyleSheets,a.default]});let s=tt(e);return F(H,{children:F(je,{fallback:F(Z,{}),children:F(s,{...r,...o})})})}var te=j.memo(ot);te.displayName="Feature";et("Feature",te,"view");import{useState as oe}from"react";import{Button as rt}from"@salt-ds/core";import{FormField as re,Input as ne}from"@heswell/salt-lab";import{jsx as M,jsxs as nt}from"react/jsx-runtime";var se="vuuLoginPanel",jo=({onSubmit:e})=>{let[t,o]=oe(""),[r,s]=oe(""),a=()=>{e(t,r)},l=(m,u)=>{o(u)},c=(m,u)=>{s(u)},i=t.trim()!==""&&r.trim()!=="";return nt("div",{className:se,children:[M(re,{label:"Username",style:{width:200},children:M(ne,{value:t,id:"text-username",onChange:l})}),M(re,{label:"Password",style:{width:200},children:M(ne,{type:"password",value:r,id:"text-password",onChange:c})}),M(rt,{className:`${se}-login`,disabled:!i,onClick:a,variant:"cta",children:"Login"})]})};import{getCookieValue as ae}from"@vuu-ui/vuu-utils";var rr=()=>{let e=ae("vuu-username"),t=ae("vuu-auth-token");return[e,t]},st=(e="login.html")=>{window.location.href=e},ie=e=>{document.cookie="vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",document.cookie="vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT",st(e)};import{useCallback as P,useEffect as at,useMemo as it,useRef as O,useState as le}from"react";import ue from"classnames";import{useIdMemo as lt}from"@salt-ds/core";import{Button as ce}from"@salt-ds/core";import{isErrorResponse as ut,RemoteDataSource as ct}from"@vuu-ui/vuu-data";import{buildColumnMap as mt,isValidNumber as me,shallowEquals as dt}from"@vuu-ui/vuu-utils";import{jsx as L,jsxs as $}from"react/jsx-runtime";var x="vuuSessionEditingForm",de=(e,t)=>{let o=e.find(r=>r.name===t);if(o)return o;throw Error(`SessionEditingForm, no field '${t}' found`)},pe=e=>{let{dataset:{field:t},value:o}=e.target;if(t===void 0)throw Error("SessionEditingForm, form field has no field name");return[t,o]},C={uninitialised:0,unchanged:1,changed:2,invalid:3};function fe(e,t,o=!1){switch(t){case"int":case"long":{let r=parseInt(e,10);if(me(r))return r;if(o)throw Error("SessionEditingForm getTypedValue");return}case"double":{let r=parseFloat(e);return me(r)?r:void 0}case"boolean":return e==="true";default:return e}}var pt=(e,t)=>{if(e)return e;if(t)return new ct({bufferSize:0,table:t.table,columns:t.columns.map(o=>o.name)});throw Error("SessionEditingForm: either a DataSource or a TableSchema must be provided")},Cr=({className:e,config:{fields:t,key:o},dataSource:r,id:s,onClose:a,schema:l,...c})=>{let[i,m]=le(),[u,g]=le(""),d=O(null),p=O(),h=O(C.uninitialised),v=it(()=>{let n=S=>{if(y){let T={};for(let D of v.columns)T[D]=S[y[D]];h.current===C.uninitialised&&(h.current=C.unchanged,p.current=T),m(T)}},f=pt(r,l),y=mt(f.columns);return f.subscribe({range:{from:0,to:5}},S=>{S.type==="viewport-update"&&S.rows&&(h.current===C.uninitialised?n(S.rows[0]):console.log("what do we do with server updates"))}),f},[r,l]),E=lt(s),N=P(n=>{let[f,y]=pe(n),{type:S}=de(t,f),T=fe(y,S);m((D={})=>{let W={...D,[f]:T},ke=dt(W,p.current);return h.current=ke?C.unchanged:T!==void 0?C.changed:C.invalid,W})},[t]),k=P(n=>{let[f,y]=pe(n),{type:S}=de(t,f);console.log("BLUR",{keyField:o});let T=i==null?void 0:i[o],D=fe(y,S,!0);typeof T=="string"&&v.menuRpcCall({rowKey:T,field:f,value:D,type:"VP_EDIT_CELL_RPC"})},[v,t,o,i]),b=P(async()=>{let n=await v.menuRpcCall({type:"VP_EDIT_SUBMIT_FORM_RPC"});ut(n)&&g(n.error)},[v]),U=P(n=>{n.key==="Enter"&&h.current===C.changed&&b()},[b]),I=P(()=>{a()},[a]),B=n=>{var y;let f=String((y=i==null?void 0:i[n.name])!=null?y:"");return n.readonly||n.name===o?L("div",{className:`${x}-fieldValue vuuReadOnly`,children:f}):L("input",{className:`${x}-fieldValue`,"data-field":n.name,onBlur:k,onChange:N,type:"text",value:f,id:`${E}-input-${n.name}`})};at(()=>{if(d.current){let n=d.current.querySelector("input");n&&setTimeout(()=>{n.focus(),console.log("select item"),n.select()},100)}},[]);let A=h.current===C.changed;return $("div",{...c,className:ue(x,e),children:[u?L("div",{className:`${x}-errorBanner`,"data-icon":"error",title:u,children:"Error, edit(s) not saved"}):void 0,L("div",{className:`${x}-content`,ref:d,onKeyDown:U,children:t.map(n=>{var f;return $("div",{className:`${x}-field`,children:[L("label",{className:ue(`${x}-fieldLabel`,{[`${x}-required`]:n.required}),htmlFor:`${E}-input-${n.name}`,children:(f=n==null?void 0:n.label)!=null?f:n.description}),B(n)]},n.name)})}),$("div",{className:`${x}-buttonbar salt-theme salt-density-high`,children:[L(ce,{type:"submit",variant:"cta",disabled:!A,onClick:b,children:"Submit"}),L(ce,{variant:"secondary",onClick:I,children:"Cancel"})]})]})};import{connectToServer as qt}from"@vuu-ui/vuu-data";import Gt from"classnames";import{useCallback as z,useEffect as zt,useRef as K,useState as Kt}from"react";import{createContext as ft,useContext as gt}from"react";import{jsx as J}from"react/jsx-runtime";var ht={},_=ft(ht),yt=({children:e,context:t,inheritedContext:o})=>{let r={...o,...t};return J(_.Provider,{value:r,children:e})},ge=({children:e,value:t})=>J(_.Consumer,{children:o=>J(yt,{context:t,inheritedContext:o,children:e})}),Nr=()=>gt(_);import{useCallback as q,useEffect as vt,useState as St}from"react";var he=(e,t,o="latest")=>new Promise((r,s)=>{console.log(`load local config at ${e} for user ${t.username}, id ${o}`);let a=localStorage.getItem(e);if(a){let l=JSON.parse(a);r(l)}else s()}),ye=(e,t,o)=>new Promise((r,s)=>{try{localStorage.setItem(e,JSON.stringify(o)),r(void 0)}catch{s()}});var ve=(e,t,o="latest")=>new Promise((r,s)=>{fetch(`${e}/${t.username}/${o}`,{}).then(a=>{a.ok?r(a.json()):s(void 0)}).catch(()=>{s(void 0)})}),Se=(e,t,o)=>new Promise((r,s)=>{fetch(`${e}/${t.username}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}).then(a=>{a.ok?r(void 0):s()})});var Te=({saveLocation:e,saveUrl:t="api/vui",user:o,defaultLayout:r})=>{let[s,a]=St(r),l=e==="remote",c=l?ve:he,i=l?Se:ye,m=p=>{a(p)},u=q(async(p="latest")=>{try{let h=await c(t,o,p);m(h)}catch{m(r)}},[r,c,t,o]);vt(()=>{u()},[u]);let g=q(p=>{i(t,o,p)},[i,t,o]),d=q(p=>{u(p)},[u]);return[s,g,d]};import{DockLayout as Yt,DraggableLayout as Re,Drawer as Wt,Flexbox as Qt,LayoutProvider as Xt,View as Zt}from"@vuu-ui/vuu-layout";import{useCallback as Ot}from"react";import{Button as Nt}from"@salt-ds/core";import{DropdownBase as Ht}from"@heswell/salt-lab";import{UserSolidIcon as Rt}from"@salt-ds/icons";import{formatDate as Tt}from"@vuu-ui/vuu-utils";import{List as xt,ListItem as Ct}from"@heswell/salt-lab";import{Button as Lt}from"@salt-ds/core";import{ExportIcon as wt}from"@salt-ds/icons";import{forwardRef as Dt,useCallback as Ce,useEffect as Et,useState as bt}from"react";var xe=async e=>await fetch(`api/vui/${e.username}`,{}).then(o=>o.ok?o.json():null).catch(()=>{console.log("error getting history")});import{jsx as V,jsxs as Le}from"react/jsx-runtime";var Mt=({lastUpdate:e},{lastUpdate:t})=>t===e?0:t<e?-1:1,Pt=e=>V(Ct,{...e}),we=Dt(function({loginUrl:t,onNavigate:o,user:r,layoutId:s="latest"},a){let[l,c]=bt([]);Et(()=>{async function g(){let p=(await xe(r)).filter(h=>h.id!=="latest").sort(Mt).map(({id:h,lastUpdate:v})=>({lastUpdate:v,id:h,label:`Saved at ${Tt(new Date(v),"kk:mm:ss")}`}));console.log({sortedHistory:p}),c(p)}g()},[r]);let i=Ce((g,d)=>{d&&o(d.id)},[o]),m=Ce(()=>{ie(t)},[t]),u=l.length===0?null:s==="latest"?l[0]:l.find(g=>g.id===s);return Le("div",{className:"vuuUserPanel",ref:a,children:[V(xt,{ListItem:Pt,className:"vuuUserPanel-history",onSelect:i,selected:u,source:l}),V("div",{className:"vuuUserPanel-buttonBar",children:Le(Lt,{"aria-label":"logout",onClick:m,children:[V(wt,{})," Logout"]})})]})});import{jsx as G,jsxs as Ft}from"react/jsx-runtime";var De=({layoutId:e,loginUrl:t,onNavigate:o,user:r})=>Ft(Ht,{className:"vuuUserProfile",placement:"bottom-end",children:[G(Nt,{variant:"secondary",children:G(Rt,{})}),G(we,{layoutId:e,loginUrl:t,onNavigate:a=>{o(a)},user:r})]});import{ToggleButton as Ee,ToggleButtonGroup as Vt}from"@heswell/salt-lab";import kt from"classnames";import{useControlled as Ut}from"@salt-ds/core";import{useCallback as It}from"react";import{jsx as Me,jsxs as At}from"react/jsx-runtime";var Bt="vuuThemeSwitch",be=["light","dark"],Pe=({className:e,defaultMode:t,mode:o,onChange:r,...s})=>{let[a,l]=Ut({controlled:o,default:t!=null?t:"light",name:"ThemeSwitch",state:"mode"}),c=be.indexOf(a),i=It((u,g)=>{let d=be[g];l(d),r(d)},[r,l]),m=kt(Bt,e);return At(Vt,{className:m,...s,onChange:i,selectedIndex:c,children:[Me(Ee,{"aria-label":"alert",tooltipText:"Light Theme","data-icon":"light"}),Me(Ee,{"aria-label":"home",tooltipText:"Dark Theme","data-icon":"dark"})]})};import $t from"classnames";import{jsx as Ne,jsxs as _t}from"react/jsx-runtime";var Jt="vuuAppHeader",He=({className:e,layoutId:t,loginUrl:o,onNavigate:r,onSwitchTheme:s,themeMode:a="light",user:l,...c})=>{let i=$t(Jt,e),m=Ot(u=>s==null?void 0:s(u),[s]);return _t("header",{className:i,...c,children:[Ne(Pe,{defaultMode:a,onChange:m}),Ne(De,{layoutId:t,loginUrl:o,onNavigate:r,user:l})]})};import{logger as jt}from"@vuu-ui/vuu-utils";import{jsx as w,jsxs as Fe}from"react/jsx-runtime";var{error:Y}=jt("Shell"),eo={type:"View",props:{style:{height:"calc(100% - 6px)"}},children:[{props:{className:"vuuShell-warningPlaceholder"},type:"Placeholder"}]},os=({children:e,className:t,defaultLayout:o=eo,leftSidePanel:r,loginUrl:s,saveLocation:a="remote",saveUrl:l,serverUrl:c,user:i,...m})=>{let u=K(null),g=K(null),[d,p]=Kt(!1),h=K("latest"),[v,E,N]=Te({defaultLayout:o,saveLocation:a,user:i}),k=z(n=>{try{E(n)}catch{Y==null||Y("Failed to save layout")}},[E]),b=z(n=>{u.current&&(u.current.dataset.mode=n)},[]),U=n=>{var y;let f=n.target;(y=g.current)!=null&&y.contains(f)||p(!d)},I=z(n=>{h.current=n,N(n)},[N]);zt(()=>{c&&i.token&&qt({authToken:i.token,url:c,username:i.username})},[c,i.token,i.username]);let B=()=>{let n=[];return r&&n.push(w(Wt,{onClick:U,open:d,position:"left",inline:!0,peekaboo:!0,sizeOpen:200,toggleButton:"end",children:w(Zt,{className:"vuuShell-palette",id:"vw-app-palette",ref:g,style:{height:"100%"},children:r},"app-palette")},"left-panel")),n},A=Gt("vuuShell",t,"salt-theme","salt-density-high");return Fe(ge,{value:void 0,children:[w(Xt,{layout:v,onLayoutChange:k,children:w(Re,{className:A,"data-mode":"light",ref:u,...m,children:Fe(Qt,{className:"App",style:{flexDirection:"column",height:"100%",width:"100%"},children:[w(He,{layoutId:h.current,loginUrl:s,user:i,onNavigate:I,onSwitchTheme:b}),w(Yt,{style:{flex:1},children:B().concat(w(Re,{dropTarget:!0,style:{width:"100%",height:"100%"}},"main-content"))})]})})}),e]})};import{createContext as to,isValidElement as oo,cloneElement as ro,useContext as no}from"react";import so from"classnames";import{jsx as mo}from"react/jsx-runtime";var ao="medium",io="salt-theme",lo="light",Ve=to({density:"high",theme:"salt-theme",themeMode:"light"}),uo=(e,t,o,r)=>{var s;return oo(e)?ro(e,{className:so((s=e.props)==null?void 0:s.className,t,`salt-density-${r}`),"data-mode":o}):(console.warn(`
|
|
2
2
|
ThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.
|
|
3
|
-
Wrap elements with a single container`),
|
|
3
|
+
Wrap elements with a single container`),e)},co=({children:e,theme:t,themeMode:o,density:r})=>{var g,d,p;let{density:s,themeMode:a,theme:l}=no(Ve),c=(g=r!=null?r:s)!=null?g:ao,i=(d=o!=null?o:a)!=null?d:lo,m=(p=t!=null?t:l)!=null?p:io,u=uo(e,m,i,c);return mo(Ve.Provider,{value:{themeMode:i,density:c,theme:m},children:u})};co.displayName="ThemeProvider";export{vo as ConnectionStatusIcon,ao as DEFAULT_DENSITY,io as DEFAULT_THEME,lo as DEFAULT_THEME_MODE,bo as DensitySwitch,te as Feature,jo as LoginPanel,Cr as SessionEditingForm,os as Shell,ge as ShellContextProvider,Ve as ThemeContext,co as ThemeProvider,Pe as ThemeSwitch,rr as getAuthDetailsFromCookies,ie as logout,st as redirectToLogin,Nr as useShellContext};
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../packages/vuu-shell/src/connection-status/ConnectionStatusIcon.tsx", "../../../packages/vuu-shell/src/density-switch/DensitySwitch.tsx", "../../../packages/vuu-shell/src/feature/Feature.tsx", "../../../packages/vuu-shell/src/feature/ErrorBoundary.jsx", "../../../packages/vuu-shell/src/feature/Loader.tsx", "../../../packages/vuu-shell/src/login/LoginPanel.tsx", "../../../packages/vuu-shell/src/login/login-utils.ts", "../../../packages/vuu-shell/src/shell.tsx", "../../../packages/vuu-shell/src/ShellContextProvider.tsx", "../../../packages/vuu-shell/src/use-layout-config.
|
|
4
|
-
"sourcesContent": ["import React, { useEffect, useState } from 'react';\nimport cx from 'classnames';\nimport './ConnectionStatusIcon.css';\n\ntype connectionStatus = 'connected' | 'reconnected' | 'connecting' | 'disconnected';\n\ninterface ConnectionStatusProps {\n\tconnectionStatus: connectionStatus\n\tclassName?: string;\n\tprops?: unknown;\n\telement?: string;\n}\n\nexport const ConnectionStatusIcon = ({ connectionStatus, className, element = 'span', ...props}: ConnectionStatusProps) => {\n\tconst [classBase, setClassBase] = useState<string>('vuuConnectingStatus');\n\tuseEffect(() => {\n\t\tswitch(connectionStatus) {\n\t\t\tcase 'connected':\n\t\t\tcase 'reconnected':\n\t\t\t\tsetClassBase('vuuActiveStatus');\n\t\t\t\tbreak;\n\t\t\tcase 'connecting':\n\t\t\t\tsetClassBase('vuuConnectingStatus');\n\t\t\t\tbreak;\n\t\t\tcase 'disconnected':\n\t\t\t\tsetClassBase('vuuDisconnectedStatus');\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}, [connectionStatus]);\n\n\tconst statusIcon = React.createElement (\n\t\telement,\n\t\t{\n\t\t\t...props,\n\t\t\tclassName: cx('vuuStatus vuuIcon', classBase, className)\n\t\t},\n\t)\n\n\treturn (\n\t\t<>\n\t\t\t<div className='vuuStatus-container salt-theme'>\n\t\t\t\t{statusIcon}\n\t\t\t\t<div\tclassName='vuuStatus-text'>Status: {connectionStatus.toUpperCase()}</div>\n\t\t\t</div>\n\t\t</>\n\t)\n}", "import { Dropdown } from \"@heswell/salt-lab\";\nimport { Density } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport cx from \"classnames\";\n\nconst classBase = \"vuuDensitySwitch\";\n\nconst densities:Density[] = [\"high\", \"medium\", \"low\", \"touch\"];\nconst DEFAULT_DENSITY = \"high\";\n\nexport interface DensitySwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultDensity?: Density;\n density?: Density;\n onDensityChange: (density: Density) => void;\n}\n\nexport const DensitySwitch = ({\n className: classNameProp,\n defaultDensity=DEFAULT_DENSITY,\n onDensityChange,\n}:DensitySwitchProps) => {\n const handleSelectionChange = useCallback((_event, selectedItem) => {\n onDensityChange(selectedItem);\n }, [onDensityChange])\n\n const className = cx(classBase, classNameProp);\n\n return (\n <Dropdown\n className={className}\n source={densities}\n defaultSelected={defaultDensity}\n onSelectionChange={handleSelectionChange}\n />\n )\n}", "import React, { Suspense } from \"react\";\nimport { registerComponent } from \"@vuu-ui/vuu-layout\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\nimport { Loader } from \"./Loader\";\n// import { importCSS } from \"./css-module-loader\";\n\nexport interface FeatureProps<Params extends object | undefined = undefined> {\n height?: number;\n url: string;\n css?: string;\n width?: number;\n params: Params;\n}\n\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n params,\n ...props\n}: FeatureProps<Params>) {\n if (css) {\n import(/* @vite-ignore */ css, { assert: { type: \"css\" } }).then(\n (cssModule) => {\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n cssModule.default,\n ];\n }\n );\n // Polyfill until vite build supports import assertions\n // Note: already fully supported in esbuild, so vite dev\n // importCSS(css).then((styleSheet) => {\n // document.adoptedStyleSheets = [\n // ...document.adoptedStyleSheets,\n // styleSheet,\n // ];\n // });\n }\n const LazyFeature = React.lazy(() => import(/* @vite-ignore */ url));\n return (\n <ErrorBoundary>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </ErrorBoundary>\n );\n}\n\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n", "import React from 'react';\n// TODO\nexport class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error, errorInfo) {\n // You can also log the error to an error reporting service\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>Something went wrong.</h1>\n <p>{this.state.errorMessage}</p>\n </>\n );\n }\n\n return this.props.children;\n }\n}\n", "// TODO\nexport const Loader = () => <div className=\"hwLoader\">loading</div>;\n", "import { ChangeEvent, HTMLAttributes, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { FormField, Input } from \"@heswell/salt-lab\";\n\nimport \"./LoginPanel.css\";\n\nconst classBase = \"vuuLoginPanel\";\n\nexport interface LoginPanelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\"> {\n onSubmit: (username: string, password: string) => void;\n}\n\nexport const LoginPanel = ({ onSubmit }: LoginPanelProps) => {\n const [username, setUserName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n\n const login = () => {\n onSubmit(username, password);\n };\n\n const handleUsername = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setUserName(value);\n };\n\n const handlePassword = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setPassword(value);\n };\n\n const dataIsValid = username.trim() !== \"\" && password.trim() !== \"\";\n\n return (\n <div className={classBase}>\n <FormField label=\"Username\" style={{ width: 200 }}>\n <Input value={username} id=\"text-username\" onChange={handleUsername} />\n </FormField>\n\n <FormField label=\"Password\" style={{ width: 200 }}>\n <Input\n type=\"password\"\n value={password}\n id=\"text-password\"\n onChange={handlePassword}\n />\n </FormField>\n\n <Button\n className={`${classBase}-login`}\n disabled={!dataIsValid}\n onClick={login}\n variant=\"cta\"\n >\n Login\n </Button>\n </div>\n );\n};\n", "import { getCookieValue } from \"@vuu-ui/vuu-utils\";\n\nexport const getAuthDetailsFromCookies = () => {\n const username = getCookieValue(\"vuu-username\");\n const token = getCookieValue(\"vuu-auth-token\");\n return [username, token];\n};\n\nexport const redirectToLogin = (loginUrl = \"login.html\") => {\n window.location.href = loginUrl;\n};\n\nexport const logout = (loginUrl?: string) => {\n document.cookie = \"vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = \"vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n redirectToLogin(loginUrl);\n};\n", "import { connectToServer } from \"@vuu-ui/vuu-data\";\nimport cx from \"classnames\";\nimport {\n HTMLAttributes,\n MouseEvent,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { ShellContextProvider } from \"./ShellContextProvider\";\nimport useLayoutConfig from \"./use-layout-config\";\nimport {\n DockLayout,\n DraggableLayout,\n Drawer,\n Flexbox,\n LayoutProvider,\n View,\n} from \"@vuu-ui/vuu-layout\";\nimport { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { AppHeader } from \"./app-header\";\nimport { ThemeMode } from \"./theme-provider\";\n\nimport \"./shell.css\";\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst warningLayout = {\n type: \"View\",\n props: {\n style: { height: \"calc(100% - 6px)\" },\n },\n children: [\n {\n props: {\n className: \"vuuShell-warningPlaceholder\",\n },\n type: \"Placeholder\",\n },\n ],\n};\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n defaultLayout?: LayoutJSON;\n leftSidePanel?: ReactElement;\n loginUrl?: string;\n // paletteConfig: any;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n children,\n className: classNameProp,\n defaultLayout = warningLayout,\n leftSidePanel,\n loginUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const paletteView = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const layoutId = useRef(\"latest\");\n\n const [layout, setLayoutConfig, loadLayoutById] = useLayoutConfig(\n user,\n defaultLayout\n );\n\n const handleLayoutChange = useCallback(\n (layout) => {\n setLayoutConfig(layout);\n },\n [setLayoutConfig]\n );\n\n const handleSwitchTheme = useCallback((mode: ThemeMode) => {\n if (rootRef.current) {\n rootRef.current.dataset.mode = mode;\n }\n }, []);\n\n const handleDrawerClick = (e: MouseEvent<HTMLElement>) => {\n const target = e.target as HTMLElement;\n if (!paletteView.current?.contains(target)) {\n setOpen(!open);\n }\n };\n\n const handleNavigate = useCallback(\n (id) => {\n layoutId.current = id;\n loadLayoutById(id);\n },\n [loadLayoutById]\n );\n\n useEffect(() => {\n if (serverUrl && user.token) {\n connectToServer({\n authToken: user.token,\n url: serverUrl,\n username: user.username,\n });\n }\n }, [serverUrl, user.token, user.username]);\n\n const getDrawers = () => {\n const drawers: ReactElement[] = [];\n if (leftSidePanel) {\n drawers.push(\n <Drawer\n key=\"left-panel\"\n onClick={handleDrawerClick}\n open={open}\n position=\"left\"\n inline\n peekaboo\n sizeOpen={200}\n toggleButton=\"end\"\n >\n <View\n className=\"vuuShell-palette\"\n id=\"vw-app-palette\"\n key=\"app-palette\"\n ref={paletteView}\n style={{ height: \"100%\" }}\n >\n {leftSidePanel}\n </View>\n </Drawer>\n );\n }\n\n return drawers;\n };\n\n const className = cx(\n \"vuuShell\",\n classNameProp,\n \"salt-theme\",\n \"salt-density-high\"\n );\n\n return (\n // ShellContext TBD\n <ShellContextProvider value={undefined}>\n <LayoutProvider layout={layout} onLayoutChange={handleLayoutChange}>\n <DraggableLayout\n className={className}\n data-mode=\"light\"\n ref={rootRef}\n {...htmlAttributes}\n >\n <Flexbox\n className=\"App\"\n style={{ flexDirection: \"column\", height: \"100%\", width: \"100%\" }}\n >\n <AppHeader\n layoutId={layoutId.current}\n loginUrl={loginUrl}\n user={user}\n onNavigate={handleNavigate}\n onSwitchTheme={handleSwitchTheme}\n />\n <DockLayout style={{ flex: 1 }}>\n {getDrawers().concat(\n <DraggableLayout\n dropTarget\n key=\"main-content\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n </DockLayout>\n </Flexbox>\n </DraggableLayout>\n </LayoutProvider>\n {children}\n </ShellContextProvider>\n );\n};\n", "import { MenuRpcResponse } from \"@vuu-ui/vuu-data\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\n\nexport interface ShellContextProps {\n getDefaultColumnConfig?: (\n tableName: string,\n columnName: string\n ) => Partial<ColumnDescriptor>;\n handleRpcResponse?: (response?: MenuRpcResponse) => void;\n}\n\nconst defaultConfig = {};\n\nconst ShellContext = createContext<ShellContextProps>(defaultConfig);\n\nexport interface ShellProviderProps {\n children: ReactNode;\n value?: ShellContextProps;\n}\n\nconst Provider = ({\n children,\n context,\n inheritedContext,\n}: {\n children: ReactNode;\n context?: ShellContextProps;\n inheritedContext?: ShellContextProps;\n}) => {\n // TODO functions provided at multiple levels must be merged\n const mergedContext = {\n ...inheritedContext,\n ...context,\n };\n return (\n <ShellContext.Provider value={mergedContext}>\n {children}\n </ShellContext.Provider>\n );\n};\n\nexport const ShellContextProvider = ({\n children,\n value,\n}: ShellProviderProps): ReactElement => {\n return (\n <ShellContext.Consumer>\n {(context) => (\n <Provider context={value} inheritedContext={context}>\n {children}\n </Provider>\n )}\n </ShellContext.Consumer>\n );\n};\n\nexport const useShellContext = () => {\n return useContext(ShellContext);\n};\n", "import { useCallback, useEffect, useState } from \"react\";\n\nconst useLayoutConfig = (user, defaultLayout) => {\n const [layout, _setLayout] = useState(defaultLayout);\n\n const setLayout = (layout) => {\n _setLayout(layout);\n };\n\n const load = useCallback(\n async (id = \"latest\") => {\n fetch(`api/vui/${user.username}/${id}`, {})\n .then((response) => {\n return response.ok ? response.json() : defaultLayout;\n })\n .then(setLayout)\n .catch(() => {\n // TODO we should set a layout with a warning here\n setLayout(defaultLayout);\n });\n },\n [defaultLayout, user.username]\n );\n\n useEffect(() => {\n load();\n }, [load]);\n\n const saveData = useCallback(\n (data) => {\n fetch(`api/vui/${user.username}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }).then((response) => {\n return response.ok ? response.json() : defaultLayout;\n });\n },\n [defaultLayout, user]\n );\n\n const loadLayoutById = useCallback(\n (id) => {\n load(id);\n },\n [load]\n );\n\n return [layout, saveData, loadLayoutById];\n};\n\nexport default useLayoutConfig;\n", "import { HTMLAttributes, useCallback } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { UserProfile } from \"../user-profile\";\nimport { ThemeSwitch } from \"../theme-switch\";\nimport { ThemeMode } from \"../theme-provider\";\nimport cx from \"classnames\";\n\nimport \"./AppHeader.css\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n onSwitchTheme?: (mode: ThemeMode) => void;\n themeMode?: ThemeMode;\n user: VuuUser;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n layoutId,\n loginUrl,\n onNavigate,\n onSwitchTheme,\n themeMode = \"light\",\n user,\n ...htmlAttributes\n}: AppHeaderProps) => {\n const className = cx(classBase, classNameProp);\n const handleSwitchTheme = useCallback(\n (mode: ThemeMode) => onSwitchTheme?.(mode),\n [onSwitchTheme]\n );\n return (\n <header className={className} {...htmlAttributes}>\n <ThemeSwitch defaultMode={themeMode} onChange={handleSwitchTheme} />\n <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n />\n </header>\n );\n};\n", "import { Button } from \"@salt-ds/core\";\nimport { DropdownBase } from \"@heswell/salt-lab\";\nimport { UserSolidIcon } from \"@salt-ds/icons\";\nimport { UserPanel } from \"./UserPanel\";\n\nimport \"./UserProfile.css\";\nimport { VuuUser } from \"../shell\";\n\nexport interface UserProfileProps {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n}\n\nexport const UserProfile = ({\n layoutId,\n loginUrl,\n onNavigate,\n user,\n}: UserProfileProps) => {\n const handleNavigate = (id: string) => {\n onNavigate(id);\n };\n\n return (\n <DropdownBase className=\"vuuUserProfile\" placement=\"bottom-end\">\n <Button variant=\"secondary\">\n <UserSolidIcon />\n </Button>\n <UserPanel\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={handleNavigate}\n user={user}\n />\n </DropdownBase>\n );\n};\n", "import { formatDate } from \"@vuu-ui/vuu-utils\";\nimport { List, ListItem, ListItemProps } from \"@heswell/salt-lab\";\nimport { Button } from \"@salt-ds/core\";\nimport { ExportIcon } from \"@salt-ds/icons\";\nimport {\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { getLayoutHistory, LayoutHistoryItem } from \"../get-layout-history\";\nimport { logout } from \"../login\";\nimport { VuuUser } from \"../shell\";\n\nimport \"./UserPanel.css\";\n\nconst byLastUpdate = (\n { lastUpdate: l1 }: LayoutHistoryItem,\n { lastUpdate: l2 }: LayoutHistoryItem\n) => {\n return l2 === l1 ? 0 : l2 < l1 ? -1 : 1;\n};\n\ntype HistoryEntry = {\n id: string;\n label: string;\n lastUpdate: number;\n};\n\nconst HistoryListItem = (props: ListItemProps<HistoryEntry>) => {\n return <ListItem {...props} />;\n};\n\nexport interface UserPanelProps extends HTMLAttributes<HTMLDivElement> {\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n layoutId: string;\n}\n\nexport const UserPanel = forwardRef(function UserPanel(\n { loginUrl, onNavigate, user, layoutId = \"latest\" }: UserPanelProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const [history, setHistory] = useState<HistoryEntry[]>([]);\n\n useEffect(() => {\n async function getHistory() {\n const history = await getLayoutHistory(user);\n const sortedHistory = history\n .filter((item) => item.id !== \"latest\")\n .sort(byLastUpdate)\n .map<HistoryEntry>(({ id, lastUpdate }) => ({\n lastUpdate,\n id,\n label: `Saved at ${formatDate(new Date(lastUpdate), \"kk:mm:ss\")}`,\n }));\n console.log({ sortedHistory });\n setHistory(sortedHistory);\n }\n\n getHistory();\n }, [user]);\n\n const handleHisorySelected = useCallback(\n (evt, selected) => {\n if (selected) {\n onNavigate(selected.id);\n }\n },\n [onNavigate]\n );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const selected =\n history.length === 0\n ? null\n : layoutId === \"latest\"\n ? history[0]\n : history.find((i) => i.id === layoutId);\n\n return (\n <div className=\"vuuUserPanel\" ref={forwardedRef}>\n <List<HistoryEntry>\n ListItem={HistoryListItem}\n className=\"vuuUserPanel-history\"\n onSelect={handleHisorySelected}\n selected={selected}\n source={history}\n />\n <div className=\"vuuUserPanel-buttonBar\">\n <Button aria-label=\"logout\" onClick={handleLogout}>\n <ExportIcon /> Logout\n </Button>\n </div>\n </div>\n );\n});\n", "import { VuuUser } from \"./shell\";\n\nexport interface LayoutHistoryItem {\n user: string;\n id: string;\n uniqueId: string;\n lastUpdate: number;\n}\n\nexport const getLayoutHistory = async (\n user: VuuUser\n): Promise<LayoutHistoryItem[]> => {\n const history = await fetch(`api/vui/${user.username}`, {})\n .then((response) => {\n return response.ok ? response.json() : null;\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n console.log(\"error getting history\");\n });\n\n return history;\n};\n", "import {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupChangeEventHandler,\n} from \"@heswell/salt-lab\";\nimport cx from \"classnames\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback } from \"react\";\n\nimport \"./ThemeSwitch.css\";\nimport { ThemeMode } from \"../theme-provider\";\n\nconst classBase = \"vuuThemeSwitch\";\nexport interface ThemeSwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultMode?: ThemeMode;\n mode?: ThemeMode;\n onChange: (mode: ThemeMode) => void;\n}\n\nconst modes: ThemeMode[] = [\"light\", \"dark\"];\n\nexport const ThemeSwitch = ({\n className: classNameProp,\n defaultMode: defaultModeProp,\n mode: modeProp,\n onChange,\n ...htmlAttributes\n}: ThemeSwitchProps) => {\n const [mode, setMode] = useControlled<ThemeMode>({\n controlled: modeProp,\n default: defaultModeProp ?? \"light\",\n name: \"ThemeSwitch\",\n state: \"mode\",\n });\n\n const selectedIndex = modes.indexOf(mode);\n\n const handleChangeSecondary: ToggleButtonGroupChangeEventHandler =\n useCallback(\n (_evt, index) => {\n const mode = modes[index];\n setMode(mode);\n onChange(mode);\n },\n [onChange, setMode]\n );\n const className = cx(classBase, classNameProp);\n return (\n <ToggleButtonGroup\n className={className}\n {...htmlAttributes}\n onChange={handleChangeSecondary}\n selectedIndex={selectedIndex}\n >\n <ToggleButton\n aria-label=\"alert\"\n tooltipText=\"Light Theme\"\n data-icon=\"light\"\n />\n <ToggleButton\n aria-label=\"home\"\n tooltipText=\"Dark Theme\"\n data-icon=\"dark\"\n />\n </ToggleButtonGroup>\n );\n};\n", "import React, {\n createContext,\n HTMLAttributes,\n ReactNode,\n ReactElement,\n isValidElement,\n cloneElement,\n useContext,\n} from \"react\";\nimport cx from \"classnames\";\n\nexport const DEFAULT_DENSITY: Density = \"medium\";\nexport const DEFAULT_THEME = \"salt-theme\";\nexport const DEFAULT_THEME_MODE: ThemeMode = \"light\";\n\nexport type Density = \"high\" | \"medium\" | \"low\" | \"touch\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type TargetElement = \"root\" | \"scope\" | \"child\";\n\nexport interface ThemeContextProps {\n density: Density;\n theme: string;\n themeMode: ThemeMode;\n}\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n density: \"high\",\n theme: \"salt-theme\",\n themeMode: \"light\",\n});\n\nconst createThemedChildren = (\n children: ReactNode,\n theme: string,\n themeMode: ThemeMode,\n density: Density\n) => {\n if (isValidElement<HTMLAttributes<HTMLElement>>(children)) {\n return cloneElement(children, {\n className: cx(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n children.props?.className,\n theme,\n `salt-density-${density}`\n ),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n \"data-mode\": themeMode,\n });\n } else {\n console.warn(\n `\\nThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.\n Wrap elements with a single container`\n );\n return children;\n }\n};\n\ninterface ThemeProviderProps {\n children: ReactElement;\n density?: Density;\n theme?: string;\n themeMode?: ThemeMode;\n applyClassesTo?: TargetElement;\n}\n\nexport const ThemeProvider = ({\n children,\n theme: themeProp,\n themeMode: themeModeProp,\n density: densityProp,\n}: ThemeProviderProps) => {\n const {\n density: inheritedDensity,\n themeMode: inheritedThemeMode,\n theme: inheritedTheme,\n } = useContext(ThemeContext);\n\n const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;\n const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;\n const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;\n const themedChildren = createThemedChildren(\n children,\n theme,\n themeMode,\n density\n );\n\n return (\n <ThemeContext.Provider value={{ themeMode, density, theme }}>\n {themedChildren}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "useEffect", "useState", "cx", "Fragment", "jsx", "jsxs", "ConnectionStatusIcon", "connectionStatus", "className", "element", "props", "classBase", "setClassBase", "useState", "useEffect", "statusIcon", "React", "cx", "Dropdown", "useCallback", "cx", "jsx", "classBase", "densities", "DEFAULT_DENSITY", "DensitySwitch", "classNameProp", "defaultDensity", "onDensityChange", "handleSelectionChange", "_event", "selectedItem", "className", "React", "Suspense", "registerComponent", "React", "Fragment", "jsx", "jsxs", "ErrorBoundary", "props", "error", "errorInfo", "jsx", "Loader", "jsx", "
|
|
3
|
+
"sources": ["../../../packages/vuu-shell/src/connection-status/ConnectionStatusIcon.tsx", "../../../packages/vuu-shell/src/density-switch/DensitySwitch.tsx", "../../../packages/vuu-shell/src/feature/Feature.tsx", "../../../packages/vuu-shell/src/feature/ErrorBoundary.jsx", "../../../packages/vuu-shell/src/feature/Loader.tsx", "../../../packages/vuu-shell/src/login/LoginPanel.tsx", "../../../packages/vuu-shell/src/login/login-utils.ts", "../../../packages/vuu-shell/src/session-editing-form/SessionEditingForm.tsx", "../../../packages/vuu-shell/src/shell.tsx", "../../../packages/vuu-shell/src/ShellContextProvider.tsx", "../../../packages/vuu-shell/src/layout-config/use-layout-config.ts", "../../../packages/vuu-shell/src/layout-config/local-config.ts", "../../../packages/vuu-shell/src/layout-config/remote-config.ts", "../../../packages/vuu-shell/src/app-header/AppHeader.tsx", "../../../packages/vuu-shell/src/user-profile/UserProfile.tsx", "../../../packages/vuu-shell/src/user-profile/UserPanel.tsx", "../../../packages/vuu-shell/src/get-layout-history.ts", "../../../packages/vuu-shell/src/theme-switch/ThemeSwitch.tsx", "../../../packages/vuu-shell/src/theme-provider/ThemeProvider.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useEffect, useState } from 'react';\nimport cx from 'classnames';\nimport './ConnectionStatusIcon.css';\n\ntype connectionStatus = 'connected' | 'reconnected' | 'connecting' | 'disconnected';\n\ninterface ConnectionStatusProps {\n\tconnectionStatus: connectionStatus\n\tclassName?: string;\n\tprops?: unknown;\n\telement?: string;\n}\n\nexport const ConnectionStatusIcon = ({ connectionStatus, className, element = 'span', ...props}: ConnectionStatusProps) => {\n\tconst [classBase, setClassBase] = useState<string>('vuuConnectingStatus');\n\tuseEffect(() => {\n\t\tswitch(connectionStatus) {\n\t\t\tcase 'connected':\n\t\t\tcase 'reconnected':\n\t\t\t\tsetClassBase('vuuActiveStatus');\n\t\t\t\tbreak;\n\t\t\tcase 'connecting':\n\t\t\t\tsetClassBase('vuuConnectingStatus');\n\t\t\t\tbreak;\n\t\t\tcase 'disconnected':\n\t\t\t\tsetClassBase('vuuDisconnectedStatus');\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}, [connectionStatus]);\n\n\tconst statusIcon = React.createElement (\n\t\telement,\n\t\t{\n\t\t\t...props,\n\t\t\tclassName: cx('vuuStatus vuuIcon', classBase, className)\n\t\t},\n\t)\n\n\treturn (\n\t\t<>\n\t\t\t<div className='vuuStatus-container salt-theme'>\n\t\t\t\t{statusIcon}\n\t\t\t\t<div\tclassName='vuuStatus-text'>Status: {connectionStatus.toUpperCase()}</div>\n\t\t\t</div>\n\t\t</>\n\t)\n}", "import { Dropdown } from \"@heswell/salt-lab\";\nimport { Density } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport cx from \"classnames\";\n\nconst classBase = \"vuuDensitySwitch\";\n\nconst densities:Density[] = [\"high\", \"medium\", \"low\", \"touch\"];\nconst DEFAULT_DENSITY = \"high\";\n\nexport interface DensitySwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultDensity?: Density;\n density?: Density;\n onDensityChange: (density: Density) => void;\n}\n\nexport const DensitySwitch = ({\n className: classNameProp,\n defaultDensity=DEFAULT_DENSITY,\n onDensityChange,\n}:DensitySwitchProps) => {\n const handleSelectionChange = useCallback((_event, selectedItem) => {\n onDensityChange(selectedItem);\n }, [onDensityChange])\n\n const className = cx(classBase, classNameProp);\n\n return (\n <Dropdown\n className={className}\n source={densities}\n defaultSelected={defaultDensity}\n onSelectionChange={handleSelectionChange}\n />\n )\n}", "import React, { Suspense, useEffect } from \"react\";\nimport { registerComponent } from \"@vuu-ui/vuu-layout\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\nimport { Loader } from \"./Loader\";\n\nconst componentsMap = new Map();\n\nconst useCachedFeature = (url: string) => {\n useEffect(\n () => () => {\n componentsMap.delete(url);\n },\n [url]\n );\n\n if (!componentsMap.has(url)) {\n componentsMap.set(\n url,\n React.lazy(() => import(/* @vite-ignore */ url))\n );\n }\n\n return componentsMap.get(url);\n};\n\nexport interface FeatureProps<Params extends object | undefined = undefined> {\n height?: number;\n url: string;\n css?: string;\n width?: number;\n params: Params;\n}\n\nfunction RawFeature<Params extends object | undefined>({\n url,\n css,\n params,\n ...props\n}: FeatureProps<Params>) {\n console.log(\"Feature render\", { css, url, props });\n useEffect(() => {\n console.log(\"%cFeature mount\", \"color: green;\");\n return () => {\n console.log(\"%cFeature unmount\", \"color:red;\");\n };\n }, []);\n\n if (css) {\n import(/* @vite-ignore */ css, { assert: { type: \"css\" } }).then(\n (cssModule) => {\n console.log(\"%cInject Styles\", \"color: blue;font-weight: bold\");\n document.adoptedStyleSheets = [\n ...document.adoptedStyleSheets,\n cssModule.default,\n ];\n }\n );\n }\n\n const LazyFeature = useCachedFeature(url);\n return (\n <ErrorBoundary>\n <Suspense fallback={<Loader />}>\n <LazyFeature {...props} {...params} />\n </Suspense>\n </ErrorBoundary>\n );\n}\n\nexport const Feature = React.memo(RawFeature);\nFeature.displayName = \"Feature\";\nregisterComponent(\"Feature\", Feature, \"view\");\n", "import React from 'react';\n// TODO\nexport class ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { errorMessage: null };\n }\n\n static getDerivedStateFromError(error) {\n // Update state so the next render will show the fallback UI.\n return { errorMessage: error.message };\n }\n\n componentDidCatch(error, errorInfo) {\n // You can also log the error to an error reporting service\n console.log(error, errorInfo);\n }\n\n render() {\n if (this.state.errorMessage) {\n return (\n <>\n <h1>Something went wrong.</h1>\n <p>{this.state.errorMessage}</p>\n </>\n );\n }\n\n return this.props.children;\n }\n}\n", "// TODO\nexport const Loader = () => <div className=\"hwLoader\">loading</div>;\n", "import { ChangeEvent, HTMLAttributes, useState } from \"react\";\nimport { Button } from \"@salt-ds/core\";\nimport { FormField, Input } from \"@heswell/salt-lab\";\n\nimport \"./LoginPanel.css\";\n\nconst classBase = \"vuuLoginPanel\";\n\nexport interface LoginPanelProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\"> {\n onSubmit: (username: string, password: string) => void;\n}\n\nexport const LoginPanel = ({ onSubmit }: LoginPanelProps) => {\n const [username, setUserName] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n\n const login = () => {\n onSubmit(username, password);\n };\n\n const handleUsername = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setUserName(value);\n };\n\n const handlePassword = (\n _event: ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n setPassword(value);\n };\n\n const dataIsValid = username.trim() !== \"\" && password.trim() !== \"\";\n\n return (\n <div className={classBase}>\n <FormField label=\"Username\" style={{ width: 200 }}>\n <Input value={username} id=\"text-username\" onChange={handleUsername} />\n </FormField>\n\n <FormField label=\"Password\" style={{ width: 200 }}>\n <Input\n type=\"password\"\n value={password}\n id=\"text-password\"\n onChange={handlePassword}\n />\n </FormField>\n\n <Button\n className={`${classBase}-login`}\n disabled={!dataIsValid}\n onClick={login}\n variant=\"cta\"\n >\n Login\n </Button>\n </div>\n );\n};\n", "import { getCookieValue } from \"@vuu-ui/vuu-utils\";\n\nexport const getAuthDetailsFromCookies = () => {\n const username = getCookieValue(\"vuu-username\");\n const token = getCookieValue(\"vuu-auth-token\");\n return [username, token];\n};\n\nexport const redirectToLogin = (loginUrl = \"login.html\") => {\n window.location.href = loginUrl;\n};\n\nexport const logout = (loginUrl?: string) => {\n document.cookie = \"vuu-username= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie = \"vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n redirectToLogin(loginUrl);\n};\n", "import {\n ChangeEvent,\n FocusEvent,\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport cx from \"classnames\";\nimport {\n VuuColumnDataType,\n VuuDataRow,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { useIdMemo } from \"@salt-ds/core\";\nimport { Button } from \"@salt-ds/core\";\nimport {\n DataSource,\n isErrorResponse,\n RemoteDataSource,\n TableSchema,\n} from \"@vuu-ui/vuu-data\";\nimport {\n buildColumnMap,\n isValidNumber,\n shallowEquals,\n} from \"@vuu-ui/vuu-utils\";\n\nimport \"./SessionEditingForm.css\";\n\ntype FormFieldDescriptor = {\n label?: string;\n name: string;\n type: VuuColumnDataType;\n description: string;\n readonly?: boolean;\n required?: boolean;\n};\n\nexport type FormConfig = {\n title: string;\n key: string;\n fields: FormFieldDescriptor[];\n};\n\nexport interface SessionEditingFormProps\n extends HTMLAttributes<HTMLDivElement> {\n config: FormConfig;\n onClose: () => void;\n dataSource?: DataSource;\n schema?: TableSchema;\n}\n\nconst classBase = \"vuuSessionEditingForm\";\n\nconst getField = (\n fields: FormFieldDescriptor[],\n name: string\n): FormFieldDescriptor => {\n const field = fields.find((f) => f.name === name);\n if (field) {\n return field;\n } else {\n throw Error(`SessionEditingForm, no field '${name}' found`);\n }\n};\n\nconst getFieldNameAndValue = (\n evt: ChangeEvent | FocusEvent\n): [string, string] => {\n const {\n dataset: { field },\n value,\n } = evt.target as HTMLInputElement;\n if (field === undefined) {\n throw Error(\"SessionEditingForm, form field has no field name\");\n }\n return [field, value];\n};\n\nconst Status = {\n uninitialised: 0,\n unchanged: 1,\n changed: 2,\n invalid: 3,\n};\n\nfunction getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined?: false\n): VuuRowDataItemType | undefined;\nfunction getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined: true\n): VuuRowDataItemType;\nfunction getTypedValue(\n value: string,\n type: VuuColumnDataType,\n throwIfUndefined = false\n): VuuRowDataItemType | undefined {\n switch (type) {\n case \"int\":\n case \"long\": {\n const typedValue = parseInt(value, 10);\n if (isValidNumber(typedValue)) {\n return typedValue;\n } else if (throwIfUndefined) {\n throw Error(\"SessionEditingForm getTypedValue\");\n } else {\n return undefined;\n }\n }\n\n case \"double\": {\n const typedValue = parseFloat(value);\n if (isValidNumber(typedValue)) {\n return typedValue;\n }\n return undefined;\n }\n\n case \"boolean\":\n return value === \"true\" ? true : false;\n default:\n return value;\n }\n}\n\nconst getDataSource = (\n dataSource?: DataSource,\n schema?: TableSchema\n): DataSource => {\n if (dataSource) {\n return dataSource;\n } else if (schema) {\n return new RemoteDataSource({\n bufferSize: 0,\n table: schema.table,\n columns: schema.columns.map((col) => col.name),\n }) as DataSource;\n } else {\n throw Error(\n \"SessionEditingForm: either a DataSource or a TableSchema must be provided\"\n );\n }\n};\n\ntype FormValues = { [key: string]: VuuRowDataItemType | undefined };\n\nexport const SessionEditingForm = ({\n className,\n config: { fields, key: keyField },\n dataSource: dataSourceProp,\n id: idProp,\n onClose,\n schema,\n ...htmlAttributes\n}: SessionEditingFormProps) => {\n const [values, setValues] = useState<FormValues>();\n const [errorMessage, setErrorMessage] = useState(\"\");\n const formContentRef = useRef<HTMLDivElement>(null);\n const initialDataRef = useRef<FormValues>();\n const dataStatusRef = useRef(Status.uninitialised);\n\n const dataSource = useMemo(() => {\n const applyServerData = (data: VuuDataRow) => {\n if (columnMap) {\n const values: { [key: string]: VuuRowDataItemType } = {};\n for (const column of dataSource.columns) {\n values[column] = data[columnMap[column]];\n }\n if (dataStatusRef.current === Status.uninitialised) {\n dataStatusRef.current = Status.unchanged;\n initialDataRef.current = values;\n }\n setValues(values);\n }\n };\n\n const ds = getDataSource(dataSourceProp, schema);\n const columnMap = buildColumnMap(ds.columns);\n ds.subscribe({ range: { from: 0, to: 5 } }, (message) => {\n if (message.type === \"viewport-update\" && message.rows) {\n if (dataStatusRef.current === Status.uninitialised) {\n applyServerData(message.rows[0]);\n } else {\n console.log(\"what do we do with server updates\");\n }\n }\n });\n return ds;\n }, [dataSourceProp, schema]);\n\n const id = useIdMemo(idProp);\n\n const handleChange = useCallback(\n (evt) => {\n const [field, value] = getFieldNameAndValue(evt);\n const { type } = getField(fields, field);\n const typedValue = getTypedValue(value, type);\n setValues((values = {}) => {\n const newValues = {\n ...values,\n [field]: typedValue,\n };\n const notUpdated = shallowEquals(newValues, initialDataRef.current);\n dataStatusRef.current = notUpdated\n ? Status.unchanged\n : typedValue !== undefined\n ? Status.changed\n : Status.invalid;\n return newValues;\n });\n },\n [fields]\n );\n\n const handleBlur = useCallback(\n (evt: FocusEvent) => {\n const [field, value] = getFieldNameAndValue(evt);\n const { type } = getField(fields, field);\n console.log(\"BLUR\", {\n keyField,\n });\n const rowKey = values?.[keyField];\n const typedValue = getTypedValue(value, type, true);\n if (typeof rowKey === \"string\") {\n dataSource.menuRpcCall({\n rowKey,\n field: field,\n value: typedValue,\n type: \"VP_EDIT_CELL_RPC\",\n });\n }\n },\n [dataSource, fields, keyField, values]\n );\n\n const handleSubmit = useCallback(async () => {\n const response = await dataSource.menuRpcCall({\n type: \"VP_EDIT_SUBMIT_FORM_RPC\",\n });\n if (isErrorResponse(response)) {\n setErrorMessage(response.error);\n }\n }, [dataSource]);\n\n const handleKeyDown = useCallback(\n (evt) => {\n if (evt.key === \"Enter\" && dataStatusRef.current === Status.changed) {\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const handleCancel = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const getFormControl = (field: FormFieldDescriptor) => {\n const value = String(values?.[field.name] ?? \"\");\n if (field.readonly || field.name === keyField) {\n return (\n <div className={`${classBase}-fieldValue vuuReadOnly`}>{value}</div>\n );\n } else {\n return (\n <input\n className={`${classBase}-fieldValue`}\n data-field={field.name}\n onBlur={handleBlur}\n onChange={handleChange}\n type=\"text\"\n value={value}\n id={`${id}-input-${field.name}`}\n />\n );\n }\n };\n\n useEffect(() => {\n if (formContentRef.current) {\n const firstInput = formContentRef.current.querySelector(\n \"input\"\n ) as HTMLInputElement;\n if (firstInput) {\n setTimeout(() => {\n firstInput.focus();\n console.log(\"select item\");\n firstInput.select();\n }, 100);\n }\n }\n }, []);\n\n const isDirty = dataStatusRef.current === Status.changed;\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n {errorMessage ? (\n <div\n className={`${classBase}-errorBanner`}\n data-icon=\"error\"\n title={errorMessage}\n >\n Error, edit(s) not saved\n </div>\n ) : undefined}\n <div\n className={`${classBase}-content`}\n ref={formContentRef}\n onKeyDown={handleKeyDown}\n >\n {fields.map((field) => (\n <div className={`${classBase}-field`} key={field.name}>\n <label\n className={cx(`${classBase}-fieldLabel`, {\n [`${classBase}-required`]: field.required,\n })}\n htmlFor={`${id}-input-${field.name}`}\n >\n {field?.label ?? field.description}\n </label>\n {getFormControl(field)}\n </div>\n ))}\n </div>\n <div className={`${classBase}-buttonbar salt-theme salt-density-high`}>\n <Button\n type=\"submit\"\n variant=\"cta\"\n disabled={!isDirty}\n onClick={handleSubmit}\n >\n Submit\n </Button>\n <Button variant=\"secondary\" onClick={handleCancel}>\n Cancel\n </Button>\n </div>\n </div>\n );\n};\n", "import { connectToServer } from \"@vuu-ui/vuu-data\";\nimport cx from \"classnames\";\nimport {\n HTMLAttributes,\n MouseEvent,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { ShellContextProvider } from \"./ShellContextProvider\";\nimport { useLayoutConfig } from \"./layout-config\";\nimport {\n DockLayout,\n DraggableLayout,\n Drawer,\n Flexbox,\n LayoutProvider,\n View,\n} from \"@vuu-ui/vuu-layout\";\nimport { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { AppHeader } from \"./app-header\";\nimport { ThemeMode } from \"./theme-provider\";\nimport { logger } from \"@vuu-ui/vuu-utils\";\n\nimport \"./shell.css\";\nimport { SaveLocation } from \"./shellTypes\";\n\nexport type VuuUser = {\n username: string;\n token: string;\n};\n\nconst { error } = logger(\"Shell\");\n\nconst warningLayout = {\n type: \"View\",\n props: {\n style: { height: \"calc(100% - 6px)\" },\n },\n children: [\n {\n props: {\n className: \"vuuShell-warningPlaceholder\",\n },\n type: \"Placeholder\",\n },\n ],\n};\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n defaultLayout?: LayoutJSON;\n leftSidePanel?: ReactElement;\n loginUrl?: string;\n // paletteConfig: any;\n saveLocation?: SaveLocation;\n saveUrl?: string;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n children,\n className: classNameProp,\n defaultLayout = warningLayout,\n leftSidePanel,\n loginUrl,\n saveLocation = \"remote\",\n saveUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n const paletteView = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const layoutId = useRef(\"latest\");\n\n const [layout, saveLayoutConfig, loadLayoutById] = useLayoutConfig({\n defaultLayout,\n saveLocation,\n user,\n });\n\n const handleLayoutChange = useCallback(\n (layout) => {\n try {\n saveLayoutConfig(layout);\n } catch {\n error?.(\"Failed to save layout\");\n }\n },\n [saveLayoutConfig]\n );\n\n const handleSwitchTheme = useCallback((mode: ThemeMode) => {\n if (rootRef.current) {\n rootRef.current.dataset.mode = mode;\n }\n }, []);\n\n const handleDrawerClick = (e: MouseEvent<HTMLElement>) => {\n const target = e.target as HTMLElement;\n if (!paletteView.current?.contains(target)) {\n setOpen(!open);\n }\n };\n\n const handleNavigate = useCallback(\n (id) => {\n layoutId.current = id;\n loadLayoutById(id);\n },\n [loadLayoutById]\n );\n\n useEffect(() => {\n if (serverUrl && user.token) {\n connectToServer({\n authToken: user.token,\n url: serverUrl,\n username: user.username,\n });\n }\n }, [serverUrl, user.token, user.username]);\n\n const getDrawers = () => {\n const drawers: ReactElement[] = [];\n if (leftSidePanel) {\n drawers.push(\n <Drawer\n key=\"left-panel\"\n onClick={handleDrawerClick}\n open={open}\n position=\"left\"\n inline\n peekaboo\n sizeOpen={200}\n toggleButton=\"end\"\n >\n <View\n className=\"vuuShell-palette\"\n id=\"vw-app-palette\"\n key=\"app-palette\"\n ref={paletteView}\n style={{ height: \"100%\" }}\n >\n {leftSidePanel}\n </View>\n </Drawer>\n );\n }\n\n return drawers;\n };\n\n const className = cx(\n \"vuuShell\",\n classNameProp,\n \"salt-theme\",\n \"salt-density-high\"\n );\n\n return (\n // ShellContext TBD\n <ShellContextProvider value={undefined}>\n <LayoutProvider layout={layout} onLayoutChange={handleLayoutChange}>\n <DraggableLayout\n className={className}\n data-mode=\"light\"\n ref={rootRef}\n {...htmlAttributes}\n >\n <Flexbox\n className=\"App\"\n style={{ flexDirection: \"column\", height: \"100%\", width: \"100%\" }}\n >\n <AppHeader\n layoutId={layoutId.current}\n loginUrl={loginUrl}\n user={user}\n onNavigate={handleNavigate}\n onSwitchTheme={handleSwitchTheme}\n />\n <DockLayout style={{ flex: 1 }}>\n {getDrawers().concat(\n <DraggableLayout\n dropTarget\n key=\"main-content\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n </DockLayout>\n </Flexbox>\n </DraggableLayout>\n </LayoutProvider>\n {children}\n </ShellContextProvider>\n );\n};\n", "import { MenuRpcResponse } from \"@vuu-ui/vuu-data\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-datagrid-types\";\nimport { createContext, ReactElement, ReactNode, useContext } from \"react\";\n\nexport interface ShellContextProps {\n getDefaultColumnConfig?: (\n tableName: string,\n columnName: string\n ) => Partial<ColumnDescriptor>;\n handleRpcResponse?: (response?: MenuRpcResponse) => void;\n}\n\nconst defaultConfig = {};\n\nconst ShellContext = createContext<ShellContextProps>(defaultConfig);\n\nexport interface ShellProviderProps {\n children: ReactNode;\n value?: ShellContextProps;\n}\n\nconst Provider = ({\n children,\n context,\n inheritedContext,\n}: {\n children: ReactNode;\n context?: ShellContextProps;\n inheritedContext?: ShellContextProps;\n}) => {\n // TODO functions provided at multiple levels must be merged\n const mergedContext = {\n ...inheritedContext,\n ...context,\n };\n return (\n <ShellContext.Provider value={mergedContext}>\n {children}\n </ShellContext.Provider>\n );\n};\n\nexport const ShellContextProvider = ({\n children,\n value,\n}: ShellProviderProps): ReactElement => {\n return (\n <ShellContext.Consumer>\n {(context) => (\n <Provider context={value} inheritedContext={context}>\n {children}\n </Provider>\n )}\n </ShellContext.Consumer>\n );\n};\n\nexport const useShellContext = () => {\n return useContext(ShellContext);\n};\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { SaveLocation } from \"../shellTypes\";\nimport { loadLocalConfig, saveLocalConfig } from \"./local-config\";\nimport { loadRemoteConfig, saveRemoteConfig } from \"./remote-config\";\n\nexport interface LayoutConfigHookProps {\n defaultLayout: LayoutJSON;\n saveLocation: SaveLocation;\n saveUrl?: string;\n user: VuuUser;\n}\n\nexport type LayoutHookResult = [\n LayoutJSON,\n (layout: LayoutJSON) => void,\n (id: string) => void\n];\n\nexport const useLayoutConfig = ({\n saveLocation,\n saveUrl = \"api/vui\",\n user,\n defaultLayout,\n}: LayoutConfigHookProps): LayoutHookResult => {\n const [layout, _setLayout] = useState(defaultLayout);\n const usingRemote = saveLocation === \"remote\";\n const loadConfig = usingRemote ? loadRemoteConfig : loadLocalConfig;\n const saveConfig = usingRemote ? saveRemoteConfig : saveLocalConfig;\n\n const setLayout = (layout: LayoutJSON) => {\n _setLayout(layout);\n };\n\n const load = useCallback(\n async (id = \"latest\") => {\n try {\n const layout = await loadConfig(saveUrl, user, id);\n setLayout(layout);\n } catch {\n setLayout(defaultLayout);\n }\n },\n [defaultLayout, loadConfig, saveUrl, user]\n );\n\n useEffect(() => {\n load();\n }, [load]);\n\n const saveData = useCallback(\n (data) => {\n saveConfig(saveUrl, user, data);\n },\n [saveConfig, saveUrl, user]\n );\n\n const loadLayoutById = useCallback(\n (id) => {\n load(id);\n },\n [load]\n );\n\n return [layout, saveData, loadLayoutById];\n};\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { VuuUser } from \"../shell\";\n\nexport const loadLocalConfig = (\n saveUrl: string,\n user: VuuUser,\n id = \"latest\"\n): Promise<LayoutJSON> =>\n new Promise((resolve, reject) => {\n console.log(\n `load local config at ${saveUrl} for user ${user.username}, id ${id}`\n );\n const data = localStorage.getItem(saveUrl);\n if (data) {\n const layout = JSON.parse(data);\n resolve(layout);\n } else {\n reject();\n }\n });\n\nexport const saveLocalConfig = (\n saveUrl: string,\n user: VuuUser,\n data: LayoutJSON\n): Promise<undefined> =>\n new Promise((resolve, reject) => {\n try {\n localStorage.setItem(saveUrl, JSON.stringify(data));\n resolve(undefined);\n } catch {\n reject();\n }\n });\n", "import { LayoutJSON } from \"@vuu-ui/vuu-layout/src/layout-reducer\";\nimport { VuuUser } from \"../shell\";\n\nexport const loadRemoteConfig = (\n saveUrl: string,\n user: VuuUser,\n id = \"latest\"\n): Promise<LayoutJSON> =>\n new Promise((resolve, reject) => {\n fetch(`${saveUrl}/${user.username}/${id}`, {})\n .then((response) => {\n if (response.ok) {\n resolve(response.json());\n } else {\n reject(undefined);\n }\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n // setLayout(defaultLayout);\n reject(undefined);\n });\n });\n\nexport const saveRemoteConfig = (\n saveUrl: string,\n user: VuuUser,\n data: LayoutJSON\n) =>\n new Promise((resolve, reject) => {\n fetch(`${saveUrl}/${user.username}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n }).then((response) => {\n if (response.ok) {\n resolve(undefined);\n } else {\n reject();\n }\n });\n });\n", "import { HTMLAttributes, useCallback } from \"react\";\nimport { VuuUser } from \"../shell\";\nimport { UserProfile } from \"../user-profile\";\nimport { ThemeSwitch } from \"../theme-switch\";\nimport { ThemeMode } from \"../theme-provider\";\nimport cx from \"classnames\";\n\nimport \"./AppHeader.css\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n onSwitchTheme?: (mode: ThemeMode) => void;\n themeMode?: ThemeMode;\n user: VuuUser;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n layoutId,\n loginUrl,\n onNavigate,\n onSwitchTheme,\n themeMode = \"light\",\n user,\n ...htmlAttributes\n}: AppHeaderProps) => {\n const className = cx(classBase, classNameProp);\n const handleSwitchTheme = useCallback(\n (mode: ThemeMode) => onSwitchTheme?.(mode),\n [onSwitchTheme]\n );\n return (\n <header className={className} {...htmlAttributes}>\n <ThemeSwitch defaultMode={themeMode} onChange={handleSwitchTheme} />\n <UserProfile\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={onNavigate}\n user={user}\n />\n </header>\n );\n};\n", "import { Button } from \"@salt-ds/core\";\nimport { DropdownBase } from \"@heswell/salt-lab\";\nimport { UserSolidIcon } from \"@salt-ds/icons\";\nimport { UserPanel } from \"./UserPanel\";\n\nimport \"./UserProfile.css\";\nimport { VuuUser } from \"../shell\";\n\nexport interface UserProfileProps {\n layoutId: string;\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n}\n\nexport const UserProfile = ({\n layoutId,\n loginUrl,\n onNavigate,\n user,\n}: UserProfileProps) => {\n const handleNavigate = (id: string) => {\n onNavigate(id);\n };\n\n return (\n <DropdownBase className=\"vuuUserProfile\" placement=\"bottom-end\">\n <Button variant=\"secondary\">\n <UserSolidIcon />\n </Button>\n <UserPanel\n layoutId={layoutId}\n loginUrl={loginUrl}\n onNavigate={handleNavigate}\n user={user}\n />\n </DropdownBase>\n );\n};\n", "import { formatDate } from \"@vuu-ui/vuu-utils\";\nimport { List, ListItem, ListItemProps } from \"@heswell/salt-lab\";\nimport { Button } from \"@salt-ds/core\";\nimport { ExportIcon } from \"@salt-ds/icons\";\nimport {\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { getLayoutHistory, LayoutHistoryItem } from \"../get-layout-history\";\nimport { logout } from \"../login\";\nimport { VuuUser } from \"../shell\";\n\nimport \"./UserPanel.css\";\n\nconst byLastUpdate = (\n { lastUpdate: l1 }: LayoutHistoryItem,\n { lastUpdate: l2 }: LayoutHistoryItem\n) => {\n return l2 === l1 ? 0 : l2 < l1 ? -1 : 1;\n};\n\ntype HistoryEntry = {\n id: string;\n label: string;\n lastUpdate: number;\n};\n\nconst HistoryListItem = (props: ListItemProps<HistoryEntry>) => {\n return <ListItem {...props} />;\n};\n\nexport interface UserPanelProps extends HTMLAttributes<HTMLDivElement> {\n loginUrl?: string;\n onNavigate: (id: string) => void;\n user: VuuUser;\n layoutId: string;\n}\n\nexport const UserPanel = forwardRef(function UserPanel(\n { loginUrl, onNavigate, user, layoutId = \"latest\" }: UserPanelProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const [history, setHistory] = useState<HistoryEntry[]>([]);\n\n useEffect(() => {\n async function getHistory() {\n const history = await getLayoutHistory(user);\n const sortedHistory = history\n .filter((item) => item.id !== \"latest\")\n .sort(byLastUpdate)\n .map<HistoryEntry>(({ id, lastUpdate }) => ({\n lastUpdate,\n id,\n label: `Saved at ${formatDate(new Date(lastUpdate), \"kk:mm:ss\")}`,\n }));\n console.log({ sortedHistory });\n setHistory(sortedHistory);\n }\n\n getHistory();\n }, [user]);\n\n const handleHisorySelected = useCallback(\n (evt, selected) => {\n if (selected) {\n onNavigate(selected.id);\n }\n },\n [onNavigate]\n );\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const selected =\n history.length === 0\n ? null\n : layoutId === \"latest\"\n ? history[0]\n : history.find((i) => i.id === layoutId);\n\n return (\n <div className=\"vuuUserPanel\" ref={forwardedRef}>\n <List<HistoryEntry>\n ListItem={HistoryListItem}\n className=\"vuuUserPanel-history\"\n onSelect={handleHisorySelected}\n selected={selected}\n source={history}\n />\n <div className=\"vuuUserPanel-buttonBar\">\n <Button aria-label=\"logout\" onClick={handleLogout}>\n <ExportIcon /> Logout\n </Button>\n </div>\n </div>\n );\n});\n", "import { VuuUser } from \"./shell\";\n\nexport interface LayoutHistoryItem {\n user: string;\n id: string;\n uniqueId: string;\n lastUpdate: number;\n}\n\nexport const getLayoutHistory = async (\n user: VuuUser\n): Promise<LayoutHistoryItem[]> => {\n const history = await fetch(`api/vui/${user.username}`, {})\n .then((response) => {\n return response.ok ? response.json() : null;\n })\n .catch(() => {\n // TODO we should set a layout with a warning here\n console.log(\"error getting history\");\n });\n\n return history;\n};\n", "import {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupChangeEventHandler,\n} from \"@heswell/salt-lab\";\nimport cx from \"classnames\";\nimport { useControlled } from \"@salt-ds/core\";\nimport { HTMLAttributes, useCallback } from \"react\";\n\nimport \"./ThemeSwitch.css\";\nimport { ThemeMode } from \"../theme-provider\";\n\nconst classBase = \"vuuThemeSwitch\";\nexport interface ThemeSwitchProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n defaultMode?: ThemeMode;\n mode?: ThemeMode;\n onChange: (mode: ThemeMode) => void;\n}\n\nconst modes: ThemeMode[] = [\"light\", \"dark\"];\n\nexport const ThemeSwitch = ({\n className: classNameProp,\n defaultMode: defaultModeProp,\n mode: modeProp,\n onChange,\n ...htmlAttributes\n}: ThemeSwitchProps) => {\n const [mode, setMode] = useControlled<ThemeMode>({\n controlled: modeProp,\n default: defaultModeProp ?? \"light\",\n name: \"ThemeSwitch\",\n state: \"mode\",\n });\n\n const selectedIndex = modes.indexOf(mode);\n\n const handleChangeSecondary: ToggleButtonGroupChangeEventHandler =\n useCallback(\n (_evt, index) => {\n const mode = modes[index];\n setMode(mode);\n onChange(mode);\n },\n [onChange, setMode]\n );\n const className = cx(classBase, classNameProp);\n return (\n <ToggleButtonGroup\n className={className}\n {...htmlAttributes}\n onChange={handleChangeSecondary}\n selectedIndex={selectedIndex}\n >\n <ToggleButton\n aria-label=\"alert\"\n tooltipText=\"Light Theme\"\n data-icon=\"light\"\n />\n <ToggleButton\n aria-label=\"home\"\n tooltipText=\"Dark Theme\"\n data-icon=\"dark\"\n />\n </ToggleButtonGroup>\n );\n};\n", "import React, {\n createContext,\n HTMLAttributes,\n ReactNode,\n ReactElement,\n isValidElement,\n cloneElement,\n useContext,\n} from \"react\";\nimport cx from \"classnames\";\n\nexport const DEFAULT_DENSITY: Density = \"medium\";\nexport const DEFAULT_THEME = \"salt-theme\";\nexport const DEFAULT_THEME_MODE: ThemeMode = \"light\";\n\nexport type Density = \"high\" | \"medium\" | \"low\" | \"touch\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type TargetElement = \"root\" | \"scope\" | \"child\";\n\nexport interface ThemeContextProps {\n density: Density;\n theme: string;\n themeMode: ThemeMode;\n}\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n density: \"high\",\n theme: \"salt-theme\",\n themeMode: \"light\",\n});\n\nconst createThemedChildren = (\n children: ReactNode,\n theme: string,\n themeMode: ThemeMode,\n density: Density\n) => {\n if (isValidElement<HTMLAttributes<HTMLElement>>(children)) {\n return cloneElement(children, {\n className: cx(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n children.props?.className,\n theme,\n `salt-density-${density}`\n ),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n \"data-mode\": themeMode,\n });\n } else {\n console.warn(\n `\\nThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.\n Wrap elements with a single container`\n );\n return children;\n }\n};\n\ninterface ThemeProviderProps {\n children: ReactElement;\n density?: Density;\n theme?: string;\n themeMode?: ThemeMode;\n applyClassesTo?: TargetElement;\n}\n\nexport const ThemeProvider = ({\n children,\n theme: themeProp,\n themeMode: themeModeProp,\n density: densityProp,\n}: ThemeProviderProps) => {\n const {\n density: inheritedDensity,\n themeMode: inheritedThemeMode,\n theme: inheritedTheme,\n } = useContext(ThemeContext);\n\n const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;\n const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;\n const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;\n const themedChildren = createThemedChildren(\n children,\n theme,\n themeMode,\n density\n );\n\n return (\n <ThemeContext.Provider value={{ themeMode, density, theme }}>\n {themedChildren}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useEffect", "useState", "cx", "Fragment", "jsx", "jsxs", "ConnectionStatusIcon", "connectionStatus", "className", "element", "props", "classBase", "setClassBase", "useState", "useEffect", "statusIcon", "React", "cx", "Dropdown", "useCallback", "cx", "jsx", "classBase", "densities", "DEFAULT_DENSITY", "DensitySwitch", "classNameProp", "defaultDensity", "onDensityChange", "handleSelectionChange", "_event", "selectedItem", "className", "React", "Suspense", "useEffect", "registerComponent", "React", "Fragment", "jsx", "jsxs", "ErrorBoundary", "props", "error", "errorInfo", "jsx", "Loader", "jsx", "componentsMap", "useCachedFeature", "url", "useEffect", "React", "RawFeature", "css", "params", "props", "cssModule", "LazyFeature", "ErrorBoundary", "Suspense", "Loader", "Feature", "registerComponent", "useState", "Button", "FormField", "Input", "jsx", "jsxs", "classBase", "LoginPanel", "onSubmit", "username", "setUserName", "useState", "password", "setPassword", "login", "handleUsername", "_event", "value", "handlePassword", "dataIsValid", "FormField", "Input", "Button", "getCookieValue", "getAuthDetailsFromCookies", "username", "token", "redirectToLogin", "loginUrl", "logout", "useCallback", "useEffect", "useMemo", "useRef", "useState", "cx", "useIdMemo", "Button", "isErrorResponse", "RemoteDataSource", "buildColumnMap", "isValidNumber", "shallowEquals", "jsx", "jsxs", "classBase", "getField", "fields", "name", "field", "f", "getFieldNameAndValue", "evt", "value", "Status", "getTypedValue", "type", "throwIfUndefined", "typedValue", "isValidNumber", "getDataSource", "dataSource", "schema", "RemoteDataSource", "col", "SessionEditingForm", "className", "keyField", "dataSourceProp", "idProp", "onClose", "htmlAttributes", "values", "setValues", "useState", "errorMessage", "setErrorMessage", "formContentRef", "useRef", "initialDataRef", "dataStatusRef", "useMemo", "applyServerData", "data", "columnMap", "column", "ds", "buildColumnMap", "message", "id", "useIdMemo", "handleChange", "useCallback", "newValues", "notUpdated", "shallowEquals", "handleBlur", "rowKey", "handleSubmit", "response", "isErrorResponse", "handleKeyDown", "handleCancel", "getFormControl", "_a", "useEffect", "firstInput", "isDirty", "cx", "Button", "connectToServer", "cx", "useCallback", "useEffect", "useRef", "useState", "createContext", "useContext", "jsx", "defaultConfig", "ShellContext", "Provider", "children", "context", "inheritedContext", "mergedContext", "ShellContextProvider", "value", "useShellContext", "useCallback", "useEffect", "useState", "loadLocalConfig", "saveUrl", "user", "id", "resolve", "reject", "data", "layout", "saveLocalConfig", "loadRemoteConfig", "saveUrl", "user", "id", "resolve", "reject", "response", "saveRemoteConfig", "data", "useLayoutConfig", "saveLocation", "saveUrl", "user", "defaultLayout", "layout", "_setLayout", "useState", "usingRemote", "loadConfig", "loadRemoteConfig", "loadLocalConfig", "saveConfig", "saveRemoteConfig", "saveLocalConfig", "setLayout", "load", "useCallback", "id", "useEffect", "saveData", "data", "loadLayoutById", "DockLayout", "DraggableLayout", "Drawer", "Flexbox", "LayoutProvider", "View", "useCallback", "Button", "DropdownBase", "UserSolidIcon", "formatDate", "List", "ListItem", "Button", "ExportIcon", "forwardRef", "useCallback", "useEffect", "useState", "getLayoutHistory", "user", "response", "jsx", "jsxs", "byLastUpdate", "l1", "l2", "HistoryListItem", "props", "ListItem", "UserPanel", "forwardRef", "loginUrl", "onNavigate", "user", "layoutId", "forwardedRef", "history", "setHistory", "useState", "useEffect", "getHistory", "sortedHistory", "getLayoutHistory", "item", "id", "lastUpdate", "formatDate", "handleHisorySelected", "useCallback", "evt", "selected", "handleLogout", "logout", "i", "List", "Button", "ExportIcon", "jsx", "jsxs", "UserProfile", "layoutId", "loginUrl", "onNavigate", "user", "DropdownBase", "Button", "UserSolidIcon", "UserPanel", "id", "ToggleButton", "ToggleButtonGroup", "cx", "useControlled", "useCallback", "jsx", "jsxs", "classBase", "modes", "ThemeSwitch", "classNameProp", "defaultModeProp", "modeProp", "onChange", "htmlAttributes", "mode", "setMode", "useControlled", "selectedIndex", "handleChangeSecondary", "useCallback", "_evt", "index", "className", "cx", "ToggleButtonGroup", "ToggleButton", "cx", "jsx", "jsxs", "classBase", "AppHeader", "classNameProp", "layoutId", "loginUrl", "onNavigate", "onSwitchTheme", "themeMode", "user", "htmlAttributes", "className", "cx", "handleSwitchTheme", "useCallback", "mode", "ThemeSwitch", "UserProfile", "logger", "jsx", "jsxs", "error", "logger", "warningLayout", "Shell", "children", "classNameProp", "defaultLayout", "leftSidePanel", "loginUrl", "saveLocation", "saveUrl", "serverUrl", "user", "htmlAttributes", "rootRef", "useRef", "paletteView", "open", "setOpen", "useState", "layoutId", "layout", "saveLayoutConfig", "loadLayoutById", "useLayoutConfig", "handleLayoutChange", "useCallback", "handleSwitchTheme", "mode", "handleDrawerClick", "e", "_a", "target", "handleNavigate", "id", "useEffect", "connectToServer", "getDrawers", "drawers", "Drawer", "View", "className", "cx", "ShellContextProvider", "LayoutProvider", "DraggableLayout", "Flexbox", "AppHeader", "DockLayout", "createContext", "isValidElement", "cloneElement", "useContext", "cx", "jsx", "DEFAULT_DENSITY", "DEFAULT_THEME", "DEFAULT_THEME_MODE", "ThemeContext", "createThemedChildren", "children", "theme", "themeMode", "density", "_a", "ThemeProvider", "themeProp", "themeModeProp", "densityProp", "_b", "_c", "inheritedDensity", "inheritedThemeMode", "inheritedTheme", "themedChildren"]
|
|
7
7
|
}
|
package/index.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.vuuStatus-container{display:flex}.vuuStatus-text{align-self:center}.vuuStatus{--vuu-icon-height: 18px;--vuu-icon-padding: var(--vuuStatus-padding, 6px);--vuu-icon-width: var(--vuuStatus-width, auto);--vuu-icon-min-width: var(--vuuStatus-min-width, 20px);align-items:center;display:inline-flex;height:var(--vuu-icon-height);justify-content:center;min-width:var(--vuu-icon-min-width);padding:0 var(--vuu-icon-padding);width:var(--vuu-icon-width);position:relative}.vuuStatus[data-icon]:after{inset:0 0 0 0;content:"";box-shadow:0 0 #000;position:absolute;mask:var(--vuu-icon-svg) center center/20px 20px no-repeat;-webkit-mask:var(--vuu-icon-svg) center center/20px 20px no-repeat}.vuuActiveStatus:after{--vuu-icon-svg: var(--svg-active-status);background-color:#0f0}.vuuConnectingStatus:after{--vuu-icon-svg: var(--svg-connecting-status);background-color:orange;transform:scale(1);animation:infinite pulse 1s}.vuuDisconnectedStatus:after{--vuu-icon-svg: var(--svg-disconnected-status);background-color:red;transform:scale(1);animation:infinite pulse .5s}@keyframes pulse{0%{transform:scale(.95);box-shadow:0 0 #000000b3}70%{transform:scale(1);box-shadow:0 0 #0000}to{transform:scale(.95);box-shadow:0 0 #0000}}.vuuLoginPanel{--hwTextInput-border: solid 1px #ccc;--hwTextInput-height: 28px;--hwTextInput-padding: 0 12px;--hwTextInput-width: 100%;--login-row-height: 60px;align-content:center;align-items:center;border:solid 1px lightgray;display:flex;flex-direction:column;gap:24px;justify-content:center;justify-items:center;margin:0 auto;padding:48px 48px 24px;width:fit-content}.vuuLoginPanel-login{grid-column:2/3;align-self:end;justify-self:end}.vuuUserPanel{background-color:#fff;display:flex;flex-direction:column;max-height:400px;padding:12px}vuuUserPanel-history{flex:1 1 auto}.vuuUserPanel-buttonBar{--saltButton-width: 100%;align-items:flex-end;border-top:1px solid var(--surface3);display:flex;flex:0 0 32px;justify-content:flex-start}.btn-logout{--hwButton-icon-left: 12px;--hwButton-padding: 0 6px 0 24px;padding-left:24px}.vuuUserProfile{--svg-icon: var(--svg-user)}.vuuThemeSwitch{--saltButton-minWidth: 22px}.vuuThemeSwitch{--svg-light: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><path d="M24 31q2.9 0 4.95-2.05Q31 26.9 31 24q0-2.9-2.05-4.95Q26.9 17 24 17q-2.9 0-4.95 2.05Q17 21.1 17 24q0 2.9 2.05 4.95Q21.1 31 24 31Zm0 3q-4.15 0-7.075-2.925T14 24q0-4.15 2.925-7.075T24 14q4.15 0 7.075 2.925T34 24q0 4.15-2.925 7.075T24 34ZM3.5 25.5q-.65 0-1.075-.425Q2 24.65 2 24q0-.65.425-1.075Q2.85 22.5 3.5 22.5h5q.65 0 1.075.425Q10 23.35 10 24q0 .65-.425 1.075-.425.425-1.075.425Zm36 0q-.65 0-1.075-.425Q38 24.65 38 24q0-.65.425-1.075.425-.425 1.075-.425h5q.65 0 1.075.425Q46 23.35 46 24q0 .65-.425 1.075-.425.425-1.075.425ZM24 10q-.65 0-1.075-.425Q22.5 9.15 22.5 8.5v-5q0-.65.425-1.075Q23.35 2 24 2q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 10 24 10Zm0 36q-.65 0-1.075-.425-.425-.425-.425-1.075v-5q0-.65.425-1.075Q23.35 38 24 38q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 46 24 46ZM12 14.1l-2.85-2.8q-.45-.45-.425-1.075.025-.625.425-1.075.45-.45 1.075-.45t1.075.45L14.1 12q.4.45.4 1.05 0 .6-.4 1-.4.45-1.025.45-.625 0-1.075-.4Zm24.7 24.75L33.9 36q-.4-.45-.4-1.075t.45-1.025q.4-.45 1-.45t1.05.45l2.85 2.8q.45.45.425 1.075-.025.625-.425 1.075-.45.45-1.075.45t-1.075-.45ZM33.9 14.1q-.45-.45-.45-1.05 0-.6.45-1.05l2.8-2.85q.45-.45 1.075-.425.625.025 1.075.425.45.45.45 1.075t-.45 1.075L36 14.1q-.4.4-1.025.4-.625 0-1.075-.4ZM9.15 38.85q-.45-.45-.45-1.075t.45-1.075L12 33.9q.45-.45 1.05-.45.6 0 1.05.45.45.45.45 1.05 0 .6-.45 1.05l-2.8 2.85q-.45.45-1.075.425-.625-.025-1.075-.425ZM24 24Z"/></svg>');--svg-dark: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><path d="M24 42q-7.5 0-12.75-5.25T6 24q0-7.5 5.25-12.75T24 6q.4 0 .85.025.45.025 1.15.075-1.8 1.6-2.8 3.95-1 2.35-1 4.95 0 4.5 3.15 7.65Q28.5 25.8 33 25.8q2.6 0 4.95-.925T41.9 22.3q.05.6.075.975Q42 23.65 42 24q0 7.5-5.25 12.75T24 42Zm0-3q5.45 0 9.5-3.375t5.05-7.925q-1.25.55-2.675.825Q34.45 28.8 33 28.8q-5.75 0-9.775-4.025T19.2 15q0-1.2.25-2.575.25-1.375.9-3.125-4.9 1.35-8.125 5.475Q9 18.9 9 24q0 6.25 4.375 10.625T24 39Zm-.2-14.85Z"/></svg>')}.salt-density-high .vuuThemeSwitch{--saltButton-minWidth: 16px;--saltButton-width: 18px;--vuuThemeSwitch-iconSize: 16px}.vuuThemeSwitch [data-icon]{--vuu-icon-size: var(--vuuThemeSwitch-iconSize,18px)}.vuuThemeSwitch [data-icon=light]{--vuu-icon-svg: var(--svg-light)}.vuuThemeSwitch [data-icon=dark]{--vuu-icon-svg: var(--svg-dark)}.vuuAppHeader{align-items:center;border-bottom:solid 1px var(--salt-container-secondary-borderColor);display:flex;height:40px;justify-content:flex-end}.vuuShell{background-color:var(--salt-container-primary-background, ivory);height:var(--vuuShell-height, 100vh);width:var(--vuuShell-width, 100vw)}.vuuShell-palette{--vuuView-border: none;--vuuView-margin: 0}.vuuShell-warningPlaceholder{background-color:var(--salt-container-background-high);height:100%}
|
|
1
|
+
.vuuStatus-container{display:flex}.vuuStatus-text{align-self:center}.vuuStatus{--vuu-icon-height: 18px;--vuu-icon-padding: var(--vuuStatus-padding, 6px);--vuu-icon-width: var(--vuuStatus-width, auto);--vuu-icon-min-width: var(--vuuStatus-min-width, 20px);align-items:center;display:inline-flex;height:var(--vuu-icon-height);justify-content:center;min-width:var(--vuu-icon-min-width);padding:0 var(--vuu-icon-padding);width:var(--vuu-icon-width);position:relative}.vuuStatus[data-icon]:after{inset:0 0 0 0;content:"";box-shadow:0 0 #000;position:absolute;mask:var(--vuu-icon-svg) center center/20px 20px no-repeat;-webkit-mask:var(--vuu-icon-svg) center center/20px 20px no-repeat}.vuuActiveStatus:after{--vuu-icon-svg: var(--svg-active-status);background-color:#0f0}.vuuConnectingStatus:after{--vuu-icon-svg: var(--svg-connecting-status);background-color:orange;transform:scale(1);animation:infinite pulse 1s}.vuuDisconnectedStatus:after{--vuu-icon-svg: var(--svg-disconnected-status);background-color:red;transform:scale(1);animation:infinite pulse .5s}@keyframes pulse{0%{transform:scale(.95);box-shadow:0 0 #000000b3}70%{transform:scale(1);box-shadow:0 0 #0000}to{transform:scale(.95);box-shadow:0 0 #0000}}.vuuLoginPanel{--hwTextInput-border: solid 1px #ccc;--hwTextInput-height: 28px;--hwTextInput-padding: 0 12px;--hwTextInput-width: 100%;--login-row-height: 60px;align-content:center;align-items:center;border:solid 1px lightgray;display:flex;flex-direction:column;gap:24px;justify-content:center;justify-items:center;margin:0 auto;padding:48px 48px 24px;width:fit-content}.vuuLoginPanel-login{grid-column:2/3;align-self:end;justify-self:end}.vuuSessionEditingForm{display:flex;flex-direction:column;gap:3px;min-width:200px;padding:6px}.vuuSessionEditingForm-content{display:flex;flex-direction:column;flex:1 1 auto;gap:3px}.vuuSessionEditingForm-field{align-items:center;display:flex;height:32px}.vuuSessionEditingForm-fieldLabel{flex:0 0 50%}.vuuSessionEditingForm-fieldValue{max-width:50%}.vuuSessionEditingForm-fieldValue.vuuReadOnly{font-weight:var(--salt-text-label-fontWeight-strong)}.vuuSessionEditingForm-buttonbar{align-items:center;border-top:solid 1px var(--salt-container-primary-borderColor);display:flex;justify-content:flex-end;flex:0 0 autox;gap:6px;padding-top:6px}.vuuSessionEditingForm-errorBanner{--vuu-icon-left: 3px;--vuu-icon-size: 18px;--vuu-icon-top: 3px;border:solid 1px var(--salt-status-error-borderColor);line-height:24px;padding:0 6px 0 26px;position:relative}.vuuUserPanel{background-color:#fff;display:flex;flex-direction:column;max-height:400px;padding:12px}vuuUserPanel-history{flex:1 1 auto}.vuuUserPanel-buttonBar{--saltButton-width: 100%;align-items:flex-end;border-top:1px solid var(--surface3);display:flex;flex:0 0 32px;justify-content:flex-start}.btn-logout{--hwButton-icon-left: 12px;--hwButton-padding: 0 6px 0 24px;padding-left:24px}.vuuUserProfile{--svg-icon: var(--svg-user)}.vuuThemeSwitch{--saltButton-minWidth: 22px}.vuuThemeSwitch{--svg-light: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><path d="M24 31q2.9 0 4.95-2.05Q31 26.9 31 24q0-2.9-2.05-4.95Q26.9 17 24 17q-2.9 0-4.95 2.05Q17 21.1 17 24q0 2.9 2.05 4.95Q21.1 31 24 31Zm0 3q-4.15 0-7.075-2.925T14 24q0-4.15 2.925-7.075T24 14q4.15 0 7.075 2.925T34 24q0 4.15-2.925 7.075T24 34ZM3.5 25.5q-.65 0-1.075-.425Q2 24.65 2 24q0-.65.425-1.075Q2.85 22.5 3.5 22.5h5q.65 0 1.075.425Q10 23.35 10 24q0 .65-.425 1.075-.425.425-1.075.425Zm36 0q-.65 0-1.075-.425Q38 24.65 38 24q0-.65.425-1.075.425-.425 1.075-.425h5q.65 0 1.075.425Q46 23.35 46 24q0 .65-.425 1.075-.425.425-1.075.425ZM24 10q-.65 0-1.075-.425Q22.5 9.15 22.5 8.5v-5q0-.65.425-1.075Q23.35 2 24 2q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 10 24 10Zm0 36q-.65 0-1.075-.425-.425-.425-.425-1.075v-5q0-.65.425-1.075Q23.35 38 24 38q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 46 24 46ZM12 14.1l-2.85-2.8q-.45-.45-.425-1.075.025-.625.425-1.075.45-.45 1.075-.45t1.075.45L14.1 12q.4.45.4 1.05 0 .6-.4 1-.4.45-1.025.45-.625 0-1.075-.4Zm24.7 24.75L33.9 36q-.4-.45-.4-1.075t.45-1.025q.4-.45 1-.45t1.05.45l2.85 2.8q.45.45.425 1.075-.025.625-.425 1.075-.45.45-1.075.45t-1.075-.45ZM33.9 14.1q-.45-.45-.45-1.05 0-.6.45-1.05l2.8-2.85q.45-.45 1.075-.425.625.025 1.075.425.45.45.45 1.075t-.45 1.075L36 14.1q-.4.4-1.025.4-.625 0-1.075-.4ZM9.15 38.85q-.45-.45-.45-1.075t.45-1.075L12 33.9q.45-.45 1.05-.45.6 0 1.05.45.45.45.45 1.05 0 .6-.45 1.05l-2.8 2.85q-.45.45-1.075.425-.625-.025-1.075-.425ZM24 24Z"/></svg>');--svg-dark: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><path d="M24 42q-7.5 0-12.75-5.25T6 24q0-7.5 5.25-12.75T24 6q.4 0 .85.025.45.025 1.15.075-1.8 1.6-2.8 3.95-1 2.35-1 4.95 0 4.5 3.15 7.65Q28.5 25.8 33 25.8q2.6 0 4.95-.925T41.9 22.3q.05.6.075.975Q42 23.65 42 24q0 7.5-5.25 12.75T24 42Zm0-3q5.45 0 9.5-3.375t5.05-7.925q-1.25.55-2.675.825Q34.45 28.8 33 28.8q-5.75 0-9.775-4.025T19.2 15q0-1.2.25-2.575.25-1.375.9-3.125-4.9 1.35-8.125 5.475Q9 18.9 9 24q0 6.25 4.375 10.625T24 39Zm-.2-14.85Z"/></svg>')}.salt-density-high .vuuThemeSwitch{--saltButton-minWidth: 16px;--saltButton-width: 18px;--vuuThemeSwitch-iconSize: 16px}.vuuThemeSwitch [data-icon]{--vuu-icon-size: var(--vuuThemeSwitch-iconSize,18px)}.vuuThemeSwitch [data-icon=light]{--vuu-icon-svg: var(--svg-light)}.vuuThemeSwitch [data-icon=dark]{--vuu-icon-svg: var(--svg-dark)}.vuuAppHeader{align-items:center;border-bottom:solid 1px var(--salt-container-secondary-borderColor);display:flex;height:40px;justify-content:flex-end}.vuuShell{background-color:var(--salt-container-primary-background, ivory);height:var(--vuuShell-height, 100vh);width:var(--vuuShell-width, 100vw)}.vuuShell-palette{--vuuView-border: none;--vuuView-margin: 0}.vuuShell-warningPlaceholder{background-color:var(--salt-container-background-high);height:100%}
|
|
2
2
|
/*# sourceMappingURL=index.css.map */
|
package/index.css.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../packages/vuu-shell/src/connection-status/ConnectionStatusIcon.css", "../../../packages/vuu-shell/src/login/LoginPanel.css", "../../../packages/vuu-shell/src/user-profile/UserPanel.css", "../../../packages/vuu-shell/src/user-profile/UserProfile.css", "../../../packages/vuu-shell/src/theme-switch/ThemeSwitch.css", "../../../packages/vuu-shell/src/app-header/AppHeader.css", "../../../packages/vuu-shell/src/shell.css"],
|
|
4
|
-
"sourcesContent": [".vuuStatus-container {\n\tdisplay: flex;\n}\n\n.vuuStatus-text {\n\talign-self: center;\n}\n\n\n.vuuStatus {\n\t--vuu-icon-height: 18px;\n\t--vuu-icon-padding: var(--vuuStatus-padding, 6px);\n\t--vuu-icon-width: var(--vuuStatus-width, auto);\n\t--vuu-icon-min-width: var(--vuuStatus-min-width, 20px);\n\talign-items: center;\n\tdisplay: inline-flex;\n\theight: var(--vuu-icon-height);\n\tjustify-content: center;\n\tmin-width: var(--vuu-icon-min-width);\n\tpadding: 0 var(--vuu-icon-padding);\n\twidth: var(--vuu-icon-width);\n\tposition: relative;\n}\n\n.vuuStatus[data-icon]::after {\n\tinset: 0 0 0 0;\n\tcontent: '';\n\tbox-shadow: 0 0 0 0 black;\n\tposition: absolute;\n\tmask: var(--vuu-icon-svg) center center/20px 20px no-repeat;\n\t-webkit-mask: var(--vuu-icon-svg) center center/20px 20px no-repeat;\n}\n\n.vuuActiveStatus::after {\n\t--vuu-icon-svg: var(--svg-active-status);\n\tbackground-color: rgb(0, 255, 0);\n}\n\n.vuuConnectingStatus::after {\n\t--vuu-icon-svg: var(--svg-connecting-status);\n\tbackground-color: orange;\n\ttransform: scale(1);\n\tanimation: infinite pulse 1s;\n}\n\n.vuuDisconnectedStatus::after {\n\t--vuu-icon-svg: var(--svg-disconnected-status);\n\tbackground-color: red;\n\ttransform: scale(1);\n\tanimation: infinite pulse 0.5s;\n}\n\n@keyframes pulse {\n\t0% {\n\t\ttransform: scale(0.95);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0.7);\n\t}\n\n\t70% {\n\t\ttransform: scale(1);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0);\n\t}\n\n\t100% {\n\t\ttransform: scale(0.95);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0);\n\t}\n}", ".vuuLoginPanel {\n --hwTextInput-border: solid 1px #ccc;\n --hwTextInput-height: 28px;\n --hwTextInput-padding: 0 12px;\n --hwTextInput-width: 100%;\n --login-row-height: 60px;\n align-content: center;\n align-items: center;\n border: solid 1px lightgray;\n display: flex;\n flex-direction: column;\n gap: 24px;\n justify-content: center;\n justify-items: center;\n margin: 0 auto;\n padding: 48px 48px 24px 48px;\n width: fit-content;\n}\n\n.vuuLoginPanel-login {\n grid-column: 2/3;\n align-self: end;\n justify-self: end;\n}\n", ".vuuUserPanel {\n background-color: white;\n display: flex;\n flex-direction: column;\n max-height: 400px;\n padding: 12px;\n}\n\nvuuUserPanel-history {\n flex: 1 1 auto;\n}\n\n.vuuUserPanel-buttonBar {\n --saltButton-width: 100%;\n align-items: flex-end;\n border-top: 1px solid var(--surface3);\n display: flex;\n flex: 0 0 32px;\n justify-content: flex-start;\n}\n\n.btn-logout {\n --hwButton-icon-left: 12px;\n --hwButton-padding: 0 6px 0 24px;\n padding-left: 24px;\n}\n", ".vuuUserProfile {\n --svg-icon: var(--svg-user);\n}\n", ".vuuThemeSwitch {\n --saltButton-minWidth: 22px;\n}\n\n.vuuThemeSwitch {\n --svg-light: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><path d=\"M24 31q2.9 0 4.95-2.05Q31 26.9 31 24q0-2.9-2.05-4.95Q26.9 17 24 17q-2.9 0-4.95 2.05Q17 21.1 17 24q0 2.9 2.05 4.95Q21.1 31 24 31Zm0 3q-4.15 0-7.075-2.925T14 24q0-4.15 2.925-7.075T24 14q4.15 0 7.075 2.925T34 24q0 4.15-2.925 7.075T24 34ZM3.5 25.5q-.65 0-1.075-.425Q2 24.65 2 24q0-.65.425-1.075Q2.85 22.5 3.5 22.5h5q.65 0 1.075.425Q10 23.35 10 24q0 .65-.425 1.075-.425.425-1.075.425Zm36 0q-.65 0-1.075-.425Q38 24.65 38 24q0-.65.425-1.075.425-.425 1.075-.425h5q.65 0 1.075.425Q46 23.35 46 24q0 .65-.425 1.075-.425.425-1.075.425ZM24 10q-.65 0-1.075-.425Q22.5 9.15 22.5 8.5v-5q0-.65.425-1.075Q23.35 2 24 2q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 10 24 10Zm0 36q-.65 0-1.075-.425-.425-.425-.425-1.075v-5q0-.65.425-1.075Q23.35 38 24 38q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 46 24 46ZM12 14.1l-2.85-2.8q-.45-.45-.425-1.075.025-.625.425-1.075.45-.45 1.075-.45t1.075.45L14.1 12q.4.45.4 1.05 0 .6-.4 1-.4.45-1.025.45-.625 0-1.075-.4Zm24.7 24.75L33.9 36q-.4-.45-.4-1.075t.45-1.025q.4-.45 1-.45t1.05.45l2.85 2.8q.45.45.425 1.075-.025.625-.425 1.075-.45.45-1.075.45t-1.075-.45ZM33.9 14.1q-.45-.45-.45-1.05 0-.6.45-1.05l2.8-2.85q.45-.45 1.075-.425.625.025 1.075.425.45.45.45 1.075t-.45 1.075L36 14.1q-.4.4-1.025.4-.625 0-1.075-.4ZM9.15 38.85q-.45-.45-.45-1.075t.45-1.075L12 33.9q.45-.45 1.05-.45.6 0 1.05.45.45.45.45 1.05 0 .6-.45 1.05l-2.8 2.85q-.45.45-1.075.425-.625-.025-1.075-.425ZM24 24Z\"/></svg>');\n --svg-dark: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><path d=\"M24 42q-7.5 0-12.75-5.25T6 24q0-7.5 5.25-12.75T24 6q.4 0 .85.025.45.025 1.15.075-1.8 1.6-2.8 3.95-1 2.35-1 4.95 0 4.5 3.15 7.65Q28.5 25.8 33 25.8q2.6 0 4.95-.925T41.9 22.3q.05.6.075.975Q42 23.65 42 24q0 7.5-5.25 12.75T24 42Zm0-3q5.45 0 9.5-3.375t5.05-7.925q-1.25.55-2.675.825Q34.45 28.8 33 28.8q-5.75 0-9.775-4.025T19.2 15q0-1.2.25-2.575.25-1.375.9-3.125-4.9 1.35-8.125 5.475Q9 18.9 9 24q0 6.25 4.375 10.625T24 39Zm-.2-14.85Z\"/></svg>');\n}\n\n.salt-density-high .vuuThemeSwitch {\n --saltButton-minWidth: 16px;\n --saltButton-width: 18px;\n --vuuThemeSwitch-iconSize: 16px;\n}\n\n.vuuThemeSwitch [data-icon] {\n --vuu-icon-size: var(--vuuThemeSwitch-iconSize,18px);\n}\n\n.vuuThemeSwitch [data-icon='light'] {\n --vuu-icon-svg: var(--svg-light);\n}\n.vuuThemeSwitch [data-icon='dark'] {\n --vuu-icon-svg: var(--svg-dark);\n}\n", ".vuuAppHeader {\n align-items: center;\n border-bottom: solid 1px var(--salt-container-secondary-borderColor);\n display: flex;\n height: 40px;\n justify-content: flex-end;\n}\n", ".vuuShell {\n background-color: var(--salt-container-primary-background, ivory);\n height: var(--vuuShell-height, 100vh);\n width: var(--vuuShell-width, 100vw);\n}\n\n.vuuShell-palette {\n --vuuView-border: none;\n --vuuView-margin: 0;\n}\n\n.vuuShell-warningPlaceholder {\n background-color: var(--salt-container-background-high);\n height: 100%;\n}\n"],
|
|
5
|
-
"mappings": "AAAA,qBACC,aAGD,gBACC,kBAID,WACC,wBACA,kDACA,+CACA,uDACA,mBACA,oBACA,8BACA,uBACA,oCACA,kCACA,4BACA,kBAGD,4BACC,cACA,WACA,oBACA,kBACA,2DACA,mEAGD,uBACC,yCACA,sBAGD,2BACC,6CACA,wBACA,mBACA,4BAGD,6BACC,+CACA,qBACA,mBACA,6BAGD,oBAEE,qBACA,6BAIA,mBACA,wBAIA,qBACA,sBCjEF,eACE,qCACA,2BACA,8BACA,0BACA,yBACA,qBACA,mBACA,2BACA,aACA,sBACA,SACA,uBACA,qBAbF,qCAgBE,kBAGF,qBACE,gBACA,eACA,iBCtBF,cACE,sBACA,aACA,sBACA,iBAJF,aAQA,qBACE,cAGF,wBACE,yBACA,qBACA,qCACA,aACA,cACA,2BAGF,YACE,2BACA,iCACA,kBCxBF,gBACE,4BCDF,gBACI,4BAGJ,gBACI,kgDACA,miBAGJ,mCACI,4BACA,yBACA,gCAGJ,4BACI,qDAGJ,kCACI,iCAEJ,iCACI,gCCvBJ,cACE,mBACA,oEACA,aACA,YACA,yBCLF,UACE,iEACA,qCACA,mCAGF,kBACE,uBACA,oBAGF,6BACE,uDACA",
|
|
3
|
+
"sources": ["../../../packages/vuu-shell/src/connection-status/ConnectionStatusIcon.css", "../../../packages/vuu-shell/src/login/LoginPanel.css", "../../../packages/vuu-shell/src/session-editing-form/SessionEditingForm.css", "../../../packages/vuu-shell/src/user-profile/UserPanel.css", "../../../packages/vuu-shell/src/user-profile/UserProfile.css", "../../../packages/vuu-shell/src/theme-switch/ThemeSwitch.css", "../../../packages/vuu-shell/src/app-header/AppHeader.css", "../../../packages/vuu-shell/src/shell.css"],
|
|
4
|
+
"sourcesContent": [".vuuStatus-container {\n\tdisplay: flex;\n}\n\n.vuuStatus-text {\n\talign-self: center;\n}\n\n\n.vuuStatus {\n\t--vuu-icon-height: 18px;\n\t--vuu-icon-padding: var(--vuuStatus-padding, 6px);\n\t--vuu-icon-width: var(--vuuStatus-width, auto);\n\t--vuu-icon-min-width: var(--vuuStatus-min-width, 20px);\n\talign-items: center;\n\tdisplay: inline-flex;\n\theight: var(--vuu-icon-height);\n\tjustify-content: center;\n\tmin-width: var(--vuu-icon-min-width);\n\tpadding: 0 var(--vuu-icon-padding);\n\twidth: var(--vuu-icon-width);\n\tposition: relative;\n}\n\n.vuuStatus[data-icon]::after {\n\tinset: 0 0 0 0;\n\tcontent: '';\n\tbox-shadow: 0 0 0 0 black;\n\tposition: absolute;\n\tmask: var(--vuu-icon-svg) center center/20px 20px no-repeat;\n\t-webkit-mask: var(--vuu-icon-svg) center center/20px 20px no-repeat;\n}\n\n.vuuActiveStatus::after {\n\t--vuu-icon-svg: var(--svg-active-status);\n\tbackground-color: rgb(0, 255, 0);\n}\n\n.vuuConnectingStatus::after {\n\t--vuu-icon-svg: var(--svg-connecting-status);\n\tbackground-color: orange;\n\ttransform: scale(1);\n\tanimation: infinite pulse 1s;\n}\n\n.vuuDisconnectedStatus::after {\n\t--vuu-icon-svg: var(--svg-disconnected-status);\n\tbackground-color: red;\n\ttransform: scale(1);\n\tanimation: infinite pulse 0.5s;\n}\n\n@keyframes pulse {\n\t0% {\n\t\ttransform: scale(0.95);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0.7);\n\t}\n\n\t70% {\n\t\ttransform: scale(1);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0);\n\t}\n\n\t100% {\n\t\ttransform: scale(0.95);\n\t\tbox-shadow: 0 0 0 0 rgba(0, 0, 0, 0);\n\t}\n}", ".vuuLoginPanel {\n --hwTextInput-border: solid 1px #ccc;\n --hwTextInput-height: 28px;\n --hwTextInput-padding: 0 12px;\n --hwTextInput-width: 100%;\n --login-row-height: 60px;\n align-content: center;\n align-items: center;\n border: solid 1px lightgray;\n display: flex;\n flex-direction: column;\n gap: 24px;\n justify-content: center;\n justify-items: center;\n margin: 0 auto;\n padding: 48px 48px 24px 48px;\n width: fit-content;\n}\n\n.vuuLoginPanel-login {\n grid-column: 2/3;\n align-self: end;\n justify-self: end;\n}\n", ".vuuSessionEditingForm {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 200px;\n padding: 6px;\n}\n\n.vuuSessionEditingForm-content {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n gap: 3px;\n}\n\n.vuuSessionEditingForm-field {\n align-items: center;\n display: flex;\n height: 32px;\n}\n\n.vuuSessionEditingForm-fieldLabel {\n flex: 0 0 50%;\n}\n\n.vuuSessionEditingForm-fieldValue {\n max-width: 50%;\n}\n\n.vuuSessionEditingForm-fieldValue.vuuReadOnly {\n font-weight: var(--salt-text-label-fontWeight-strong);\n}\n\n.vuuSessionEditingForm-buttonbar {\n align-items: center;\n border-top: solid 1px var(--salt-container-primary-borderColor);\n display: flex;\n justify-content: flex-end;\n flex: 0 0 autox;\n gap: 6px;\n padding-top: 6px;\n}\n\n.vuuSessionEditingForm-errorBanner {\n --vuu-icon-left: 3px;\n --vuu-icon-size: 18px;\n --vuu-icon-top: 3px;\n border: solid 1px var(--salt-status-error-borderColor);\n line-height: 24px;\n padding: 0 6px 0 26px;\n position: relative;\n}", ".vuuUserPanel {\n background-color: white;\n display: flex;\n flex-direction: column;\n max-height: 400px;\n padding: 12px;\n}\n\nvuuUserPanel-history {\n flex: 1 1 auto;\n}\n\n.vuuUserPanel-buttonBar {\n --saltButton-width: 100%;\n align-items: flex-end;\n border-top: 1px solid var(--surface3);\n display: flex;\n flex: 0 0 32px;\n justify-content: flex-start;\n}\n\n.btn-logout {\n --hwButton-icon-left: 12px;\n --hwButton-padding: 0 6px 0 24px;\n padding-left: 24px;\n}\n", ".vuuUserProfile {\n --svg-icon: var(--svg-user);\n}\n", ".vuuThemeSwitch {\n --saltButton-minWidth: 22px;\n}\n\n.vuuThemeSwitch {\n --svg-light: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><path d=\"M24 31q2.9 0 4.95-2.05Q31 26.9 31 24q0-2.9-2.05-4.95Q26.9 17 24 17q-2.9 0-4.95 2.05Q17 21.1 17 24q0 2.9 2.05 4.95Q21.1 31 24 31Zm0 3q-4.15 0-7.075-2.925T14 24q0-4.15 2.925-7.075T24 14q4.15 0 7.075 2.925T34 24q0 4.15-2.925 7.075T24 34ZM3.5 25.5q-.65 0-1.075-.425Q2 24.65 2 24q0-.65.425-1.075Q2.85 22.5 3.5 22.5h5q.65 0 1.075.425Q10 23.35 10 24q0 .65-.425 1.075-.425.425-1.075.425Zm36 0q-.65 0-1.075-.425Q38 24.65 38 24q0-.65.425-1.075.425-.425 1.075-.425h5q.65 0 1.075.425Q46 23.35 46 24q0 .65-.425 1.075-.425.425-1.075.425ZM24 10q-.65 0-1.075-.425Q22.5 9.15 22.5 8.5v-5q0-.65.425-1.075Q23.35 2 24 2q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 10 24 10Zm0 36q-.65 0-1.075-.425-.425-.425-.425-1.075v-5q0-.65.425-1.075Q23.35 38 24 38q.65 0 1.075.425.425.425.425 1.075v5q0 .65-.425 1.075Q24.65 46 24 46ZM12 14.1l-2.85-2.8q-.45-.45-.425-1.075.025-.625.425-1.075.45-.45 1.075-.45t1.075.45L14.1 12q.4.45.4 1.05 0 .6-.4 1-.4.45-1.025.45-.625 0-1.075-.4Zm24.7 24.75L33.9 36q-.4-.45-.4-1.075t.45-1.025q.4-.45 1-.45t1.05.45l2.85 2.8q.45.45.425 1.075-.025.625-.425 1.075-.45.45-1.075.45t-1.075-.45ZM33.9 14.1q-.45-.45-.45-1.05 0-.6.45-1.05l2.8-2.85q.45-.45 1.075-.425.625.025 1.075.425.45.45.45 1.075t-.45 1.075L36 14.1q-.4.4-1.025.4-.625 0-1.075-.4ZM9.15 38.85q-.45-.45-.45-1.075t.45-1.075L12 33.9q.45-.45 1.05-.45.6 0 1.05.45.45.45.45 1.05 0 .6-.45 1.05l-2.8 2.85q-.45.45-1.075.425-.625-.025-1.075-.425ZM24 24Z\"/></svg>');\n --svg-dark: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 48 48\"><path d=\"M24 42q-7.5 0-12.75-5.25T6 24q0-7.5 5.25-12.75T24 6q.4 0 .85.025.45.025 1.15.075-1.8 1.6-2.8 3.95-1 2.35-1 4.95 0 4.5 3.15 7.65Q28.5 25.8 33 25.8q2.6 0 4.95-.925T41.9 22.3q.05.6.075.975Q42 23.65 42 24q0 7.5-5.25 12.75T24 42Zm0-3q5.45 0 9.5-3.375t5.05-7.925q-1.25.55-2.675.825Q34.45 28.8 33 28.8q-5.75 0-9.775-4.025T19.2 15q0-1.2.25-2.575.25-1.375.9-3.125-4.9 1.35-8.125 5.475Q9 18.9 9 24q0 6.25 4.375 10.625T24 39Zm-.2-14.85Z\"/></svg>');\n}\n\n.salt-density-high .vuuThemeSwitch {\n --saltButton-minWidth: 16px;\n --saltButton-width: 18px;\n --vuuThemeSwitch-iconSize: 16px;\n}\n\n.vuuThemeSwitch [data-icon] {\n --vuu-icon-size: var(--vuuThemeSwitch-iconSize,18px);\n}\n\n.vuuThemeSwitch [data-icon='light'] {\n --vuu-icon-svg: var(--svg-light);\n}\n.vuuThemeSwitch [data-icon='dark'] {\n --vuu-icon-svg: var(--svg-dark);\n}\n", ".vuuAppHeader {\n align-items: center;\n border-bottom: solid 1px var(--salt-container-secondary-borderColor);\n display: flex;\n height: 40px;\n justify-content: flex-end;\n}\n", ".vuuShell {\n background-color: var(--salt-container-primary-background, ivory);\n height: var(--vuuShell-height, 100vh);\n width: var(--vuuShell-width, 100vw);\n}\n\n.vuuShell-palette {\n --vuuView-border: none;\n --vuuView-margin: 0;\n}\n\n.vuuShell-warningPlaceholder {\n background-color: var(--salt-container-background-high);\n height: 100%;\n}\n"],
|
|
5
|
+
"mappings": "AAAA,qBACC,aAGD,gBACC,kBAID,WACC,wBACA,kDACA,+CACA,uDACA,mBACA,oBACA,8BACA,uBACA,oCACA,kCACA,4BACA,kBAGD,4BACC,cACA,WACA,oBACA,kBACA,2DACA,mEAGD,uBACC,yCACA,sBAGD,2BACC,6CACA,wBACA,mBACA,4BAGD,6BACC,+CACA,qBACA,mBACA,6BAGD,oBAEE,qBACA,6BAIA,mBACA,wBAIA,qBACA,sBCjEF,eACE,qCACA,2BACA,8BACA,0BACA,yBACA,qBACA,mBACA,2BACA,aACA,sBACA,SACA,uBACA,qBAbF,qCAgBE,kBAGF,qBACE,gBACA,eACA,iBCtBF,uBACI,aACA,sBACA,QACA,gBAJJ,YAQA,+BACI,aACA,sBACA,cACA,QAGJ,6BACI,mBACA,aACA,YAGJ,kCACI,aAGJ,kCACI,cAGJ,8CACI,qDAGJ,iCACI,mBACA,+DACA,aACA,yBACA,eACA,QACA,gBAGJ,mCACI,qBACA,sBACA,oBACA,sDACA,iBAhDJ,qBAkDI,kBClDJ,cACE,sBACA,aACA,sBACA,iBAJF,aAQA,qBACE,cAGF,wBACE,yBACA,qBACA,qCACA,aACA,cACA,2BAGF,YACE,2BACA,iCACA,kBCxBF,gBACE,4BCDF,gBACI,4BAGJ,gBACI,kgDACA,miBAGJ,mCACI,4BACA,yBACA,gCAGJ,4BACI,qDAGJ,kCACI,iCAEJ,iCACI,gCCvBJ,cACE,mBACA,oEACA,aACA,YACA,yBCLF,UACE,iEACA,qCACA,mCAGF,kBACE,uBACA,oBAGF,6BACE,uDACA",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vuu-ui/vuu-shell",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "VUU UI Shell",
|
|
5
5
|
"author": "heswell",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
"@salt-ds/core": "1.2.0",
|
|
9
9
|
"@salt-ds/icons": "1.1.0",
|
|
10
10
|
"@heswell/salt-lab": "1.0.0-alpha.2",
|
|
11
|
-
"@vuu-ui/vuu-data": "0.7.
|
|
12
|
-
"@vuu-ui/vuu-layout": "0.7.
|
|
13
|
-
"@vuu-ui/vuu-utils": "0.7.
|
|
11
|
+
"@vuu-ui/vuu-data": "0.7.1",
|
|
12
|
+
"@vuu-ui/vuu-layout": "0.7.1",
|
|
13
|
+
"@vuu-ui/vuu-utils": "0.7.1"
|
|
14
14
|
},
|
|
15
15
|
"peerDependencies": {
|
|
16
16
|
"classnames": "^2.2.6",
|
package/types/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from "./connection-status";
|
|
|
2
2
|
export * from "./density-switch";
|
|
3
3
|
export * from "./feature";
|
|
4
4
|
export * from "./login";
|
|
5
|
+
export * from "./session-editing-form";
|
|
5
6
|
export * from "./shell";
|
|
6
7
|
export * from "./shellTypes";
|
|
7
8
|
export * from "./ShellContextProvider";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./use-layout-config";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { LayoutJSON } from "@vuu-ui/vuu-layout/src/layout-reducer";
|
|
2
|
+
import { VuuUser } from "../shell";
|
|
3
|
+
export declare const loadLocalConfig: (saveUrl: string, user: VuuUser, id?: string) => Promise<LayoutJSON>;
|
|
4
|
+
export declare const saveLocalConfig: (saveUrl: string, user: VuuUser, data: LayoutJSON) => Promise<undefined>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { LayoutJSON } from "@vuu-ui/vuu-layout/src/layout-reducer";
|
|
2
|
+
import { VuuUser } from "../shell";
|
|
3
|
+
export declare const loadRemoteConfig: (saveUrl: string, user: VuuUser, id?: string) => Promise<LayoutJSON>;
|
|
4
|
+
export declare const saveRemoteConfig: (saveUrl: string, user: VuuUser, data: LayoutJSON) => Promise<unknown>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { LayoutJSON } from "@vuu-ui/vuu-layout/src/layout-reducer";
|
|
2
|
+
import { VuuUser } from "../shell";
|
|
3
|
+
import { SaveLocation } from "../shellTypes";
|
|
4
|
+
export interface LayoutConfigHookProps {
|
|
5
|
+
defaultLayout: LayoutJSON;
|
|
6
|
+
saveLocation: SaveLocation;
|
|
7
|
+
saveUrl?: string;
|
|
8
|
+
user: VuuUser;
|
|
9
|
+
}
|
|
10
|
+
export type LayoutHookResult = [
|
|
11
|
+
LayoutJSON,
|
|
12
|
+
(layout: LayoutJSON) => void,
|
|
13
|
+
(id: string) => void
|
|
14
|
+
];
|
|
15
|
+
export declare const useLayoutConfig: ({ saveLocation, saveUrl, user, defaultLayout, }: LayoutConfigHookProps) => LayoutHookResult;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { HTMLAttributes } from "react";
|
|
2
|
+
import { VuuColumnDataType } from "@vuu-ui/vuu-protocol-types";
|
|
3
|
+
import { DataSource, TableSchema } from "@vuu-ui/vuu-data";
|
|
4
|
+
import "./SessionEditingForm.css";
|
|
5
|
+
type FormFieldDescriptor = {
|
|
6
|
+
label?: string;
|
|
7
|
+
name: string;
|
|
8
|
+
type: VuuColumnDataType;
|
|
9
|
+
description: string;
|
|
10
|
+
readonly?: boolean;
|
|
11
|
+
required?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type FormConfig = {
|
|
14
|
+
title: string;
|
|
15
|
+
key: string;
|
|
16
|
+
fields: FormFieldDescriptor[];
|
|
17
|
+
};
|
|
18
|
+
export interface SessionEditingFormProps extends HTMLAttributes<HTMLDivElement> {
|
|
19
|
+
config: FormConfig;
|
|
20
|
+
onClose: () => void;
|
|
21
|
+
dataSource?: DataSource;
|
|
22
|
+
schema?: TableSchema;
|
|
23
|
+
}
|
|
24
|
+
export declare const SessionEditingForm: ({ className, config: { fields, key: keyField }, dataSource: dataSourceProp, id: idProp, onClose, schema, ...htmlAttributes }: SessionEditingFormProps) => JSX.Element;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./SessionEditingForm";
|
package/types/shell.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { HTMLAttributes, ReactElement, ReactNode } from "react";
|
|
2
2
|
import { LayoutJSON } from "@vuu-ui/vuu-layout/src/layout-reducer";
|
|
3
3
|
import "./shell.css";
|
|
4
|
+
import { SaveLocation } from "./shellTypes";
|
|
4
5
|
export type VuuUser = {
|
|
5
6
|
username: string;
|
|
6
7
|
token: string;
|
|
@@ -10,7 +11,9 @@ export interface ShellProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
10
11
|
defaultLayout?: LayoutJSON;
|
|
11
12
|
leftSidePanel?: ReactElement;
|
|
12
13
|
loginUrl?: string;
|
|
14
|
+
saveLocation?: SaveLocation;
|
|
15
|
+
saveUrl?: string;
|
|
13
16
|
serverUrl?: string;
|
|
14
17
|
user: VuuUser;
|
|
15
18
|
}
|
|
16
|
-
export declare const Shell: ({ children, className: classNameProp, defaultLayout, leftSidePanel, loginUrl, serverUrl, user, ...htmlAttributes }: ShellProps) => JSX.Element;
|
|
19
|
+
export declare const Shell: ({ children, className: classNameProp, defaultLayout, leftSidePanel, loginUrl, saveLocation, saveUrl, serverUrl, user, ...htmlAttributes }: ShellProps) => JSX.Element;
|
package/types/shellTypes.d.ts
CHANGED