@owox/web 0.38.0 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import{aM as e}from"./index-BW17AtYZ.js";/**
1
+ import{aM as e}from"./index-C-XEQ2rM.js";/**
2
2
  * @license lucide-react v0.475.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{aM as e}from"./index-BW17AtYZ.js";/**
1
+ import{aM as e}from"./index-C-XEQ2rM.js";/**
2
2
  * @license lucide-react v0.475.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
package/dist/index.html CHANGED
@@ -6,8 +6,8 @@
6
6
  <link rel="icon" type="image/png" href="/favicon.png" />
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
8
  <title>OWOX</title>
9
- <script type="module" crossorigin src="/assets/index-BW17AtYZ.js"></script>
10
- <link rel="stylesheet" crossorigin href="/assets/index-Bu4VCLfp.css">
9
+ <script type="module" crossorigin src="/assets/index-C-XEQ2rM.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-KD-3hIzT.css">
11
11
  </head>
12
12
  <body translate="no" class="notranslate">
13
13
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owox/web",
3
- "version": "0.38.0",
3
+ "version": "0.40.0",
4
4
  "description": "Web interface for OWOX Data Marts - an open-source solution for Data Analysts",
5
5
  "author": "OWOX",
6
6
  "license": "ELv2",
@@ -72,7 +72,7 @@
72
72
  "@vitejs/plugin-basic-ssl": "^2.1.0",
73
73
  "@vitejs/plugin-react": "^4.4.1",
74
74
  "@vitest/coverage-v8": "^4.1.8",
75
- "happy-dom": "^20.8.9",
75
+ "happy-dom": "^21.0.4",
76
76
  "typescript-eslint": "^8",
77
77
  "vite": "^6.3.5",
78
78
  "vitest": "^4.1.8"
@@ -1 +0,0 @@
1
- import{j as s,D as Oe,u as _e,r,C as Ae,N as Me,T as Re,a as ve,I as ke,b as Pe,E as Te,B as Le,t as be,c as U,M as Fe,g as He,d as Ge,e as We,h as Be,i as he,f as Ke}from"./index-BW17AtYZ.js";import{O as Ne,a as ze,g as $e,N as Ye,R as Ze,u as Ve,P as q,H as ee,S as te,E as Xe,b as Je,c as ge,d as Ue,e as qe,f as Qe,h as et,C as tt,i as st,M as it,j as nt,k as at,W as ae,D as Ce,l as se,m as ne,n as ot,r as rt,o as lt,p as ct,q as dt,s as ut,t as ht,B as gt,v as ft,w as pt,x as mt,y as xt,z as bt,A as Nt}from"./erd-fields-section-_gVp8PxG.js";import{L as Ct,Z as Et,a as It}from"./zoom-out-C2ChQihe.js";const yt=[{part:"source",label:"Input source",helper:"View, Table, SQL, Pattern or Connector"},{part:"fields",label:"Fields",helper:"Number of fields of the Data Mart"},{part:"status",label:"Status",helper:"Published or draft dot next to the title"},{part:"fieldAlias",label:"Field aliases",helper:"Output Schema alias in place of the name"},{part:"fieldDescription",label:"Field descriptions",helper:"Output Schema description under each field"}];function fe({isDraft:i,decorative:e=!1}){const l=i?"Draft":"Published";return s.jsxs("span",{className:"inline-flex shrink-0 items-center",title:l,children:[s.jsx("span",{className:"h-2 w-2 rounded-full",style:{background:i?Ne:ze},"aria-hidden":"true"}),!e&&s.jsx("span",{className:"sr-only",children:l})]})}function jt({type:i,joined:e=!1}){if(!i)return null;const l=Oe.getInfo(i),c=l.icon;return s.jsxs("span",{className:`border-border inline-flex items-center gap-1 border px-1.5 py-0.25 text-[8px] font-semibold tracking-wide uppercase ${e?"rounded-r-full":"-ml-0.5 rounded-full"}`,children:[s.jsx(c,{className:"h-2.5 w-2.5"}),l.displayName]})}const Y=3,Ee=.05,wt=1e-4,pe=1;function Dt(i,e,l,c){const d=i.maxX-i.minX,f=i.maxY-i.minY;return d<=0||f<=0||e<=0||l<=0?null:$e({x:i.minX,y:i.minY,width:d,height:f},e,l,Ee,Y,c)}function St(i){const e=Number.isFinite(i)&&i>0?Math.min(i,Y):pe;return{min:e>=Y?pe:e,max:Y}}function Ot(i,e,l){if(!Number.isFinite(i)||i<=0)return null;const c=i*(1+e),d=Math.min(Math.max(c,l.min),l.max);return!Number.isFinite(d)||Math.abs(d-i)<wt||e>0!=d>i?null:{zoom:d,delta:d/i-1}}const Z=240,Ie=48,Q=92,_t=.85,ie=1/_t-1,At=150,Mt=Ne;function me({data:i}){const e=He(i);if(!e)return null;const l=e.kind==="attention";return s.jsxs("span",{title:l?Ge:void 0,style:{position:"absolute",top:-18,right:4,display:"inline-flex",alignItems:"center",gap:2,fontSize:10,fontWeight:600,color:l?at:ae,lineHeight:1,whiteSpace:"nowrap"},children:[l&&s.jsx(We,{style:{width:12,height:12,color:Mt}}),e.label]})}function ye(i){return i==="erd"?bt:Z}function xe(i,e){return{width:i.isSource?Z:ye(i.viewMode),borderColor:i.highlighted?se:Be(i)?ae:e?ne:void 0,boxShadow:i.highlighted?`0 0 0 3px ${se}40, 0 0 12px ${se}60`:e?`0 0 0 1px ${ne}`:void 0,opacity:i.dimmed?Ce:1,filter:i.dimmed?"grayscale(0.8)":void 0,animation:i.highlighted?"node-pulse 1.5s ease-in-out infinite":void 0,transition:"opacity 0.2s, filter 0.2s",cursor:"pointer"}}function Rt({id:i,data:e,selected:l}){const[c,d]=r.useState(!1),f=Ve();r.useEffect(()=>{f(i)},[c,i,f]);const b=e.objectLabels,N=!b.source,u=!b.fields,S=!b.status,O=e.direction==="vertical"?q.Top:q.Left,C=e.direction==="vertical"?q.Bottom:q.Right;function y(p){p.stopPropagation(),p.preventDefault(),e.onOpenExternal()}if(e.isSource)return s.jsxs("div",{className:"bg-primary/5 relative flex items-center gap-2 rounded-xl border shadow-sm",style:{...xe(e,l),height:Ie,padding:"0 14px"},children:[s.jsx(me,{data:e}),s.jsx("span",{className:"text-foreground flex-1 truncate text-[13px] font-semibold",title:e.label,children:e.label}),S&&s.jsx(fe,{isDraft:e.isDraft,decorative:!0}),e.hasOutgoing&&s.jsx(ee,{type:"source",position:C,isConnectable:!1,style:te})]});const j=`Open ${e.label} in new tab`,w=e.viewMode==="erd"&&e.fields.length>0;return s.jsxs("div",{title:e.isCycleStub?Ae:void 0,className:"bg-background relative flex flex-col rounded-xl border shadow-sm",style:xe(e,l),children:[s.jsx(me,{data:e}),s.jsx(ee,{type:"target",position:O,isConnectable:!1,style:te}),s.jsxs("div",{className:"flex items-center gap-2 px-3.5 pt-3 pb-1",children:[s.jsx("span",{className:"text-foreground flex-1 truncate text-[13px] font-semibold",title:e.label,children:e.label}),S&&s.jsx(fe,{isDraft:e.isDraft,decorative:!0}),!e.userHasAccess&&s.jsx(Me,{}),e.description&&s.jsxs(Re,{children:[s.jsx(ve,{asChild:!0,children:s.jsx("button",{type:"button",className:"text-muted-foreground hover:text-foreground inline-flex cursor-default rounded p-0.5 transition-colors","aria-label":`Description for ${e.label}`,onPointerDown:p=>{p.stopPropagation()},children:s.jsx(ke,{className:"h-3.5 w-3.5","aria-hidden":"true"})})}),s.jsx(Pe,{side:"top",align:"center",role:"tooltip",className:"max-w-xs",children:e.description})]}),s.jsx("button",{type:"button",className:"text-muted-foreground hover:text-foreground shrink-0 cursor-pointer rounded p-0.5 transition-colors",onPointerDown:p=>{p.stopPropagation()},onClick:y,title:j,"aria-label":j,children:s.jsx(Te,{className:"h-3.5 w-3.5","aria-hidden":"true"})})]}),s.jsxs("div",{className:"flex min-w-0 items-center gap-2 px-3.5 pt-1 pb-3",children:[N&&s.jsx(jt,{type:e.definitionType}),e.targetAlias&&s.jsx(Le,{variant:"secondary",className:"inline-block max-w-[90px] truncate px-1.5 py-0 text-[10px]",title:e.targetAlias,children:e.targetAlias}),u&&s.jsxs("span",{className:"text-muted-foreground ml-auto shrink-0 text-[11px]",children:[e.fieldCount??0," field",e.fieldCount!==1?"s":""]})]}),w&&s.jsx(Xe,{fields:e.fields,labels:be(b),expanded:c,onToggleExpanded:()=>{d(p=>!p)}}),e.hasOutgoing&&s.jsx(ee,{type:"source",position:C,isConnectable:!1,style:te})]})}function vt({id:i,sourceX:e,sourceY:l,targetX:c,targetY:d,sourcePosition:f,targetPosition:b,selected:N,data:u}){const[S,O,C]=ct({sourceX:e,sourceY:l,sourcePosition:f,targetX:c,targetY:d,targetPosition:b}),y=u.warning?ae:N?ne:dt,j=r.useId(),w=ut("rel-arrow",j);return s.jsxs(s.Fragment,{children:[s.jsx(ht,{markerId:w,color:y,withStart:!1}),s.jsx(gt,{id:i,path:S,markerEnd:`url(#${w}-end)`,style:{stroke:y,strokeWidth:N?pt:mt,strokeDasharray:u.warning?ft:void 0,opacity:u.dimmed?Ce:1,transition:"opacity 0.2s, stroke 0.2s"}}),s.jsx(xt,{x:O,y:C,lines:u.joinLabel,selected:N??!1,dimmed:u.dimmed})]})}const kt={relationshipNode:Rt},Pt={relationshipEdge:vt};function Tt(i){return JSON.stringify([i.nodes.map(e=>[e.id,e.data.isSource,e.data.label,e.data.targetAlias,e.data.fieldCount,e.data.description,e.data.isDraft,e.data.isBlocked,e.data.isJoinNotConfigured,e.data.isCycleStub,e.data.isMissingPrimaryKey,e.data.userHasAccess,e.data.hasOutgoing]),i.edges.map(e=>[e.id,e.source,e.target,e.data.warning])])}function Lt(i,e,l,c){return i?Ie:l!=="erd"?Q:Q+Nt(e,c)}function Ft({dataMartId:i,dataMartTitle:e,dataMartDescription:l,dataMartStatus:c,rootDefinitionType:d,definitionTypes:f,initialRelationships:b,graph:N,fieldCounts:u,showLooped:S,statusFilter:O,viewMode:C,objectLabels:y,direction:j,showJoinFields:w,fieldsByAliasPath:p,onOpenExternal:T}){let G=0;const R=(t,a)=>a&&!S||O!=="all"&&t!==O?(G++,!1):!0,_=new Map,M=[],W=new Set,L=c==="DRAFT";_.set(i,{dmId:i,title:e,description:l,depth:0,isSource:!0,isDraft:L,userHasAccess:!0});const h=new Map;h.set("",i);function E(t,a,m,I,A){const z=`path:${I}`;M.push({sourceId:t,targetId:z,joinLabel:w?A.map(X=>`${X.sourceFieldName} = ${X.targetFieldName}`):[]}),W.add(t),_.set(z,{dmId:a,aliasPath:I,...m}),h.set(I,z)}if(N)for(const t of N.nodes){const a=t.aliasPath.lastIndexOf("."),m=a===-1?"":t.aliasPath.slice(0,a),I=h.get(m);I&&R(t.relationship.targetDataMart.status,t.isCycleStub)&&E(I,t.relationship.targetDataMart.id,{title:t.relationship.targetDataMart.title,description:t.relationship.targetDataMart.description,depth:t.depth,isSource:!1,targetAlias:t.relationship.targetAlias,fieldCount:(u==null?void 0:u.get(t.relationship.id))??0,isDraft:t.relationship.targetDataMart.status==="DRAFT",isBlocked:t.isBlocked,isJoinNotConfigured:t.relationship.joinConditions.length===0,isCycleStub:t.isCycleStub,isMissingPrimaryKey:he(t.relationship.targetDataMart.hasPrimaryKey,t.relationship.joinConditions.length),userHasAccess:t.relationship.targetDataMart.userHasAccess},t.aliasPath,t.relationship.joinConditions)}else for(const t of b)R(t.targetDataMart.status,t.targetDataMart.id===i)&&E(i,t.targetDataMart.id,{title:t.targetDataMart.title,description:t.targetDataMart.description,depth:1,isSource:!1,targetAlias:t.targetAlias,fieldCount:(u==null?void 0:u.get(t.id))??0,isDraft:t.targetDataMart.status==="DRAFT",isBlocked:L,isJoinNotConfigured:t.joinConditions.length===0,isCycleStub:t.targetDataMart.id===i,isMissingPrimaryKey:he(t.targetDataMart.hasPrimaryKey,t.joinConditions.length),userHasAccess:t.targetDataMart.userHasAccess},t.targetAlias,t.joinConditions);const D=new Map,v=new Map,F=new Map,g=be(y);for(const[t,a]of _){const m=a.isSource||a.aliasPath===void 0?[]:(p==null?void 0:p.get(a.aliasPath))??[];D.set(t,m),v.set(t,a.isSource?Z:ye(C)),F.set(t,Lt(a.isSource,m,C,g))}const V=[..._.keys()].map(t=>({id:t,width:v.get(t)??Z,height:F.get(t)??Q})),B=M.map(t=>({id:`${t.sourceId}->${t.targetId}`,sourceId:t.sourceId,targetId:t.targetId,label:ot(t.joinLabel)})),{positions:k}=rt(V,B,j),H=[];for(const[t,a]of _)H.push({id:t,type:"relationshipNode",position:k.get(t)??{x:0,y:0},width:v.get(t)??Z,height:F.get(t)??Q,draggable:!1,selectable:!1,focusable:!1,style:lt,data:{isSource:a.isSource,label:a.title,targetAlias:a.targetAlias,fieldCount:a.fieldCount,description:a.description,definitionType:a.isSource?d:(f==null?void 0:f.get(a.dmId))??null,isDraft:a.isDraft??!1,isBlocked:a.isBlocked??!1,isJoinNotConfigured:a.isJoinNotConfigured??!1,isCycleStub:a.isCycleStub??!1,isMissingPrimaryKey:a.isMissingPrimaryKey??!1,userHasAccess:a.userHasAccess,hasOutgoing:W.has(t)&&!a.isCycleStub,highlighted:!1,dimmed:!1,fields:D.get(t)??[],viewMode:C,objectLabels:y,direction:j,onOpenExternal:()=>{T(a.dmId)}}});const P=[];for(const t of M){const a=_.get(t.sourceId),m=_.get(t.targetId);if(!a||!m)continue;const I=Ke(a,m);P.push({id:`${t.sourceId}->${t.targetId}`,type:"relationshipEdge",source:t.sourceId,target:t.targetId,focusable:!1,selectable:!1,data:{warning:I,dimmed:!1,joinLabel:t.joinLabel}})}return{nodes:H,edges:P,filteredOutCount:G}}function Ht({dataMartId:i,dataMartTitle:e,dataMartDescription:l,dataMartStatus:c,dataMartDefinitionType:d,definitionTypes:f,relationships:b,relationshipGraph:N,connectedFieldCounts:u,searchQuery:S,onRequestFullscreen:O,onOpenExternal:C,showLooped:y,statusFilter:j,viewMode:w,onViewModeChange:p,direction:T,onDirectionChange:G,showJoinFields:R,onShowJoinFieldsChange:_,objectLabels:M,onObjectLabelsChange:W,fieldsByAliasPath:L}){const h=Je(),E=ge(n=>n.width),D=ge(n=>n.height),v=r.useRef(!1),F=r.useRef(!1),g=r.useMemo(()=>Ft({dataMartId:i,dataMartTitle:e,dataMartDescription:l,dataMartStatus:c,rootDefinitionType:d??null,definitionTypes:f,initialRelationships:b,graph:N,fieldCounts:u,showLooped:y,statusFilter:j,viewMode:w,objectLabels:M,direction:T,showJoinFields:R,fieldsByAliasPath:L,onOpenExternal:C}),[i,e,l,c,d,f,b,N,u,y,j,w,M,T,R,L,C]),[V,B]=r.useState(null),[k,H]=r.useState(null),P=r.useMemo(()=>Tt(g),[g]),t=r.useMemo(()=>Ue(g.nodes),[g.nodes]),a=r.useRef(P),m=r.useMemo(()=>Dt(t,E,D,ie),[t,E,D]),I=r.useMemo(()=>St((m==null?void 0:m.zoom)??Number.NaN),[m]);r.useEffect(()=>{a.current!==P&&(a.current=P,F.current=!1,H(n=>n!==null&&g.nodes.some(o=>o.id===n)?n:null),B(n=>n!==null&&g.edges.some(o=>o.id===n)?n:null))},[P,g]);const A=r.useMemo(()=>qe(g.nodes,S,n=>n.id,n=>n.data.label),[g.nodes,S]),z=r.useMemo(()=>g.nodes.map(n=>{const o=A.get(n.id)??Qe,x=n.id===k;return n.data.highlighted===o.highlighted&&n.data.dimmed===o.dimmed&&(n.selected??!1)===x?n:{...n,selected:x,data:{...n.data,...o}}}),[g.nodes,A,k]),X=r.useMemo(()=>g.edges.map(n=>{var de,ue;const o=(((de=A.get(n.source))==null?void 0:de.dimmed)??!1)&&(((ue=A.get(n.target))==null?void 0:ue.dimmed)??!1),x=n.id===V||k!==null&&(n.source===k||n.target===k);return n.data.dimmed===o&&(n.selected??!1)===x?n:{...n,selected:x,data:{...n.data,dimmed:o}}}),[g.edges,A,V,k]),je=r.useCallback((n,o)=>{B(x=>x===o.id?null:o.id),H(null)},[]),we=r.useCallback((n,o)=>{H(x=>x===o.id?null:o.id),B(null)},[]),De=r.useCallback(()=>{B(null),H(null)},[]),oe=r.useRef(A);oe.current=A;const J=r.useCallback(()=>{const n=[...oe.current.entries()].filter(([,o])=>o.highlighted).map(([o])=>o);n.length!==0&&h.fitView({nodes:n.map(o=>({id:o})),duration:300,padding:ie})},[h]),$=r.useCallback(()=>h.fitView({minZoom:Ee,maxZoom:Y,padding:ie}),[h]),re=r.useRef(m);re.current=m;const le=r.useCallback(()=>{const n=re.current;return n?h.setViewport(n):$()},[$,h]),K=r.useCallback(()=>{F.current=!0},[]);r.useEffect(()=>{E===0||D===0||F.current||le().then(()=>{v.current=!0,J()})},[E,D,P,le,J]),r.useEffect(()=>{v.current&&J()},[A,J]);const ce=r.useCallback(n=>{K();const o=h.getZoom();if(!Number.isFinite(o)||o<=0){$();return}const x=Ot(o,n,I);x&&h.zoomTo(x.zoom,{duration:150})},[$,K,h,I]),Se=r.useCallback((n,o)=>{if(E===0||D===0||!Number.isFinite(o.zoom))return;const x=et(o,t,E,D,At);x.x===o.x&&x.y===o.y||h.setViewport(x)},[t,D,E,h]);return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"absolute top-3 right-3 z-10 flex items-start gap-2",children:s.jsxs("div",{className:"flex flex-col gap-1.5",children:[s.jsx(U,{variant:"outline",size:"icon",className:"h-12 w-12",onClick:()=>{K(),$()},"aria-label":"Fit to view",children:s.jsx(Ct,{className:"h-6 w-6"})}),s.jsx(U,{variant:"outline",size:"icon",className:"h-12 w-12",onClick:()=>{ce(.25)},"aria-label":"Zoom in",children:s.jsx(Et,{className:"h-6 w-6"})}),s.jsx(U,{variant:"outline",size:"icon",className:"h-12 w-12",onClick:()=>{ce(-.25)},"aria-label":"Zoom out",children:s.jsx(It,{className:"h-6 w-6"})}),O&&s.jsx(U,{variant:"outline",size:"icon",className:"h-12 w-12",onClick:O,"aria-label":"Expand diagram",children:s.jsx(Fe,{className:"h-6 w-6"})}),s.jsx(tt,{viewMode:w,onViewModeChange:p,direction:T,onDirectionChange:G,showJoinFields:R,onShowJoinFieldsChange:_,objectLabels:M,onObjectLabelsChange:W,objectLabelOptions:yt})]})}),s.jsxs("div",{className:"h-full w-full",onPointerDownCapture:K,onWheelCapture:K,children:[s.jsx(st,{nodes:z,edges:X,nodeTypes:kt,edgeTypes:Pt,nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!1,edgesFocusable:!1,zoomOnDoubleClick:!1,minZoom:I.min,maxZoom:I.max,onEdgeClick:je,onNodeClick:we,onPaneClick:De,deleteKeyCode:null,panActivationKeyCode:null,onMove:Se,onMoveStart:n=>{n&&K()},proOptions:{hideAttribution:!0},style:{width:"100%",height:"100%"},children:s.jsx(it,{pannable:!0,zoomable:!0,style:{width:140,height:100},nodeColor:nt})}),g.nodes.length===1&&g.filteredOutCount>0&&s.jsx("div",{className:"pointer-events-none absolute inset-x-0 bottom-6 flex justify-center",children:s.jsx("span",{className:"bg-background text-muted-foreground rounded-md border px-3 py-1.5 text-sm shadow-sm",children:"No related data marts match the current filters"})})]})]})}function Kt({dataMartId:i,dataMartTitle:e,dataMartDescription:l,dataMartStatus:c,dataMartDefinitionType:d,definitionTypes:f,relationships:b,relationshipGraph:N,connectedFieldCounts:u,searchQuery:S,onRequestFullscreen:O,showLooped:C,statusFilter:y,viewMode:j,onViewModeChange:w,direction:p,onDirectionChange:T,showJoinFields:G,onShowJoinFieldsChange:R,objectLabels:_,onObjectLabelsChange:M,fieldsByAliasPath:W,className:L,style:h}){const{scope:E}=_e(),D=r.useCallback(v=>{window.open(E(`/data-marts/${v}/data-setup`),"_blank","noopener,noreferrer")},[E]);return b.length===0?null:s.jsxs("div",{className:`relative overflow-hidden rounded-lg border ${L??""}`,style:h??{height:480},children:[s.jsx("style",{children:Ye}),s.jsx(Ze,{children:s.jsx(Ht,{dataMartId:i,dataMartTitle:e,dataMartDescription:l,dataMartStatus:c,dataMartDefinitionType:d,definitionTypes:f,relationships:b,relationshipGraph:N,connectedFieldCounts:u,searchQuery:S,onRequestFullscreen:O,onOpenExternal:D,showLooped:C,statusFilter:y,viewMode:j,onViewModeChange:w,direction:p,onDirectionChange:T,showJoinFields:G,onShowJoinFieldsChange:R,objectLabels:_,onObjectLabelsChange:M,fieldsByAliasPath:W})})]})}export{Kt as RelationshipCanvas,Rt as RelationshipFlowNode};