@bygd/nc-report-ui 0.1.21 → 0.1.22
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 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@material-ui/core/Paper"),a=require("@material-ui/core/styles"),n=require("@material-ui/core"),r=require("react-google-charts"),l=require("numeral"),i=require("axios"),o=require("@material-ui/core/Typography"),s=require("nunjucks"),c=require("@material-ui/core/FormControl"),d=require("@material-ui/core/Select"),u=require("@material-ui/core/MenuItem"),m=require("react-intersection-observer"),f=require("@mui/material"),p=require("@mui/icons-material/CheckBoxOutlineBlank"),g=require("@mui/icons-material/CheckBox"),h=require("@mui/material/Box"),y=require("@mui/material/InputLabel"),E=require("@mui/material/MenuItem"),v=require("@mui/material/FormControl"),x=require("@mui/material/Select"),b=require("eventemitter3"),w=require("@material-ui/core/Grid"),S=require("@material-ui/core/Container"),C=require("@mui/x-data-grid"),k=require("@mui/icons-material/Add"),D=require("@mui/icons-material/Edit"),T=require("@mui/icons-material/ContentCopy"),R=require("@mui/icons-material/Delete"),B=require("@mui/icons-material/PlayArrow"),P=require("@mui/icons-material/ArrowBack"),q=require("@mui/icons-material/Save"),M=require("@mui/icons-material/Download"),z=require("@dnd-kit/core"),$=require("@dnd-kit/sortable"),F=require("@dnd-kit/utilities"),I=require("@mui/icons-material/DragIndicator"),A=require("@mui/icons-material/ArrowUpward"),O=require("@mui/icons-material/ArrowDownward"),j=require("@mui/icons-material/Sort"),_=require("@mui/icons-material/Check"),N=require("@mui/icons-material/Close"),K=require("@mui/icons-material/RestartAlt"),U=require("@mui/icons-material/PlaylistAdd"),L=require("@mui/icons-material/FilterAlt"),Y=require("@mui/x-date-pickers/LocalizationProvider"),W=require("@mui/x-date-pickers/DatePicker"),H=require("@mui/x-date-pickers/AdapterDayjs"),G=require("dayjs");function V(e){return e&&e.__esModule?e:{default:e}}function Z(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(a){if("default"!==a){var n=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,n.get?n:{enumerable:!0,get:function(){return e[a]}})}}),t.default=e,Object.freeze(t)}var J=Z(e),Q=V(t),X=V(l),ee=V(i),te=V(o),ae=V(s),ne=V(c),re=V(d),le=V(u),ie=V(p),oe=V(g),se=V(h),ce=V(y),de=V(E),ue=V(v),me=V(x),fe=V(b),pe=V(w),ge=V(S),he=V(k),ye=V(D),Ee=V(T),ve=V(R),xe=V(B),be=V(P),we=V(q),Se=V(M),Ce=V(I),ke=V(A),De=V(O),Te=V(j),Re=V(_),Be=V(N),Pe=V(K),qe=V(U),Me=V(L),ze=V(G);function $e(){return $e=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)({}).hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},$e.apply(null,arguments)}const Fe=a.makeStyles(e=>({root:{width:"100%","& > * + *":{marginTop:e.spacing(2)}}}));function Ie(e){const t=Fe();return J.default.createElement("div",$e({className:t.root},e),J.default.createElement(n.CircularProgress,{style:{color:"rgb(70, 134, 128)"},size:25}))}function Ae(e,t,a="array"){const n=e.columns,r=[...t.doc.metrics,...t.doc.dimensions].reduce((e,t)=>(e[t.name]=t,e),{});return e=>{const t="array"===a?[]:{};return n.reduce((t,n)=>{const l=e[n.name],i=r[n.name];let o=l;return o="timestamp"===i.type?new Date(l):i.format?i.format&&i.prefix?{v:+l,f:i.prefix+" "+X.default(l).format(i.format)}:i.format?{v:+l,f:X.default(l).format(i.format)}:l:l,"array"===a?t.push(o):t[n.name]=o?.f||o,t},t)}}const Oe="https://report-api.netcapital.pro",je=ee.default.create({baseURL:Oe,headers:{"Content-Type":"application/json"}}),_e={},Ne=()=>{const e=Object.keys(_e);return e.length>0?e[0]:null},Ke={setBaseUrl(e){je.defaults.baseURL=e||Oe},setToken(e){e&&(je.defaults.headers.common.Authorization=`Bearer ${e}`)},loadDashboardMeta:async({dashboardId:e})=>{const{data:t}=await je.get(`/dashboard-meta/${e}`);return _e[e]={dashboards:t.dashboards||{},charts:t.charts||{},reports:t.reports||{},reportMetadata:t.reportMetadata||{},dateRanges:t.dateRanges||[]},_e[e]},getDashboard:async({id:e,dashboardId:t})=>{const a=t||Ne();if(a&&_e[a]?.dashboards?.[e])return _e[a].dashboards[e];const{data:n}=await je.get(`/entity/dashboards/${e}`);return n},getChart:async({id:e,dashboardId:t})=>{const a=t||Ne();if(a&&_e[a]?.charts?.[e])return _e[a].charts[e];const{data:n}=await je.get(`/entity/charts/${e}`);return n},getReport:async({id:e,dashboardId:t})=>{const a=t||Ne();if(a&&_e[a]?.reports?.[e])return _e[a].reports[e];const{data:n}=await je.get(`/entity/reports/${e}`);return n},getProviders:async()=>{const{data:e}=await je.get("/entity/providers");return e},getReportSchema:async({id:e,dashboardId:t,query:a={}})=>{const n=t||Ne();if(n&&_e[n]?.reportMetadata?.[e])return _e[n].reportMetadata[e];const{data:r}=await je.post(`/reports/${e}/metadata`,a);return r},runReport:async({id:e,query:t={}})=>{const{data:a}=await je.post(`/reports/${e}/run`,t);return a},runAdHocReport:async({report:e})=>{const{data:t}=await je.post("/report-build/run",e);return t},downloadAdHocReport:async({report:e,filename:t})=>{const a=await je.post("/report-build/run?download=csv",e,{responseType:"blob"}),n=window.URL.createObjectURL(new Blob([a.data])),r=document.createElement("a");r.href=n;let l=t||"report.csv";if(!t){const e=a.headers["content-disposition"];if(e){const t=e.match(/filename="?(.+)"?/i);t&&t[1]&&(l=t[1])}}r.setAttribute("download",l),document.body.appendChild(r),r.click(),r.remove(),window.URL.revokeObjectURL(n)},getDateRanges:async({dashboardId:e}={})=>{const t=e||Ne();if(t&&_e[t]?.dateRanges)return _e[t].dateRanges;const{data:a}=await je.get("/globals/date-ranges");return a},getReportDefinitions:async()=>{const{data:e}=await je.get("/report-definitions");return e},getReportDefinition:async({id:e})=>{const{data:t}=await je.get(`/report-definitions/${e}`);return t},createReportDefinition:async({reportDefinition:e})=>{const{data:t}=await je.post("/report-definitions",e);return t},updateReportDefinition:async({id:e,reportDefinition:t})=>{const{data:a}=await je.put(`/report-definitions/${e}`,t);return a},deleteReportDefinition:async({id:e})=>{const{data:t}=await je.delete(`/report-definitions/${e}`);return t}},Ue=a.makeStyles(e=>({headerRow:{fontFamily:e.typography.fontFamily,fontSize:e.typography.fontSize},tableRow:{fontFamily:e.typography.fontFamily,fontSize:e.typography.fontSize},oddTableRow:{fontFamily:e.typography.fontFamily,fontSize:e.typography.fontSize},headerCell:{backgroundColor:"white",padding:"4px !important"}})),Le={none:"YYYY-MM-dd",day:"MMM dd",week:"MMM dd",month:"YYYY MMM",year:"YYYY"};const Ye={GoogleChart:function({chart:t,source:a,view:n,report:l,schema:i,dashboard:o,query:s}){const[c,d]=J.default.useState([]),u=Ue(),[m,f]=J.default.useState([]);e.useEffect(()=>{(async()=>{const e=await Ke.getDateRanges();f(e)})()},[]);const p=e.useMemo(()=>{const e="YYYY-MM-dd",t=s?.date_range?.name,a=m.find(e=>e.name===t);if(!a)return e;return Le[a?.granularity]||e},[m,s]);return J.default.useEffect(()=>{if(!(t&&n&&a&&l&&i))return;let e=[];e.push(function(e,t){const a=[...t.doc.metrics,...t.doc.dimensions];return e.columns.reduce((e,t)=>{const n=a.find(e=>e.name===t.name)||t;return e.push(n.title||n.name),e},[])}(n,i));const r=Ae(n,i);a?.forEach(t=>{const a=r(t);e.push(a)}),a?.length?d(e):d()},[t,a,n,l,i]),c?J.default.createElement("div",{style:{}},J.default.createElement(r.Chart,$e({width:t?.doc.size?.width||"100%",chartType:t?.doc.chart?.type,data:c,options:(e=>{const a=["#468682","#ff686b","#6c757d","#FFD700","#073b4c"];if("Table"===t?.doc.chart?.type)return{...t?.doc.chart?.options,cssClassNames:u};if("AreaChart"===t?.doc.chart?.type){const n=t?.doc.chart?.options?.hAxis||{},r={...{ticks:e.slice(1).map(e=>e[0]),format:p},...n};return{...t?.doc.chart?.options,hAxis:r,focusTarget:"category",colors:a}}return{...t?.doc.chart?.options,colors:a}})(c)},t?.doc.chart?.props))):J.default.createElement("div",null)},LabelChart:function({chart:e,source:t,view:a,report:n,schema:r}){const[l,i]=J.default.useState([]),[o,s]=J.default.useState(),[c,d]=J.default.useState();return J.default.useEffect(()=>{if(!(e&&a&&t&&n&&r))return;let l=[];const o=Ae(a,r);t.forEach(e=>l.push(o(e))),i(l);const c=e?.doc?.chart?.options||{},u=c?.index||0;if(l.length>0&&s(l[0][u]),c.subText?.format){ae.default.configure({autoescape:!1});const e=Ae(a,r,"object")(t[0]),n=ae.default.renderString(c.subText?.format,e);d(n)}},[e,t,a,n,r]),J.default.createElement("div",{style:{display:"flex",justifyContent:"center",alignContent:"center",height:"100%",flexDirection:"column"}},J.default.createElement(te.default,{variant:"h6"},o?.f||o),J.default.createElement(te.default,{variant:"caption"},c))}};function We(e,t){return void 0!==Ye[e]?J.default.createElement(Ye[e],t):J.default.createElement(Ie,t)}const He=J.createElement(ie.default,{fontSize:"small"}),Ge=J.createElement(oe.default,{fontSize:"small"});function Ve({items:t,selectedKeys:a,defaultSelectedKeys:n,onChange:r,inputValue:l,defaultInputValue:i,onInputChange:o,debounceMs:s=300,label:c,placeholder:d,loading:u,disabled:m,size:p="small",error:g,helperText:h,limitTags:y=3,disableClearable:E,id:v,textFieldProps:x}){const b=e.useMemo(()=>Array.isArray(t)?t:[],[t]),w=Array.isArray(a),[S,C]=e.useState(Array.isArray(n)?n:[]),k=w?a:S,D=e.useMemo(()=>{const e=new Map;for(const t of b)e.set(t&&t.key,t);return e},[b]),T=e.useMemo(()=>(Array.isArray(k)?k:[]).map(e=>D.get(e)).filter(Boolean),[k,D]),R="string"==typeof l,[B,P]=e.useState("string"==typeof i?i:""),q=R?l:B,M=function(t,a=300){const n=e.useRef(t),r=e.useRef(null);return n.current=t,e.useEffect(()=>()=>{r.current&&window.clearTimeout(r.current)},[]),J.useCallback((...e)=>{n.current&&(r.current&&window.clearTimeout(r.current),r.current=window.setTimeout(()=>{n.current&&n.current(...e)},a))},[a])}(e=>{o&&o(e)},s),z=T;return J.createElement(f.FormControl,{fullWidth:!0,error:g,disabled:m},J.createElement(f.Autocomplete,{openOnFocus:!0,forcePopupIcon:!0,id:v,multiple:!0,disableCloseOnSelect:!0,options:b,value:z,inputValue:q,getOptionLabel:e=>e&&"object"==typeof e?e.value??"":"",isOptionEqualToValue:(e,t)=>e&&t&&e.key===t.key,loading:u,limitTags:y,disableClearable:E,onChange:(e,t)=>{const a=Array.isArray(t)?t.map(e=>e&&e.key):[];w||C(a),r&&r(a,Array.isArray(t)?t:[])},onInputChange:(e,t,a)=>{R||P(t??""),"input"===a?M(t??""):"clear"===a&&M("")},renderOption:(e,t,{selected:a})=>J.createElement("li",$e({},e,{key:t&&t.key||Math.random().toString(36)}),J.createElement(f.Checkbox,{icon:He,checkedIcon:Ge,style:{marginRight:8},checked:!!a}),t&&t.value),renderTags:(e,t)=>(Array.isArray(e)?e:[]).map((e,a)=>J.createElement(f.Chip,$e({},t({index:a}),{key:e&&e.key||a,label:e&&e.value||""}))),renderInput:e=>J.createElement(f.TextField,$e({},e,{label:c,placeholder:d,InputProps:{...e.InputProps,endAdornment:J.createElement(J.Fragment,null,u?J.createElement(f.CircularProgress,{size:18}):null,e.InputProps.endAdornment)},size:p},x))}),h?J.createElement(f.FormHelperText,null,h):null)}const Ze=({filter:t,channel:a,query:n})=>{const[r,l]=e.useState([]),[i,o]=e.useState([]),[s,c]=e.useState(!1),[d,u]=e.useState("");return e.useEffect(()=>{o(n?.filter?.[t?.filter]||[])},[n]),e.useEffect(()=>{(async()=>{c(!0);const e=await async function(e,t){return t?.source?(await Ke.runReport({id:t.source})).map(e=>({key:e[t.field],value:e[t.field]})):[]}(0,t);l(e),c(!1)})()},[d]),J.default.createElement("div",{style:{display:"flex"}},J.default.createElement("div",{style:{maxWidth:640,minWidth:200}},J.default.createElement(Ve,{id:t?.title,label:t?.title,placeholder:"Type to search…",items:r,selectedKeys:i,onChange:(e,n)=>{o(e),a.emit("filterChanged",t,{[t.filter]:e})},onInputChange:e=>{u(e)},loading:s,debounceMs:300,helperText:i.length?`${i.length} selected`:""})))};function Je({items:e,value:t,label:a,onChange:n,sx:r={width:"100%"},disabled:l=!1}){const i=e.some(e=>e.key===t)?t:"";return J.default.createElement(se.default,{sx:r},J.default.createElement(ue.default,{fullWidth:!0},J.default.createElement(ce.default,{id:"demo-simple-select-label"},a),J.default.createElement(me.default,{labelId:"demo-simple-select-label",id:"demo-simple-select",value:i,label:a,onChange:n,disabled:l,MenuProps:{style:{maxHeight:"300px"}},size:"small"},e.map(e=>{const{key:t,value:a,disabled:n}=e;return J.default.createElement(de.default,{key:t,value:t,disabled:n},a)}))))}const Qe=({filter:t,channel:a,query:n})=>{const[r,l]=e.useState([]),[i,o]=e.useState("");return e.useEffect(()=>{o(n?.date_range?.name)},[n]),e.useEffect(()=>{(async()=>{const e=(await Ke.getDateRanges()).filter(e=>!(t.allowedOptions.length>0)||t.allowedOptions.some(t=>t===e.name)).map(e=>({key:e.name,value:e.title}));l(e)})()},[]),J.default.createElement("div",{style:{minWidth:"200px",maxWidth:"640px"}},J.default.createElement(Je,{items:r,value:i,label:t?.title,onChange:(e,n)=>{const r=e.target.value;o(r),a.emit("filterChanged",t,{date_range:{name:r}})}}))},Xe=({filters:e=[],channel:t,query:a})=>J.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px"}},e.map(e=>"multi-select"===e.type?J.default.createElement(Ze,{key:e.title,channel:t,filter:e,query:a}):"date-range"===e.type?J.default.createElement(Qe,{key:e.title,channel:t,filter:e,query:a}):null));var et=e=>J.default.useRef(e||new fe.default).current,tt=e=>{const t=J.default.useState({}),a=J.default.useCallback((a,n)=>{let r={...t.current,...n};for(var l in t.current=r,r)"date_range"===l||r[l].length||delete r[l];e?.emit("mergedFilterChanged",{value:r})},[e]);J.default.useEffect(()=>(e?.on("filterChanged",a),()=>{e?.off("filterChanged",a)}),[e])},at=({id:e,cache:t,dashboard:a,channel:n,...r})=>{const[l,i]=J.default.useState(),[o,s]=J.default.useState(),[c,d]=J.default.useState(),[u,f]=J.default.useState(),[p,g]=J.default.useState(We()),[h,y]=J.default.useState(),[E,v]=J.default.useState(0),[x,b]=J.default.useState(!1),[w,S]=J.default.useState(),[C,k]=J.default.useState(!1),D=J.default.useRef({value:r?.filter}),[T,R]=J.default.useState({}),{ref:B,inView:P,entry:q}=m.useInView({threshold:.1,delay:1e3}),M=et(n);tt(M);const z=J.default.useCallback(e=>{const t=e.target.value;v(t),y(l.doc.view[t])},[l]);J.default.useEffect(()=>{e&&(async()=>{const a=e,n=t?.[a]||await Ke.getChart({id:a}),l=n.doc.source?.id,o=l?t?.[l]||await Ke.getReport({id:l}):void 0,c=t?.[`schema_${l}`]||r?.schema||await Ke.getReportSchema({id:l}),u=n.doc?.view?.[0];v(0),s(o),i(n),y(u),d(c),k(!0)})().catch(e=>{console.error(e.message)})},[e]),J.default.useEffect(()=>{l&&u&&(!l?.doc?.source?.id||o)&&c&&(async()=>{g(We(l.doc.chart?.component,{view:h,source:u,chart:l,report:o,schema:c,dashboard:a,query:T}))})().catch(e=>{console.error(e.message)})},[l,u,h,o,c]);const $=e=>{const t={...o?.doc.query.filter||{},...r?.filter,...e?.value},a=t.date_range||o?.doc.query.date_range;if(delete t.date_range,k(!1),S(),b(!0),"context"===l?.doc?.source?.type)return f({filter:t}),void b(!1);const n={filter:t,date_range:a,parameters:r?.params};R(n),Ke.runReport({id:o.id,query:n}).then(e=>{f(l.doc.source.reverse?e.reverse():e)}).catch(e=>{f([])}).finally(()=>{b(!1)})},F=e=>{D.current=e,P?$(e):(S(e),k(!0))};return J.default.useEffect(()=>(M?.on("mergedFilterChanged",F),()=>{M?.off("mergedFilterChanged",F)}),[M,o,l,P]),J.default.useEffect(()=>{P&&C&&$(w)},[P,C]),J.default.useEffect(()=>{k(!0)},[r.params]),J.default.createElement(Q.default,{ref:B,elevation:0,style:{borderRadius:12,padding:20,border:"1px solid #e5e5e5",background:"#fff",display:"flex",flexDirection:"column",gap:"12px",height:"100%"}},l&&J.default.createElement("div",{style:{display:"flex",alignItems:"center",lineHeight:0}},J.default.createElement(te.default,{variant:"subtitle2",style:{fontWeight:600,color:"#252525"}},r?.title||l.doc.name," ")),x?J.default.createElement(Ie,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100%",width:"100%"}}):J.default.createElement(J.default.Fragment,null,J.default.createElement("div",{style:{display:"flex"}},J.default.createElement("div",{style:{flexGrow:1}}),J.default.createElement("div",null,l?.doc?.view?.length>1&&J.default.createElement(ne.default,null,J.default.createElement(re.default,{labelId:"date-range-select-label",id:"date-range-select",value:E,onChange:z,style:{fontSize:"12px"},disableUnderline:!0},l.doc.view.map((e,t)=>J.default.createElement(le.default,{key:t,value:t},e.title)))))),J.default.createElement("div",{style:{position:"relative",flexGrow:a?void 0:1,display:"flex",flexDirection:"column"}},J.default.createElement(Xe,{filters:l?.doc?.filters,channel:M,query:T}),p)))};const nt=e.createContext(void 0),rt=({defaultParameters:t={},defaultApi:a={},children:n})=>{const[r,l]=e.useState(t),[i,o]=e.useState(a),s={parameters:r,setParameters:l,api:i,setApi:o,setReportingContext:({parameters:e,api:t})=>{void 0!==e&&l(e),void 0!==t&&o(t)}};return J.default.createElement(nt.Provider,{value:s},n)},lt=()=>e.useContext(nt);const it=e.createContext(),ot=({children:t})=>{const[a,n]=e.useState({open:!1,message:"",severity:"info",duration:6e3}),r=(e,t="info",a=6e3)=>{n({open:!0,message:e,severity:t,duration:a})},l=(e,t)=>{"clickaway"!==t&&n(e=>({...e,open:!1}))},i={success:(e,t)=>r(e,"success",t),error:(e,t)=>r(e,"error",t),warning:(e,t)=>r(e,"warning",t),info:(e,t)=>r(e,"info",t)};return J.default.createElement(it.Provider,{value:i},t,J.default.createElement(f.Snackbar,{open:a.open,autoHideDuration:a.duration,onClose:l,anchorOrigin:{vertical:"top",horizontal:"right"}},J.default.createElement(f.Alert,{onClose:l,severity:a.severity,variant:"filled",sx:{width:"100%"}},a.message)))},st=()=>{const t=e.useContext(it);if(!t)throw new Error("useNotify must be used within a NotifyProvider");return t},ct=({open:e,title:t="Confirm Action",message:a,onConfirm:n,onCancel:r,confirmText:l="Confirm",cancelText:i="Cancel",confirmColor:o="error"})=>J.default.createElement(f.Dialog,{open:e,onClose:r,"aria-labelledby":"confirm-dialog-title","aria-describedby":"confirm-dialog-description"},J.default.createElement(f.DialogTitle,{id:"confirm-dialog-title"},t),J.default.createElement(f.DialogContent,null,J.default.createElement(f.DialogContentText,{id:"confirm-dialog-description"},a)),J.default.createElement(f.DialogActions,null,J.default.createElement(f.Button,{onClick:r,variant:"outlined"},i),J.default.createElement(f.Button,{onClick:n,variant:"contained",color:o,autoFocus:!0},l))),dt=({onSelectReport:t,onAddNew:a,onCloneReport:n,onRunReport:r,refreshTrigger:l})=>{const i=st(),[o,s]=e.useState([]),[c,d]=e.useState(!0),[u,m]=e.useState(null),[p,g]=e.useState(!1),[h,y]=e.useState(null);e.useEffect(()=>{E()},[l]);const E=async()=>{try{d(!0),m(null);const e=await Ke.getReportDefinitions();s(e)}catch(e){console.error("Error loading report definitions:",e);const t="Failed to load report definitions: "+(e.message||"Unknown error");m(t),i.error(t)}finally{d(!1)}},v=[{field:"title",headerName:"Title",flex:1,minWidth:200},{field:"provider",headerName:"Provider",flex:1,minWidth:200},{field:"actions",headerName:"Actions",width:200,sortable:!1,filterable:!1,disableColumnMenu:!0,renderCell:e=>J.default.createElement(f.Box,{sx:{display:"flex",gap:1}},J.default.createElement(f.Tooltip,{title:"Run"},J.default.createElement(f.IconButton,{size:"small",color:"success",onClick:t=>{return a=e.row.id,t.stopPropagation(),void r(a);var a}},J.default.createElement(xe.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Edit"},J.default.createElement(f.IconButton,{size:"small",color:"primary",onClick:a=>{return n=e.row.id,a.stopPropagation(),void t(n);var n}},J.default.createElement(ye.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Clone"},J.default.createElement(f.IconButton,{size:"small",onClick:t=>(async(e,t)=>{t.stopPropagation();try{const t=await Ke.getReportDefinition({id:e}),a={...t,title:`${t.title} (Copy)`};n(a)}catch(e){console.error("Error cloning report:",e),i.error("Failed to clone report: "+(e.message||"Unknown error"))}})(e.row.id,t)},J.default.createElement(Ee.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Delete"},J.default.createElement(f.IconButton,{size:"small",color:"error",onClick:t=>((e,t)=>{t.stopPropagation();const a=o.find(t=>t.id===e);y(a),g(!0)})(e.row.id,t)},J.default.createElement(ve.default,{fontSize:"small"}))))}],x=o.map(e=>({id:e.id,title:e.title,provider:e.provider}));return c?J.default.createElement(f.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},J.default.createElement(f.CircularProgress,null)):u?J.default.createElement(f.Box,{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",minHeight:400,gap:2},J.default.createElement(f.Typography,{variant:"body1",color:"error"},u),J.default.createElement(f.Button,{variant:"contained",onClick:E},"Retry")):J.default.createElement(f.Box,{sx:{p:3}},J.default.createElement(f.Box,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:3}},J.default.createElement(f.Typography,{variant:"h4",component:"h1"},"Report Definitions"),J.default.createElement(f.Button,{variant:"contained",color:"primary",startIcon:J.default.createElement(he.default,null),onClick:a},"Add New Report")),J.default.createElement(f.Box,{sx:{height:600,width:"100%"}},J.default.createElement(C.DataGrid,{rows:x,columns:v,pageSize:10,rowsPerPageOptions:[10,25,50],disableSelectionOnClick:!0,onRowClick:e=>{t(e.row.id)},sx:{"& .MuiDataGrid-row":{cursor:"pointer"},"& .MuiDataGrid-row:hover":{backgroundColor:"#f5f5f5"},"& .MuiDataGrid-columnHeader":{backgroundColor:"#f5f5f5",fontWeight:"bold"}}})),J.default.createElement(ct,{open:p,title:"Delete Report Definition",message:h?`Are you sure you want to delete "${h.title}"? This action cannot be undone.`:"",onConfirm:async()=>{if(h)try{await Ke.deleteReportDefinition({id:h.id}),i.success(`Report "${h.title}" deleted successfully!`),g(!1),y(null),E()}catch(e){console.error("Error deleting report:",e),i.error("Failed to delete report: "+(e.response?.data?.message||e.message||"Unknown error")),g(!1),y(null)}},onCancel:()=>{g(!1),y(null)},confirmText:"Delete",cancelText:"Cancel",confirmColor:"error"}))},ut=({providersData:t,rootProvider:a,onSelectionChange:n,existingDimensions:r=[],existingMetrics:l=[],existingFilters:i={}})=>{const[o,s]=e.useState([]);e.useEffect(()=>{s([]),n&&n([])},[a]);const c=e=>{if(!t||!e)return[];const a=t[e];if(!a||!a.relations||0===a.relations.length)return[];const n=(()=>{const e=new Map,t=t=>{if(t.relations&&t.providerPath)for(let a=0;a<t.relations.length;a++){const n=t.relations[a],r=t.providerPath[a];n.type&&(e.has(r)||e.set(r,new Set),e.get(r).add(n.name))}};return r.forEach(t),l.forEach(t),Object.values(i).forEach(t),e})().get(e);return a.relations.filter(e=>t[e.target]).map(e=>{let t=!1,a=null;if(!!e.type&&n&&n.size>0){if(!n.has(e.name)&&n.size>0){t=!0;a=`Cannot select: '${Array.from(n)[0]}' is already in use`}}return{key:e.name,value:e.name,targetKey:e.target,disabled:t,disabledReason:a}})},d=(e,t)=>{const r=t.target.value,l=0===e?a:o[e-1].targetKey,i=c(l).find(e=>e.key===r);if(!i)return;const d=o.slice(0,e);d.push({providerKey:r,relationName:r,targetKey:i.targetKey}),s(d),console.log("Selection chain:",d),n&&n(d)};return J.default.createElement(f.Box,null,o.length>0&&J.default.createElement(f.Box,{sx:{marginBottom:2}},J.default.createElement(f.Typography,{variant:"subtitle2",sx:{marginBottom:1,color:"text.secondary"}},"Selected Path:"),J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:1,flexWrap:"wrap"}},J.default.createElement(f.Chip,{label:a,size:"small",color:"primary",variant:"outlined"}),o.map((e,t)=>J.default.createElement(J.default.Fragment,{key:t},J.default.createElement(f.Typography,{variant:"body2",sx:{color:"text.secondary"}},"→"),J.default.createElement(f.Chip,{label:e.targetKey,size:"small",color:"primary",onDelete:()=>(e=>{const t=o.slice(0,e);s(t),n&&n(t)})(t),sx:{fontWeight:500}}))))),J.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",alignItems:"flex-start",gap:"8px"}},(()=>{if(!t||!a)return null;const e=[],n=c(a);n.length>0&&e.push(J.default.createElement("div",{key:"level-0",style:{marginRight:"16px"}},J.default.createElement(Je,{items:n,value:o[0]?.providerKey||"",label:`Related to ${a}`,onChange:e=>d(0,e),sx:{width:"300px"}})));for(let t=0;t<o.length;t++){const a=o[t],n=c(a.targetKey);if(n.length>0){const r=o[t+1];e.push(J.default.createElement("div",{key:`level-${t+1}`,style:{marginRight:"16px"}},J.default.createElement(Je,{items:n,value:r?.providerKey||"",label:`Related to ${a.targetKey}`,onChange:e=>d(t+1,e),sx:{width:"300px"}})))}}return e})()))},mt=({id:t,label:a,fullLabel:n,onDelete:r,onMoveUp:l,onMoveDown:i,isFirst:o,isLast:s,sortOrder:c,onSortOrderChange:d,fullPath:u,defaultTitle:m,customTitle:p,onUpdateTitle:g,onResetTitle:h})=>{const[y,E]=e.useState(!1),[v,x]=e.useState(""),b=e.useRef(null),w=e.useRef(null),{attributes:S,listeners:C,setNodeRef:k,transform:D,transition:T,isDragging:R}=$.useSortable({id:t}),B={transform:F.CSS.Transform.toString(D),transition:T,opacity:R?.5:1,display:"flex",alignItems:"center",width:"100%"};e.useEffect(()=>{y&&b.current&&(b.current.focus(),b.current.select())},[y]),e.useEffect(()=>{const e=e=>{y&&w.current&&!w.current.contains(e.target)&&q()};if(y)return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[y]);const P=()=>{const e=v.trim();""!==e?(g(u,e),E(!1)):q()},q=()=>{E(!1),x("")},M=p||a,z=!!p;return J.default.createElement("div",$e({ref:k,style:B},S),J.default.createElement(f.Box,{ref:w,sx:{display:"flex",alignItems:"center",width:"100%",gap:1}},J.default.createElement(f.Box,$e({},C,{sx:{display:"flex",alignItems:"center",cursor:"grab","&:active":{cursor:"grabbing"}}}),J.default.createElement(Ce.default,{sx:{cursor:"grab"}})),y?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.TextField,{inputRef:b,value:v,onChange:e=>x(e.target.value),onKeyDown:e=>{"Enter"===e.key?P():"Escape"===e.key&&q()},size:"small",sx:{width:"200px"}}),J.default.createElement(f.Tooltip,{title:"Save",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:P,color:"primary","aria-label":"save title"},J.default.createElement(Re.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Cancel",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:q,"aria-label":"cancel edit"},J.default.createElement(Be.default,{fontSize:"small"}))),z&&J.default.createElement(f.Tooltip,{title:"Reset to default",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:()=>{h(u),E(!1),x("")},color:"warning","aria-label":"reset title"},J.default.createElement(Pe.default,{fontSize:"small"})))):J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Tooltip,{title:n,arrow:!0,placement:"top"},J.default.createElement(f.Chip,{label:M,onDelete:r,color:"primary",variant:"outlined",sx:{fontWeight:z?"bold":"normal",fontStyle:z?"italic":"normal"}})),J.default.createElement(f.Tooltip,{title:"Edit title",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:()=>{x(p||m),E(!0)},"aria-label":"edit title"},J.default.createElement(ye.default,{fontSize:"small"})))),!y&&J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Tooltip,{title:null===c?"No sort":"asc"===c?"Ascending":"Descending",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:()=>{d(null===c?"asc":"asc"===c?"desc":null)},"aria-label":"toggle sort order",color:c?"primary":"default"},"asc"===c?J.default.createElement(ke.default,{fontSize:"small"}):"desc"===c?J.default.createElement(De.default,{fontSize:"small"}):J.default.createElement(Te.default,{fontSize:"small",sx:{opacity:.3}}))),J.default.createElement(f.Box,{sx:{flex:1}}),J.default.createElement(f.Box,{sx:{display:"flex",gap:.5}},J.default.createElement(f.IconButton,{size:"small",onClick:l,disabled:o,"aria-label":"move up"},J.default.createElement(ke.default,{fontSize:"small"})),J.default.createElement(f.IconButton,{size:"small",onClick:i,disabled:s,"aria-label":"move down"},J.default.createElement(De.default,{fontSize:"small"}))))))},ft=({providersData:t,rootProvider:a,savedDimensions:n=[],onSaveDimension:r,onRemoveDimension:l,onReorderDimensions:i,titleOverrides:o={},onUpdateTitle:s,onResetTitle:c,existingMetrics:d=[],existingFilters:u={}})=>{const[m,p]=e.useState(!1),[g,h]=e.useState([]),[y,E]=e.useState(""),v=z.useSensors(z.useSensor(z.PointerSensor),z.useSensor(z.KeyboardSensor,{coordinateGetter:$.sortableKeyboardCoordinates})),x=()=>{const e=a?0===g.length?a:g[g.length-1].targetKey:null;if(!e||!t||!t[e])return[];const r=t[e];if(!r.dimensions)return[];const l=[t[a].default_alias];let i=a;g.forEach(e=>{const a=t[i];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&l.push(t.alias)}i=e.targetKey});const o=new Set(n.map(e=>e.fullPath)),s=[];return Object.keys(r.dimensions).forEach(t=>{const a=r.dimensions[t];Object.keys(a).forEach(n=>{const r=a[n],i=`${l.join("_")}.${n}`,c=o.has(i);s.push({key:`${e}_${t}.${n}`,value:r.title||n,dimensionKey:n,alias:t,dimension:r,disabled:c})})}),s},b=()=>{p(!1),h([]),E("")},w=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")};return J.default.createElement("div",null,J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:2,marginBottom:2}},m?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Button,{variant:"outlined",onClick:b},"Cancel"),J.default.createElement(f.Button,{variant:"contained",onClick:()=>{if(!y)return;const e=x().find(e=>e.key===y);if(!e)return;const n=[],l=[a],i=[];let o=a;g.forEach(e=>{const a=t[o];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&(n.push(t),i.push(t.name))}l.push(e.targetKey),o=e.targetKey});const s=[t[a].default_alias];n.forEach(e=>{s.push(e.alias)});const c=`${s.join("_")}.${e.dimensionKey}`,d={dimension:e.dimension,relations:n,providerPath:l,relationNames:i,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:c};r(d),b()},disabled:!y},"Save Dimension")):J.default.createElement(f.Button,{variant:"contained",onClick:()=>{p(!0),h([]),E("")}},"Add Dimension")),m&&J.default.createElement(f.Paper,{sx:{padding:3,marginBottom:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Select Provider Path"),J.default.createElement(ut,{providersData:t,rootProvider:a,onSelectionChange:h,existingDimensions:n,existingMetrics:d,existingFilters:u}),J.default.createElement(f.Typography,{variant:"h6",sx:{marginTop:3,marginBottom:2}},"Select Dimension"),J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:1}},J.default.createElement(Je,{items:x(),value:y,label:"Choose Dimension",onChange:e=>{E(e.target.value)},sx:{width:"400px"}}),J.default.createElement(f.Tooltip,{title:"Add all available dimensions",arrow:!0,placement:"top"},J.default.createElement("span",null,J.default.createElement(f.IconButton,{color:"primary",onClick:()=>{const e=x().filter(e=>!e.disabled);if(0===e.length)return;const n=[],l=[a],i=[];let o=a;g.forEach(e=>{const a=t[o];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&(n.push(t),i.push(t.name))}l.push(e.targetKey),o=e.targetKey});const s=[t[a].default_alias];n.forEach(e=>{s.push(e.alias)}),e.forEach(e=>{const t=`${s.join("_")}.${e.dimensionKey}`,a={dimension:e.dimension,relations:n,providerPath:l,relationNames:i,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:t};r(a)}),b()},disabled:0===x().filter(e=>!e.disabled).length,"aria-label":"add all dimensions"},J.default.createElement(qe.default,null)))))),n.length>0&&J.default.createElement(f.Box,{sx:{marginTop:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Saved Dimensions (Drag to reorder or use arrows)"),J.default.createElement(z.DndContext,{sensors:v,collisionDetection:z.closestCenter,onDragEnd:e=>{const{active:t,over:a}=e;if(a&&t.id!==a.id){const e=n.findIndex((e,a)=>a===t.id),r=n.findIndex((e,t)=>t===a.id),l=$.arrayMove(n,e,r);i(l)}}},J.default.createElement($.SortableContext,{items:n.map((e,t)=>t),strategy:$.verticalListSortingStrategy},J.default.createElement(f.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},n.map((e,t)=>J.default.createElement(mt,{key:t,id:t,label:e.dimensionTitle,fullLabel:`${w(e)} → ${e.dimensionTitle} (${e.fullPath})`,onDelete:()=>l(t),onMoveUp:()=>(e=>{if(e>0){const t=$.arrayMove(n,e,e-1);i(t)}})(t),onMoveDown:()=>(e=>{if(e<n.length-1){const t=$.arrayMove(n,e,e+1);i(t)}})(t),isFirst:0===t,isLast:t===n.length-1,sortOrder:e.sortOrder||null,onSortOrderChange:e=>((e,t)=>{const a=[...n];a[e]={...a[e],sortOrder:t},i(a)})(t,e),fullPath:e.fullPath,defaultTitle:e.dimensionTitle,customTitle:o[e.fullPath],onUpdateTitle:s,onResetTitle:c})))))))},pt=({id:t,label:a,fullLabel:n,onDelete:r,onMoveUp:l,onMoveDown:i,isFirst:o,isLast:s,fullPath:c,defaultTitle:d,customTitle:u,onUpdateTitle:m,onResetTitle:p})=>{const[g,h]=e.useState(!1),[y,E]=e.useState(""),v=e.useRef(null),x=e.useRef(null),{attributes:b,listeners:w,setNodeRef:S,transform:C,transition:k,isDragging:D}=$.useSortable({id:t}),T={transform:F.CSS.Transform.toString(C),transition:k,opacity:D?.5:1,display:"flex",alignItems:"center",width:"100%"};e.useEffect(()=>{g&&v.current&&(v.current.focus(),v.current.select())},[g]),e.useEffect(()=>{const e=e=>{g&&x.current&&!x.current.contains(e.target)&&B()};if(g)return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[g]);const R=()=>{const e=y.trim();""!==e?(m(c,e),h(!1)):B()},B=()=>{h(!1),E("")},P=u||a,q=!!u;return J.default.createElement("div",$e({ref:S,style:T},b),J.default.createElement(f.Box,{ref:x,sx:{display:"flex",alignItems:"center",width:"100%",gap:1}},J.default.createElement(f.Box,$e({},w,{sx:{display:"flex",alignItems:"center",cursor:"grab","&:active":{cursor:"grabbing"}}}),J.default.createElement(Ce.default,{sx:{cursor:"grab"}})),g?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.TextField,{inputRef:v,value:y,onChange:e=>E(e.target.value),onKeyDown:e=>{"Enter"===e.key?R():"Escape"===e.key&&B()},size:"small",sx:{width:"200px"}}),J.default.createElement(f.Tooltip,{title:"Save",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:R,color:"primary","aria-label":"save title"},J.default.createElement(Re.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Cancel",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:B,"aria-label":"cancel edit"},J.default.createElement(Be.default,{fontSize:"small"}))),q&&J.default.createElement(f.Tooltip,{title:"Reset to default",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:()=>{p(c),h(!1),E("")},color:"warning","aria-label":"reset title"},J.default.createElement(Pe.default,{fontSize:"small"})))):J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Tooltip,{title:n,arrow:!0,placement:"top"},J.default.createElement(f.Chip,{label:P,onDelete:r,color:"secondary",variant:"outlined",sx:{fontWeight:q?"bold":"normal",fontStyle:q?"italic":"normal"}})),J.default.createElement(f.Tooltip,{title:"Edit title",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:()=>{E(u||d),h(!0)},"aria-label":"edit title"},J.default.createElement(ye.default,{fontSize:"small"})))),!g&&J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Box,{sx:{flex:1}}),J.default.createElement(f.Box,{sx:{display:"flex",gap:.5}},J.default.createElement(f.IconButton,{size:"small",onClick:l,disabled:o,"aria-label":"move up"},J.default.createElement(ke.default,{fontSize:"small"})),J.default.createElement(f.IconButton,{size:"small",onClick:i,disabled:s,"aria-label":"move down"},J.default.createElement(De.default,{fontSize:"small"}))))))},gt=({providersData:t,rootProvider:a,savedMetrics:n=[],onSaveMetric:r,onRemoveMetric:l,onReorderMetrics:i,titleOverrides:o={},onUpdateTitle:s,onResetTitle:c,existingDimensions:d=[],existingFilters:u={}})=>{const[m,p]=e.useState(!1),[g,h]=e.useState([]),[y,E]=e.useState(""),v=z.useSensors(z.useSensor(z.PointerSensor),z.useSensor(z.KeyboardSensor,{coordinateGetter:$.sortableKeyboardCoordinates})),x=()=>{const e=a?0===g.length?a:g[g.length-1].targetKey:null;if(!e||!t||!t[e])return[];const r=t[e];if(!r.metrics)return[];const l=[t[a].default_alias];let i=a;g.forEach(e=>{const a=t[i];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&l.push(t.alias)}i=e.targetKey});const o=new Set(n.map(e=>e.fullPath)),s=r.metrics.map((t,a)=>{const n=`${l.join("_")}.${t.name}`,r=o.has(n);return{key:`${e}_${t.name}_${a}`,value:t.title||t.name,metricName:t.name,metric:t,disabled:r}});return s},b=()=>{p(!1),h([]),E("")},w=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")};return J.default.createElement("div",null,J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:2,marginBottom:2}},m?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Button,{variant:"outlined",onClick:b},"Cancel"),J.default.createElement(f.Button,{variant:"contained",onClick:()=>{if(!y)return;const e=x().find(e=>e.key===y);if(!e)return;const n=[],l=[a],i=[];let o=a;g.forEach(e=>{const a=t[o];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&(n.push(t),i.push(t.name))}l.push(e.targetKey),o=e.targetKey});const s=[t[a].default_alias];n.forEach(e=>{s.push(e.alias)});const c=`${s.join("_")}.${e.metricName}`,d={metric:e.metric,relations:n,providerPath:l,relationNames:i,metricName:e.metricName,metricTitle:e.value,fullPath:c};r(d),b()},disabled:!y},"Save Metric")):J.default.createElement(f.Button,{variant:"contained",onClick:()=>{p(!0),h([]),E("")}},"Add Metric")),m&&J.default.createElement(f.Paper,{sx:{padding:3,marginBottom:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Select Provider Path"),J.default.createElement(ut,{providersData:t,rootProvider:a,onSelectionChange:h,existingDimensions:d,existingMetrics:n,existingFilters:u}),J.default.createElement(f.Typography,{variant:"h6",sx:{marginTop:3,marginBottom:2}},"Select Metric"),J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:1}},J.default.createElement(Je,{items:x(),value:y,label:"Choose Metric",onChange:e=>{E(e.target.value)},sx:{width:"400px"}}),J.default.createElement(f.Tooltip,{title:"Add all available metrics",arrow:!0,placement:"top"},J.default.createElement("span",null,J.default.createElement(f.IconButton,{color:"primary",onClick:()=>{const e=x().filter(e=>!e.disabled);if(0===e.length)return;const n=[],l=[a],i=[];let o=a;g.forEach(e=>{const a=t[o];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&(n.push(t),i.push(t.name))}l.push(e.targetKey),o=e.targetKey});const s=[t[a].default_alias];n.forEach(e=>{s.push(e.alias)}),e.forEach(e=>{const t=`${s.join("_")}.${e.metricName}`,a={metric:e.metric,relations:n,providerPath:l,relationNames:i,metricName:e.metricName,metricTitle:e.value,fullPath:t};r(a)}),b()},disabled:0===x().filter(e=>!e.disabled).length,"aria-label":"add all metrics"},J.default.createElement(qe.default,null)))))),n.length>0&&J.default.createElement(f.Box,{sx:{marginTop:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Saved Metrics (Drag to reorder or use arrows)"),J.default.createElement(z.DndContext,{sensors:v,collisionDetection:z.closestCenter,onDragEnd:e=>{const{active:t,over:a}=e;if(a&&t.id!==a.id){const e=n.findIndex((e,a)=>a===t.id),r=n.findIndex((e,t)=>t===a.id),l=$.arrayMove(n,e,r);i(l)}}},J.default.createElement($.SortableContext,{items:n.map((e,t)=>t),strategy:$.verticalListSortingStrategy},J.default.createElement(f.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},n.map((e,t)=>J.default.createElement(pt,{key:t,id:t,label:e.metricTitle,fullLabel:`${w(e)} → ${e.metricTitle} (${e.fullPath})`,onDelete:()=>l(t),onMoveUp:()=>(e=>{if(e>0){const t=$.arrayMove(n,e,e-1);i(t)}})(t),onMoveDown:()=>(e=>{if(e<n.length-1){const t=$.arrayMove(n,e,e+1);i(t)}})(t),isFirst:0===t,isLast:t===n.length-1,fullPath:e.fullPath,defaultTitle:e.metricTitle,customTitle:o[e.fullPath],onUpdateTitle:s,onResetTitle:c})))))))},ht=({providersData:t,rootProvider:a,savedFilters:n={},onSaveFilter:r,onRemoveFilter:l,existingDimensions:i=[],existingMetrics:o=[],titleOverrides:s={},onUpdateTitle:c,onResetTitle:d})=>{const u=lt(),[m,p]=e.useState(!1),[g,h]=e.useState([]),[y,E]=e.useState(""),[v,x]=e.useState([]),[b,w]=e.useState([]),[S,C]=e.useState(!1),[k,D]=e.useState(null),[T,R]=e.useState(null),[B,P]=e.useState(null),[q,M]=e.useState(null),[z,$]=e.useState("");e.useEffect(()=>{E(""),x([]),w([]),R(null),P(null)},[g]);const F=e=>e&&("date"===e.type||"timestamp"===e.type),I=()=>{const e=a?0===g.length?a:g[g.length-1].targetKey:null;if(!e||!t||!t[e])return[];const n=t[e];if(!n.dimensions)return[];const r=[];return Object.keys(n.dimensions).forEach(t=>{const a=n.dimensions[t];Object.keys(a).forEach(n=>{const l=a[n];(e=>!!e.column&&/^[a-zA-Z0-9_.]+$/.test(e.column))(l)&&r.push({key:`${e}_${t}.${n}`,value:l.title||n,dimensionKey:n,alias:t,dimension:l})})}),r},A=()=>{p(!1),h([]),E(""),x([]),w([]),R(null),P(null),D(null)},O=()=>{D(null),x([]),w([]),R(null),P(null)},j=e=>{const t=z.trim();""!==t?(c(e,t),M(null),$("")):_()},_=()=>{M(null),$("")},N=async e=>{C(!0);try{const t={provider:a,doc:{query:{dimensions:[e],metrics:[],order_by:[{name:e}]}},parameters:u?.parameters||{base_currency:"EUR"}};console.log("Fetching filter values with payload:",t);const n=await Ke.runAdHocReport({report:t});console.log("Filter values results:",n);const r=(Array.isArray(n)?n:n.data||[]).map(t=>{let a=t[e];if(void 0===a){a=t[e.replace(/\./g,"_")]}if(void 0===a){const e=Object.keys(t);e.length>0&&(a=t[e[0]])}return{key:String(a),value:String(a)}});console.log("Transformed distinct values:",r),x(r)}catch(e){console.error("Error fetching filter values:",e),x([])}finally{C(!1)}},K=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")},U=Object.entries(n);return J.default.createElement("div",null,J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:2,marginBottom:2}},m?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Button,{variant:"outlined",onClick:A},"Cancel"),J.default.createElement(f.Button,{variant:"contained",onClick:()=>{const e=I().find(e=>e.key===y);if(!e)return;const n=F(e.dimension);if(n){if(!T&&!B)return}else if(0===b.length)return;if(!y)return;const l=[],i=[a],o=[];let s=a;g.forEach(e=>{const a=t[s];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&(l.push(t),o.push(t.name))}i.push(e.targetKey),s=e.targetKey});const c=[t[a].default_alias];l.forEach(e=>{c.push(e.alias)});const d=`${c.join("_")}.${e.dimensionKey}`;let u;n?(u={},T&&(u.gte=T.format("YYYY-MM-DD")),B&&(u.lte=B.format("YYYY-MM-DD"))):u=b;const m={dimension:e.dimension,relations:l,providerPath:i,relationNames:o,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:d,values:u};r(d,m),A()},disabled:(()=>{if(!y)return!0;const e=I().find(e=>e.key===y);if(!e)return!0;return F(e.dimension)?!T&&!B:0===b.length})()},"Save Filter")):J.default.createElement(f.Button,{variant:"contained",onClick:()=>{p(!0),h([]),E(""),x([]),w([]),R(null),P(null),D(null)}},"Add Filter")),m&&J.default.createElement(f.Paper,{sx:{padding:3,marginBottom:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Select Provider Path"),J.default.createElement(ut,{providersData:t,rootProvider:a,onSelectionChange:h,existingDimensions:i,existingMetrics:o,existingFilters:n}),J.default.createElement(f.Typography,{variant:"h6",sx:{marginTop:3,marginBottom:2}},"Select Dimension for Filter"),J.default.createElement(Je,{items:I(),value:y,label:"Choose Dimension",onChange:e=>{const n=e.target.value;if(E(n),w([]),R(null),P(null),n){const e=I().find(e=>e.key===n);if(e){if(!F(e.dimension)){const n=[];let r=a;g.forEach(e=>{const a=t[r];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&n.push(t)}r=e.targetKey});const l=[t[a].default_alias];n.forEach(e=>{l.push(e.alias)});const i=`${l.join("_")}.${e.dimensionKey}`;N(i)}}}else x([])},sx:{width:"400px"}}),y&&(()=>{const e=I().find(e=>e.key===y),t=e&&F(e.dimension);return J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Typography,{variant:"h6",sx:{marginTop:3,marginBottom:2}},t?"Select Date Range":"Select Filter Values"),t?J.default.createElement(Y.LocalizationProvider,{dateAdapter:H.AdapterDayjs},J.default.createElement(f.Box,{sx:{display:"flex",gap:2,width:"400px"}},J.default.createElement(W.DatePicker,{label:"From Date",value:T,onChange:e=>R(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}),J.default.createElement(W.DatePicker,{label:"To Date",value:B,onChange:e=>P(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}))):J.default.createElement(f.Box,{sx:{width:"400px"}},J.default.createElement(Ve,{items:v,selectedKeys:b,onChange:e=>w(e),label:"Choose Values",placeholder:"Select one or more values...",loading:S,helperText:b.length>0?`${b.length} value(s) selected`:"Select at least one value"})))})()),U.length>0&&J.default.createElement(f.Box,{sx:{marginTop:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Saved Filters"),J.default.createElement(f.Box,{sx:{display:"flex",flexDirection:"column",gap:2}},U.map(([e,t])=>{const a=F(t.dimension),i=k===e,o=q===e;let c,u,m;a&&t.values&&"object"==typeof t.values&&!Array.isArray(t.values)?(u=t.values.gte&&t.values.lte?`${t.values.gte} to ${t.values.lte}`:t.values.gte?`From ${t.values.gte}`:t.values.lte?`Until ${t.values.lte}`:"No dates",m="📅"):(c=t.values?.length||0,u=t.values?.join(", ")||"No values",m=c);const g=s[e]||t.dimensionTitle,h=!!s[e];return J.default.createElement(f.Box,{key:e},J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:1,marginBottom:i?2:0}},o?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.TextField,{value:z,onChange:e=>$(e.target.value),onKeyDown:t=>((e,t)=>{"Enter"===e.key?j(t):"Escape"===e.key&&_()})(t,e),size:"small",autoFocus:!0,placeholder:"Enter custom title",sx:{width:"300px"}}),J.default.createElement(f.Tooltip,{title:"Save",arrow:!0},J.default.createElement(f.IconButton,{size:"small",onClick:()=>j(e),color:"primary"},J.default.createElement(Re.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Cancel",arrow:!0},J.default.createElement(f.IconButton,{size:"small",onClick:_,color:"default"},J.default.createElement(Be.default,{fontSize:"small"}))),h&&J.default.createElement(f.Tooltip,{title:"Reset to default",arrow:!0},J.default.createElement(f.IconButton,{size:"small",onClick:()=>(e=>{d(e),M(null),$("")})(e),color:"warning"},J.default.createElement(Pe.default,{fontSize:"small"})))):J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Tooltip,{title:J.default.createElement("div",null,J.default.createElement("div",null,J.default.createElement("strong",null,"Path:")," ",K(t)," → ",t.dimensionTitle),J.default.createElement("div",null,J.default.createElement("strong",null,"Full Path:")," ",e),J.default.createElement("div",null,J.default.createElement("strong",null,a?"Date Range":`Values (${c})`,":")," ",u)),arrow:!0,placement:"top"},J.default.createElement(f.Badge,{badgeContent:m,color:"secondary"},J.default.createElement(f.Chip,{label:g,onDelete:()=>l(e),color:"secondary",variant:"outlined",sx:{fontWeight:h?"bold":"normal",fontStyle:h?"italic":"normal"}}))),J.default.createElement(f.Tooltip,{title:"Rename filter",arrow:!0},J.default.createElement(f.IconButton,{size:"small",onClick:()=>((e,t)=>{M(e),$(s[e]||t||"")})(e,t.dimensionTitle),color:"primary",disabled:i},J.default.createElement(ye.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Edit filter values",arrow:!0},J.default.createElement(f.IconButton,{size:"small",onClick:()=>(async(e,t)=>{p(!1),D(e),F(t.dimension)?t.values&&"object"==typeof t.values&&!Array.isArray(t.values)&&(R(t.values.gte?ze.default(t.values.gte):null),P(t.values.lte?ze.default(t.values.lte):null)):(w(t.values||[]),await N(e))})(e,t),color:"primary",disabled:i},J.default.createElement(Me.default,{fontSize:"small"}))))),i&&J.default.createElement(f.Paper,{sx:{padding:2,marginLeft:2}},J.default.createElement(f.Typography,{variant:"subtitle2",sx:{marginBottom:1}},"Edit Filter ",a?"Date Range":"Values"," for: ",t.dimensionTitle),a?J.default.createElement(Y.LocalizationProvider,{dateAdapter:H.AdapterDayjs},J.default.createElement(f.Box,{sx:{display:"flex",gap:2,width:"400px",marginBottom:2}},J.default.createElement(W.DatePicker,{label:"From Date",value:T,onChange:e=>R(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}),J.default.createElement(W.DatePicker,{label:"To Date",value:B,onChange:e=>P(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}))):J.default.createElement(f.Box,{sx:{width:"400px",marginBottom:2}},J.default.createElement(Ve,{items:v,selectedKeys:b,onChange:e=>w(e),label:"Choose Values",placeholder:"Select one or more values...",loading:S,helperText:b.length>0?`${b.length} value(s) selected`:"Select at least one value"})),J.default.createElement(f.Box,{sx:{display:"flex",gap:1}},J.default.createElement(f.Button,{variant:"outlined",size:"small",onClick:O},"Cancel"),J.default.createElement(f.Button,{variant:"contained",size:"small",onClick:()=>(e=>{const t=n[e];if(F(t.dimension)){if(!T&&!B)return;const a={};T&&(a.gte=T.format("YYYY-MM-DD")),B&&(a.lte=B.format("YYYY-MM-DD"));const n={...t,values:a};r(e,n)}else{if(0===b.length)return;const a={...t,values:b};r(e,a)}D(null),x([]),w([]),R(null),P(null)})(e),disabled:a?!T&&!B:0===b.length},"Save Changes"))))}))))},yt=({reportData:t,dimensions:a,metrics:n,loading:r,onPageChange:l,totalRows:i=0,titleOverrides:o={dimensions:{},metrics:{}}})=>{const[s,c]=e.useState({page:0,pageSize:50}),d=J.default.useMemo(()=>{const e=[];return a.forEach(t=>{let a,n;if(t.relations&&t.relations.length>0){const e=t.fullPath.split("."),n=e[0],r=e[1],l=n.split("_");l.shift();const i=l.join("_");a=i?`${i}_${r}`:r}else a=t.fullPath.replace(".","_");n=o.dimensions[t.fullPath]||t.dimensionTitle||a,e.push({field:a,headerName:n,flex:1,minWidth:150})}),n.forEach(t=>{const a=t.metric;let n,r;if(t.relations&&t.relations.length>0){const e=t.fullPath.split("."),a=e[0],r=e[1],l=a.split("_");l.shift();const i=l.join("_");n=i?`${i}_${r}`:r}else n=t.metricName;r=o.metrics[t.fullPath]||t.metricTitle||n,e.push({field:n,headerName:r,flex:1,minWidth:150,type:"integer"===a?.type||"currency"===a?.type?"number":"string",valueFormatter:e=>{if(null==e)return"";if(a?.format){const t=X.default(e).format(a.format);return a?.prefix?`${a.prefix} ${t}`:t}return e}})}),e},[a,n,o]),u=J.default.useMemo(()=>t&&Array.isArray(t)?t.map((e,t)=>({id:t,...e})):[],[t]);return r?J.default.createElement(f.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},J.default.createElement(f.CircularProgress,null)):t&&0!==t.length?J.default.createElement(f.Box,{sx:{height:600,width:"100%"}},J.default.createElement(C.DataGrid,{rows:u,columns:d,paginationModel:s,onPaginationModelChange:e=>{c(e),l&&e.page!==s.page&&l(e.page,e.pageSize)},pageSizeOptions:[10,25,50,100],paginationMode:"server",rowCount:i||u.length,loading:r,disableRowSelectionOnClick:!0,sx:{"& .MuiDataGrid-cell":{padding:"8px"},"& .MuiDataGrid-columnHeader":{backgroundColor:"#f5f5f5",fontWeight:"bold"}}})):J.default.createElement(f.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},J.default.createElement(f.Typography,{variant:"body1",color:"textSecondary"},"No data available. Run a report to see results."))};function Et({children:e,value:t,index:a}){return J.default.createElement("div",{role:"tabpanel",hidden:t!==a,id:`report-tabpanel-${a}`,"aria-labelledby":`report-tab-${a}`},t===a&&J.default.createElement(f.Box,{sx:{py:3}},e))}const vt=({reportDefinitionId:t,cloneData:a,autoRun:n,onBackToList:r})=>{const l=st(),i=lt(),[o,s]=e.useState(null),[c,d]=e.useState(""),[u,m]=e.useState(""),[p,g]=e.useState({dimensions:[],metrics:[],filters:{}}),[h,y]=e.useState({dimensions:{},metrics:{},filters:{}}),[E,v]=e.useState(null),[x,b]=e.useState(!1),[w,S]=e.useState(0),[C,k]=e.useState(0),[D,T]=e.useState(50),[R,B]=e.useState(0),[P,q]=e.useState(!1),[M,z]=e.useState(!1);e.useEffect(()=>{(async()=>{const e=await Ke.getProviders();console.log({providers:e}),s(e)})()},[]),e.useEffect(()=>{t&&o&&I(t)},[t,o]),e.useEffect(()=>{a&&o&&A(a)},[a,o]),e.useEffect(()=>{n&&M&&c&&p.dimensions.length>0&&_()},[n,M]);const $=(e,t,a)=>{try{const[n,r]=e.split("."),l=n.split("_");let i=a;const o=[],s=[a],c=[];for(let e=1;e<l.length;e++){const a=l[e],n=t[i];if(!n||!n.relations)return console.warn(`Provider ${i} not found or has no relations`),null;const r=n.relations.find(e=>e.alias===a);if(!r)return console.warn(`Relation with alias ${a} not found in provider ${i}`),null;o.push(r),c.push(r.name),i=r.target,s.push(i)}const d=t[i];if(!d)return console.warn(`Final provider ${i} not found`),null;const u=d.default_alias;if(!d.dimensions||!d.dimensions[u])return console.warn(`Dimensions not found for alias ${u} in provider ${i}`),null;const m=d.dimensions[u][r];return m?{dimension:m,relations:o,providerPath:s,relationNames:c,dimensionKey:r,dimensionTitle:m.title||r,fullPath:e}:(console.warn(`Dimension ${r} not found in provider ${i}, alias ${u}`),null)}catch(t){return console.warn(`Error reconstructing dimension from path ${e}:`,t),null}},F=(e,t,a)=>{try{const[n,r]=e.split("."),l=n.split("_");let i=a;const o=[],s=[a],c=[];for(let e=1;e<l.length;e++){const a=l[e],n=t[i];if(!n||!n.relations)return console.warn(`Provider ${i} not found or has no relations`),null;const r=n.relations.find(e=>e.alias===a);if(!r)return console.warn(`Relation with alias ${a} not found in provider ${i}`),null;o.push(r),c.push(r.name),i=r.target,s.push(i)}const d=t[i];if(!d)return console.warn(`Final provider ${i} not found`),null;if(!d.metrics)return console.warn(`Metrics not found in provider ${i}`),null;const u=d.metrics.find(e=>e.name===r);return u?{metric:u,relations:o,providerPath:s,relationNames:c,metricName:r,metricTitle:u.title||r,fullPath:e}:(console.warn(`Metric ${r} not found in provider ${i}`),null)}catch(t){return console.warn(`Error reconstructing metric from path ${e}:`,t),null}},I=async e=>{try{console.log("Loading report definition:",e);const t=await Ke.getReportDefinition({id:e});console.log("Loaded report definition:",t),d(t.provider),m(t.title||"");const a=[],n={};if(t.definition?.doc?.query?.order_by)for(const e of t.definition.doc.query.order_by)!0===e.desc?n[e.name]="desc":n[e.name]="asc";if(t.definition?.doc?.query?.dimensions)for(const e of t.definition.doc.query.dimensions){const r=$(e,o,t.provider);r&&(r.sortOrder=n[e]||null,a.push(r))}const r=[];if(t.definition?.doc?.query?.metrics)for(const e of t.definition.doc.query.metrics){const a=F(e,o,t.provider);a&&r.push(a)}const l={dimensions:{},metrics:{},filters:{}};t.definition?.doc?.query?.titles&&(t.definition.doc.query.titles.dimensions&&(l.dimensions=t.definition.doc.query.titles.dimensions),t.definition.doc.query.titles.metrics&&(l.metrics=t.definition.doc.query.titles.metrics),t.definition.doc.query.titles.filters&&(l.filters=t.definition.doc.query.titles.filters));const i={};if(t.definition?.doc?.query?.filter){const e=t.definition.doc.query.filter;(e.and||e.or||[]).forEach(e=>{const[a,n]=Object.entries(e)[0],r=$(a,o,t.provider);r&&(i[a]={...r,values:n})})}g({dimensions:a,metrics:r,filters:i}),y(l),z(!0),console.log("Reconstructed report:",{dimensions:a,metrics:r,filters:i,titleOverrides:l})}catch(e){console.error("Error loading report definition:",e),l.error("Error loading report definition: "+(e.message||"Unknown error"))}},A=e=>{try{console.log("Loading cloned report:",e),d(e.provider),m(e.title||"");const t=[],a={};if(e.definition?.doc?.query?.order_by)for(const t of e.definition.doc.query.order_by)!0===t.desc?a[t.name]="desc":a[t.name]="asc";if(e.definition?.doc?.query?.dimensions)for(const n of e.definition.doc.query.dimensions){const r=$(n,o,e.provider);r&&(r.sortOrder=a[n]||null,t.push(r))}const n=[];if(e.definition?.doc?.query?.metrics)for(const t of e.definition.doc.query.metrics){const a=F(t,o,e.provider);a&&n.push(a)}const r={dimensions:{},metrics:{},filters:{}};e.definition?.doc?.query?.titles&&(e.definition.doc.query.titles.dimensions&&(r.dimensions=e.definition.doc.query.titles.dimensions),e.definition.doc.query.titles.metrics&&(r.metrics=e.definition.doc.query.titles.metrics),e.definition.doc.query.titles.filters&&(r.filters=e.definition.doc.query.titles.filters));const l={};if(e.definition?.doc?.query?.filter){const t=e.definition.doc.query.filter;(t.and||t.or||[]).forEach(t=>{const[a,n]=Object.entries(t)[0],r=$(a,o,e.provider);r&&(l[a]={...r,values:n})})}g({dimensions:t,metrics:n,filters:l}),y(r),console.log("Loaded cloned report:",{dimensions:t,metrics:n,filters:l,titleOverrides:r})}catch(e){console.error("Error loading cloned report:",e),l.error("Error loading cloned report: "+(e.message||"Unknown error"))}},O=(e=0,t=50)=>{const a=p.dimensions.map(e=>{const t={name:e.fullPath};return"desc"===e.sortOrder&&(t.desc=!0),t}),n=[];p.filters&&Object.keys(p.filters).length>0&&Object.entries(p.filters).forEach(([e,t])=>{t.values&&(Array.isArray(t.values)?t.values.length>0&&n.push({[e]:t.values}):"object"==typeof t.values&&n.push({[e]:t.values}))});const r=n.length>0?{and:n}:null,l={};Object.keys(h.dimensions).length>0&&(l.dimensions=h.dimensions),Object.keys(h.metrics).length>0&&(l.metrics=h.metrics),Object.keys(h.filters).length>0&&(l.filters=h.filters);const o={dimensions:p.dimensions.map(e=>e.fullPath),metrics:p.metrics.map(e=>e.fullPath),order_by:a,limit:t,offset:e*t};Object.keys(l).length>0&&(o.titles=l),r&&(o.filter=r);return{provider:c,doc:{query:o},parameters:i?.parameters||{base_currency:"EUR"}}},j=async(e,t)=>{try{b(!0);const a=O(e,t);console.log("Running report with:",a);const n=await Ke.runAdHocReport({report:a});console.log("Report result:",n),v(n),n&&n.length<t?S(e*t+n.length):S((e+2)*t)}catch(e){console.error("Error running report:",e),l.error("Error running report: "+(e.message||"Unknown error")),v(null)}finally{b(!1)}},_=async()=>{k(0),await j(0,D),B(3)},N=c,K=c&&u.trim()&&(p.dimensions.length>0||p.metrics.length>0);return J.default.createElement(f.Box,{sx:{p:3}},J.default.createElement(f.Box,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:2}},J.default.createElement("h1",null,t?"Edit Report":"Create New Report"),r&&J.default.createElement(f.Button,{variant:"outlined",startIcon:J.default.createElement(be.default,null),onClick:r},"Back to List")),J.default.createElement(f.Box,{sx:{mt:2,display:"flex",gap:2,alignItems:"flex-start",flexWrap:"wrap"}},J.default.createElement(f.TextField,{label:"Report Title",value:u,onChange:e=>m(e.target.value),placeholder:"Enter report title",sx:{width:"300px"},size:"small"}),J.default.createElement(Je,{items:o?Object.keys(o).map(e=>({key:e,value:o[e].name||e})):[],value:c,label:"Select Root Provider",onChange:e=>{d(e.target.value),g({dimensions:[],metrics:[],filters:{}}),y({dimensions:{},metrics:{},filters:{}}),console.log("Selected root provider:",e.target.value)},sx:{width:"300px"},disabled:!!t}),J.default.createElement(f.Button,{variant:"contained",onClick:_,disabled:!N,sx:{height:"40px"}},"Run Report"),J.default.createElement(f.Button,{variant:"contained",color:"secondary",startIcon:J.default.createElement(Se.default,null),onClick:async()=>{try{b(!0);const e=O();console.log("Downloading report with:",e);const t=(new Date).toISOString().split("T")[0],a=`${(u||"report").replace(/[^a-z0-9]/gi,"_").toLowerCase()}_${t}.csv`;await Ke.downloadAdHocReport({report:e,filename:a}),l.success("Report downloaded successfully!")}catch(e){console.error("Error downloading report:",e),l.error("Error downloading report: "+(e.message||"Unknown error"))}finally{b(!1)}},disabled:!N||x,sx:{height:"40px"}},"Download CSV"),J.default.createElement(f.Button,{variant:"contained",color:"success",startIcon:J.default.createElement(we.default,null),onClick:async()=>{if(c)if(u.trim())if(0!==p.dimensions.length||0!==p.metrics.length)try{q(!0);const e=p.dimensions.map(e=>{const t={name:e.fullPath};return"desc"===e.sortOrder&&(t.desc=!0),t}),a={};Object.keys(h.dimensions).length>0&&(a.dimensions=h.dimensions),Object.keys(h.metrics).length>0&&(a.metrics=h.metrics),Object.keys(h.filters).length>0&&(a.filters=h.filters);const n={dimensions:p.dimensions.map(e=>e.fullPath),metrics:p.metrics.map(e=>e.fullPath),order_by:e};if(Object.keys(a).length>0&&(n.titles=a),Object.keys(p.filters).length>0){const e=[];Object.entries(p.filters).forEach(([t,a])=>{a.values&&(Array.isArray(a.values)?a.values.length>0&&e.push({[t]:a.values}):"object"==typeof a.values&&e.push({[t]:a.values}))}),e.length>0&&(n.filter={and:e})}const i={query:n},o={provider:c,title:u.trim(),definition:{provider:c,doc:i,parameters:{base_currency:"EUR"}}};console.log("Saving report definition:",o),t?(await Ke.updateReportDefinition({id:t,reportDefinition:o}),l.success("Report definition updated successfully!")):(await Ke.createReportDefinition({reportDefinition:o}),l.success("Report definition created successfully!")),r&&r()}catch(e){console.error("Error saving report definition:",e),l.error("Error saving report definition: "+(e.message||"Unknown error"))}finally{q(!1)}else l.warning("Please add at least one dimension or metric");else l.warning("Please enter a report title");else l.warning("Please select a provider first")},disabled:!K||P,sx:{height:"40px"}},P?"Saving...":t?"Update Report":"Save Report")),c&&J.default.createElement(f.Box,{sx:{mt:4}},J.default.createElement(f.Box,{sx:{borderBottom:1,borderColor:"divider"}},J.default.createElement(f.Tabs,{value:R,onChange:(e,t)=>{B(t)},"aria-label":"report builder tabs"},J.default.createElement(f.Tab,{label:J.default.createElement(f.Badge,{badgeContent:p.dimensions.length,color:"primary"},J.default.createElement("span",{style:{marginRight:p.dimensions.length>0?"12px":"0"}},"Dimensions")),id:"report-tab-0","aria-controls":"report-tabpanel-0"}),J.default.createElement(f.Tab,{label:J.default.createElement(f.Badge,{badgeContent:p.metrics.length,color:"primary"},J.default.createElement("span",{style:{marginRight:p.metrics.length>0?"12px":"0"}},"Metrics")),id:"report-tab-1","aria-controls":"report-tabpanel-1"}),J.default.createElement(f.Tab,{label:J.default.createElement(f.Badge,{badgeContent:Object.keys(p.filters).length,color:"secondary"},J.default.createElement("span",{style:{marginRight:Object.keys(p.filters).length>0?"12px":"0"}},"Filters")),id:"report-tab-2","aria-controls":"report-tabpanel-2"}),J.default.createElement(f.Tab,{label:E?"Results":"Results (Run report first)",id:"report-tab-3","aria-controls":"report-tabpanel-3",disabled:!E}))),J.default.createElement(Et,{value:R,index:0},J.default.createElement(ft,{providersData:o,rootProvider:c,savedDimensions:p.dimensions,onSaveDimension:e=>{g(t=>{const a={...t,dimensions:[...t.dimensions,e]};return console.log("Dimension saved:",e),console.log("Complete report:",a),a})},onRemoveDimension:e=>{g(t=>({...t,dimensions:t.dimensions.filter((t,a)=>a!==e)}))},onReorderDimensions:e=>{g(t=>({...t,dimensions:e}))},titleOverrides:h.dimensions,onUpdateTitle:(e,t)=>{y(a=>({...a,dimensions:{...a.dimensions,[e]:t}}))},onResetTitle:e=>{y(t=>{const a={...t.dimensions};return delete a[e],{...t,dimensions:a}})},existingMetrics:p.metrics,existingFilters:p.filters})),J.default.createElement(Et,{value:R,index:1},J.default.createElement(gt,{providersData:o,rootProvider:c,savedMetrics:p.metrics,onSaveMetric:e=>{g(t=>{const a={...t,metrics:[...t.metrics,e]};return console.log("Metric saved:",e),console.log("Complete report:",a),a})},onRemoveMetric:e=>{g(t=>({...t,metrics:t.metrics.filter((t,a)=>a!==e)}))},onReorderMetrics:e=>{g(t=>({...t,metrics:e}))},titleOverrides:h.metrics,onUpdateTitle:(e,t)=>{y(a=>({...a,metrics:{...a.metrics,[e]:t}}))},onResetTitle:e=>{y(t=>{const a={...t.metrics};return delete a[e],{...t,metrics:a}})},existingDimensions:p.dimensions,existingFilters:p.filters})),J.default.createElement(Et,{value:R,index:2},J.default.createElement(ht,{providersData:o,rootProvider:c,savedFilters:p.filters,existingDimensions:p.dimensions,existingMetrics:p.metrics,onSaveFilter:(e,t)=>{g(a=>{const n={...a,filters:{...a.filters,[e]:t}};return console.log("Filter saved:",{fullPath:e,filterData:t}),console.log("Complete report:",n),n})},onRemoveFilter:e=>{g(t=>{const a={...t.filters};return delete a[e],{...t,filters:a}})},titleOverrides:h.filters,onUpdateTitle:(e,t)=>{y(a=>({...a,filters:{...a.filters,[e]:t}}))},onResetTitle:e=>{y(t=>{const a={...t.filters};return delete a[e],{...t,filters:a}})}})),J.default.createElement(Et,{value:R,index:3},E&&J.default.createElement(yt,{reportData:E,dimensions:p.dimensions,metrics:p.metrics,loading:x,onPageChange:async(e,t)=>{k(e),t!==D&&T(t),await j(e,t)},totalRows:w,titleOverrides:h}))))},xt=()=>{const[t,a]=e.useState("list"),[n,r]=e.useState(null),[l,i]=e.useState(null),[o,s]=e.useState(!1),[c,d]=e.useState(0),u=e=>{r(e),i(null),s(!1),a("builder")},m=()=>{r(null),i(null),s(!1),a("builder")},f=e=>{r(e),i(null),s(!0),a("builder")},p=e=>{r(null),i(e),s(!1),a("builder")};return"list"===t?J.default.createElement(dt,{onSelectReport:u,onAddNew:m,onCloneReport:p,onRunReport:f,refreshTrigger:c}):J.default.createElement(vt,{reportDefinitionId:n,cloneData:l,autoRun:o,onBackToList:()=>{r(null),i(null),s(!1),a("list"),d(e=>e+1)}})};var bt={Chart:at,Dashboard:function({id:t="sample_dashboard",api:a,params:n}){const r=lt(),l=a||r?.api||{},i=n||r?.parameters||{},[o,s]=J.default.useState(),[c]=J.default.useState(),[d,u]=J.default.useState([]),m=J.default.useRef({}),f=et();tt(f),console.log({rows:d},{dashboard:o},{schema:c},{params:i}),e.useEffect(()=>{Ke.setBaseUrl(l.base_url),Ke.setToken(l.token)},[l]);const p=async e=>{const t=e?.doc?.rows||[],a=[];for(let e=0;e<t.length;e++){const n=t[e];n.columns?.forEach(e=>{if(e.override?.filter?.length){const t={};e.override.filter.forEach(e=>{e.hasOwnProperty("value")&&(t[e.field]=[e.value])}),e.filter=t}}),a.push(n)}u(a)};return J.default.useEffect(()=>{t&&(async()=>{Ke.setBaseUrl(l.base_url),Ke.setToken(l.token),await Ke.loadDashboardMeta({dashboardId:t});const e=await Ke.getDashboard({id:t});m.current[e?.id]=e,s(e),await p(e)})().catch(e=>console.error(e.message))},[t]),J.default.createElement(ge.default,{maxWidth:!1,disableGutters:!0},J.default.createElement(pe.default,{container:!0,spacing:3},d?.map((e,t)=>{const a=(e=>0===e?12:12/e)(e.columns.length);return J.default.createElement(J.default.Fragment,{key:t},1===t?J.default.createElement(pe.default,{item:!0,xs:12},J.default.createElement(pe.default,{container:!0,spacing:3},e.columns.map((e,t)=>J.default.createElement(pe.default,{key:t,item:!0,xs:12,md:a},J.default.createElement(at,{api:l,cache:m.current,id:e.id,dashboard:o,schema:c,title:e.title,filter:e.filter,params:i}))))):e.columns.map((e,t)=>J.default.createElement(pe.default,{key:t,item:!0,xs:12,md:a},J.default.createElement(at,{api:l,cache:m.current,id:e.id,dashboard:o,schema:c,title:e.title,filter:e.filter,params:i}))))})))},ReportApp:({paramsDefault:e,apiDefaults:t})=>J.default.createElement(ot,null,J.default.createElement(rt,{defaultParameters:e,defaultApi:t},J.default.createElement(xt,null)))};exports.default=bt;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@material-ui/core/Paper"),a=require("@material-ui/core/styles"),n=require("@material-ui/core"),r=require("react-google-charts"),l=require("numeral"),i=require("axios"),o=require("@material-ui/core/Typography"),s=require("nunjucks"),c=require("@material-ui/core/FormControl"),d=require("@material-ui/core/Select"),u=require("@material-ui/core/MenuItem"),m=require("react-intersection-observer"),f=require("@mui/material"),p=require("@mui/icons-material/CheckBoxOutlineBlank"),g=require("@mui/icons-material/CheckBox"),h=require("@mui/material/Box"),y=require("@mui/material/InputLabel"),E=require("@mui/material/MenuItem"),v=require("@mui/material/FormControl"),x=require("@mui/material/Select"),b=require("eventemitter3"),w=require("@material-ui/core/Grid"),S=require("@material-ui/core/Container"),C=require("@mui/x-data-grid"),k=require("@mui/icons-material/Add"),D=require("@mui/icons-material/Edit"),T=require("@mui/icons-material/ContentCopy"),R=require("@mui/icons-material/Delete"),B=require("@mui/icons-material/PlayArrow"),P=require("@mui/icons-material/ArrowBack"),q=require("@mui/icons-material/Save"),M=require("@mui/icons-material/Download"),z=require("@dnd-kit/core"),$=require("@dnd-kit/sortable"),F=require("@dnd-kit/utilities"),I=require("@mui/icons-material/DragIndicator"),A=require("@mui/icons-material/ArrowUpward"),O=require("@mui/icons-material/ArrowDownward"),j=require("@mui/icons-material/Sort"),_=require("@mui/icons-material/Check"),N=require("@mui/icons-material/Close"),K=require("@mui/icons-material/RestartAlt"),U=require("@mui/icons-material/PlaylistAdd"),L=require("@mui/icons-material/FilterAlt"),Y=require("@mui/x-date-pickers/LocalizationProvider"),W=require("@mui/x-date-pickers/DatePicker"),H=require("@mui/x-date-pickers/AdapterDayjs"),G=require("dayjs");function V(e){return e&&e.__esModule?e:{default:e}}function Z(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(a){if("default"!==a){var n=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,n.get?n:{enumerable:!0,get:function(){return e[a]}})}}),t.default=e,Object.freeze(t)}var J=Z(e),Q=V(t),X=V(l),ee=V(i),te=V(o),ae=V(s),ne=V(c),re=V(d),le=V(u),ie=V(p),oe=V(g),se=V(h),ce=V(y),de=V(E),ue=V(v),me=V(x),fe=V(b),pe=V(w),ge=V(S),he=V(k),ye=V(D),Ee=V(T),ve=V(R),xe=V(B),be=V(P),we=V(q),Se=V(M),Ce=V(I),ke=V(A),De=V(O),Te=V(j),Re=V(_),Be=V(N),Pe=V(K),qe=V(U),Me=V(L),ze=V(G);function $e(){return $e=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)({}).hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},$e.apply(null,arguments)}const Fe=a.makeStyles(e=>({root:{width:"100%","& > * + *":{marginTop:e.spacing(2)}}}));function Ie(e){const t=Fe();return J.default.createElement("div",$e({className:t.root},e),J.default.createElement(n.CircularProgress,{style:{color:"rgb(70, 134, 128)"},size:25}))}function Ae(e,t,a="array"){const n=e.columns,r=[...t.doc.metrics,...t.doc.dimensions].reduce((e,t)=>(e[t.name]=t,e),{});return e=>{const t="array"===a?[]:{};return n.reduce((t,n)=>{const l=e[n.name],i=r[n.name];let o=l;return o="timestamp"===i.type?new Date(l):i.format?i.format&&i.prefix?{v:+l,f:i.prefix+" "+X.default(l).format(i.format)}:i.format?{v:+l,f:X.default(l).format(i.format)}:l:l,"array"===a?t.push(o):t[n.name]=o?.f||o,t},t)}}const Oe="https://report-api.netcapital.pro",je=ee.default.create({baseURL:Oe,headers:{"Content-Type":"application/json"}}),_e={},Ne=()=>{const e=Object.keys(_e);return e.length>0?e[0]:null},Ke={setBaseUrl(e){je.defaults.baseURL=e||Oe},setToken(e){e&&(je.defaults.headers.common.Authorization=`Bearer ${e}`)},loadDashboardMeta:async({dashboardId:e})=>{const{data:t}=await je.get(`/dashboard-meta/${e}`);return _e[e]={dashboards:t.dashboards||{},charts:t.charts||{},reports:t.reports||{},reportMetadata:t.reportMetadata||{},dateRanges:t.dateRanges||[]},_e[e]},getDashboard:async({id:e,dashboardId:t})=>{const a=t||Ne();if(a&&_e[a]?.dashboards?.[e])return _e[a].dashboards[e];const{data:n}=await je.get(`/entity/dashboards/${e}`);return n},getChart:async({id:e,dashboardId:t})=>{const a=t||Ne();if(a&&_e[a]?.charts?.[e])return _e[a].charts[e];const{data:n}=await je.get(`/entity/charts/${e}`);return n},getReport:async({id:e,dashboardId:t})=>{const a=t||Ne();if(a&&_e[a]?.reports?.[e])return _e[a].reports[e];const{data:n}=await je.get(`/entity/reports/${e}`);return n},getProviders:async()=>{const{data:e}=await je.get("/entity/providers");return e},getReportSchema:async({id:e,dashboardId:t,query:a={}})=>{const n=t||Ne();if(n&&_e[n]?.reportMetadata?.[e])return _e[n].reportMetadata[e];const{data:r}=await je.post(`/reports/${e}/metadata`,a);return r},runReport:async({id:e,query:t={}})=>{const{data:a}=await je.post(`/reports/${e}/run`,t);return a},runAdHocReport:async({report:e})=>{const{data:t}=await je.post("/report-build/run",e);return t},downloadAdHocReport:async({report:e,filename:t})=>{const a=await je.post("/report-build/run?download=csv",e,{responseType:"blob"}),n=window.URL.createObjectURL(new Blob([a.data])),r=document.createElement("a");r.href=n;let l=t||"report.csv";if(!t){const e=a.headers["content-disposition"];if(e){const t=e.match(/filename="?(.+)"?/i);t&&t[1]&&(l=t[1])}}r.setAttribute("download",l),document.body.appendChild(r),r.click(),r.remove(),window.URL.revokeObjectURL(n)},getDateRanges:async({dashboardId:e}={})=>{const t=e||Ne();if(t&&_e[t]?.dateRanges)return _e[t].dateRanges;const{data:a}=await je.get("/globals/date-ranges");return a},getReportDefinitions:async()=>{const{data:e}=await je.get("/report-definitions");return e},getReportDefinition:async({id:e})=>{const{data:t}=await je.get(`/report-definitions/${e}`);return t},createReportDefinition:async({reportDefinition:e})=>{const{data:t}=await je.post("/report-definitions",e);return t},updateReportDefinition:async({id:e,reportDefinition:t})=>{const{data:a}=await je.put(`/report-definitions/${e}`,t);return a},deleteReportDefinition:async({id:e})=>{const{data:t}=await je.delete(`/report-definitions/${e}`);return t}},Ue=a.makeStyles(e=>({headerRow:{fontFamily:e.typography.fontFamily,fontSize:e.typography.fontSize},tableRow:{fontFamily:e.typography.fontFamily,fontSize:e.typography.fontSize},oddTableRow:{fontFamily:e.typography.fontFamily,fontSize:e.typography.fontSize},headerCell:{backgroundColor:"white",padding:"4px !important"}})),Le={none:"YYYY-MM-dd",day:"MMM dd",week:"MMM dd",month:"YYYY MMM",year:"YYYY"};const Ye={GoogleChart:function({chart:t,source:a,view:n,report:l,schema:i,dashboard:o,query:s}){const[c,d]=J.default.useState([]),u=Ue(),[m,f]=J.default.useState([]);e.useEffect(()=>{(async()=>{const e=await Ke.getDateRanges();f(e)})()},[]);const p=e.useMemo(()=>{const e="YYYY-MM-dd",t=s?.date_range?.name,a=m.find(e=>e.name===t);if(!a)return e;return Le[a?.granularity]||e},[m,s]);return J.default.useEffect(()=>{if(!(t&&n&&a&&l&&i))return;let e=[];e.push(function(e,t){const a=[...t.doc.metrics,...t.doc.dimensions];return e.columns.reduce((e,t)=>{const n=a.find(e=>e.name===t.name)||t;return e.push(n.title||n.name),e},[])}(n,i));const r=Ae(n,i);a?.forEach(t=>{const a=r(t);e.push(a)}),a?.length?d(e):d()},[t,a,n,l,i]),c?J.default.createElement("div",{style:{}},J.default.createElement(r.Chart,$e({width:t?.doc.size?.width||"100%",chartType:t?.doc.chart?.type,data:c,options:(e=>{const a=["#468682","#ff686b","#6c757d","#FFD700","#073b4c"];if("Table"===t?.doc.chart?.type)return{...t?.doc.chart?.options,cssClassNames:u};if("AreaChart"===t?.doc.chart?.type){const n=t?.doc.chart?.options?.hAxis||{},r={...{ticks:e.slice(1).map(e=>e[0]),format:p},...n};return{...t?.doc.chart?.options,hAxis:r,focusTarget:"category",colors:a}}return{...t?.doc.chart?.options,colors:a}})(c)},t?.doc.chart?.props))):J.default.createElement("div",null)},LabelChart:function({chart:e,source:t,view:a,report:n,schema:r}){const[l,i]=J.default.useState([]),[o,s]=J.default.useState(),[c,d]=J.default.useState();return J.default.useEffect(()=>{if(!(e&&a&&t&&n&&r))return;let l=[];const o=Ae(a,r);t.forEach(e=>l.push(o(e))),i(l);const c=e?.doc?.chart?.options||{},u=c?.index||0;if(l.length>0&&s(l[0][u]),c.subText?.format){ae.default.configure({autoescape:!1});const e=Ae(a,r,"object")(t[0]),n=ae.default.renderString(c.subText?.format,e);d(n)}},[e,t,a,n,r]),J.default.createElement("div",{style:{display:"flex",justifyContent:"center",alignContent:"center",height:"100%",flexDirection:"column"}},J.default.createElement(te.default,{variant:"h6"},o?.f||o),J.default.createElement(te.default,{variant:"caption"},c))}};function We(e,t){return void 0!==Ye[e]?J.default.createElement(Ye[e],t):J.default.createElement(Ie,t)}const He=J.createElement(ie.default,{fontSize:"small"}),Ge=J.createElement(oe.default,{fontSize:"small"});function Ve({items:t,selectedKeys:a,defaultSelectedKeys:n,onChange:r,inputValue:l,defaultInputValue:i,onInputChange:o,debounceMs:s=300,label:c,placeholder:d,loading:u,disabled:m,size:p="small",error:g,helperText:h,limitTags:y=3,disableClearable:E,id:v,textFieldProps:x}){const b=e.useMemo(()=>Array.isArray(t)?t:[],[t]),w=Array.isArray(a),[S,C]=e.useState(Array.isArray(n)?n:[]),k=w?a:S,D=e.useMemo(()=>{const e=new Map;for(const t of b)e.set(t&&t.key,t);return e},[b]),T=e.useMemo(()=>(Array.isArray(k)?k:[]).map(e=>D.get(e)).filter(Boolean),[k,D]),R="string"==typeof l,[B,P]=e.useState("string"==typeof i?i:""),q=R?l:B,M=function(t,a=300){const n=e.useRef(t),r=e.useRef(null);return n.current=t,e.useEffect(()=>()=>{r.current&&window.clearTimeout(r.current)},[]),J.useCallback((...e)=>{n.current&&(r.current&&window.clearTimeout(r.current),r.current=window.setTimeout(()=>{n.current&&n.current(...e)},a))},[a])}(e=>{o&&o(e)},s),z=T;return J.createElement(f.FormControl,{fullWidth:!0,error:g,disabled:m},J.createElement(f.Autocomplete,{openOnFocus:!0,forcePopupIcon:!0,id:v,multiple:!0,disableCloseOnSelect:!0,options:b,value:z,inputValue:q,getOptionLabel:e=>e&&"object"==typeof e?e.value??"":"",isOptionEqualToValue:(e,t)=>e&&t&&e.key===t.key,loading:u,limitTags:y,disableClearable:E,onChange:(e,t)=>{const a=Array.isArray(t)?t.map(e=>e&&e.key):[];w||C(a),r&&r(a,Array.isArray(t)?t:[])},onInputChange:(e,t,a)=>{R||P(t??""),"input"===a?M(t??""):"clear"===a&&M("")},renderOption:(e,t,{selected:a})=>J.createElement("li",$e({},e,{key:t&&t.key||Math.random().toString(36)}),J.createElement(f.Checkbox,{icon:He,checkedIcon:Ge,style:{marginRight:8},checked:!!a}),t&&t.value),renderTags:(e,t)=>(Array.isArray(e)?e:[]).map((e,a)=>J.createElement(f.Chip,$e({},t({index:a}),{key:e&&e.key||a,label:e&&e.value||""}))),renderInput:e=>J.createElement(f.TextField,$e({},e,{label:c,placeholder:d,InputProps:{...e.InputProps,endAdornment:J.createElement(J.Fragment,null,u?J.createElement(f.CircularProgress,{size:18}):null,e.InputProps.endAdornment)},size:p},x))}),h?J.createElement(f.FormHelperText,null,h):null)}const Ze=({filter:t,channel:a,query:n})=>{const[r,l]=e.useState([]),[i,o]=e.useState([]),[s,c]=e.useState(!1),[d,u]=e.useState("");return e.useEffect(()=>{o(n?.filter?.[t?.filter]||[])},[n]),e.useEffect(()=>{(async()=>{c(!0);const e=await async function(e,t){return t?.source?(await Ke.runReport({id:t.source})).map(e=>({key:e[t.field],value:e[t.field]})):[]}(0,t);l(e),c(!1)})()},[d]),J.default.createElement("div",{style:{display:"flex"}},J.default.createElement("div",{style:{maxWidth:640,minWidth:200}},J.default.createElement(Ve,{id:t?.title,label:t?.title,placeholder:"Type to search…",items:r,selectedKeys:i,onChange:(e,n)=>{o(e),a.emit("filterChanged",t,{[t.filter]:e})},onInputChange:e=>{u(e)},loading:s,debounceMs:300,helperText:i.length?`${i.length} selected`:""})))};function Je({items:e,value:t,label:a,onChange:n,sx:r={width:"100%"},disabled:l=!1}){const i=e.some(e=>e.key===t)?t:"";return J.default.createElement(se.default,{sx:r},J.default.createElement(ue.default,{fullWidth:!0},J.default.createElement(ce.default,{id:"demo-simple-select-label"},a),J.default.createElement(me.default,{labelId:"demo-simple-select-label",id:"demo-simple-select",value:i,label:a,onChange:n,disabled:l,MenuProps:{style:{maxHeight:"300px"}},size:"small"},e.map(e=>{const{key:t,value:a,disabled:n}=e;return J.default.createElement(de.default,{key:t,value:t,disabled:n},a)}))))}const Qe=({filter:t,channel:a,query:n})=>{const[r,l]=e.useState([]),[i,o]=e.useState("");return e.useEffect(()=>{o(n?.date_range?.name)},[n]),e.useEffect(()=>{(async()=>{const e=(await Ke.getDateRanges()).filter(e=>!(t.allowedOptions.length>0)||t.allowedOptions.some(t=>t===e.name)).map(e=>({key:e.name,value:e.title}));l(e)})()},[]),J.default.createElement("div",{style:{minWidth:"200px",maxWidth:"640px"}},J.default.createElement(Je,{items:r,value:i,label:t?.title,onChange:(e,n)=>{const r=e.target.value;o(r),a.emit("filterChanged",t,{date_range:{name:r}})}}))},Xe=({filters:e=[],channel:t,query:a})=>J.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px"}},e.map(e=>"multi-select"===e.type?J.default.createElement(Ze,{key:e.title,channel:t,filter:e,query:a}):"date-range"===e.type?J.default.createElement(Qe,{key:e.title,channel:t,filter:e,query:a}):null));var et=e=>J.default.useRef(e||new fe.default).current,tt=e=>{const t=J.default.useState({}),a=J.default.useCallback((a,n)=>{let r={...t.current,...n};for(var l in t.current=r,r)"date_range"===l||r[l].length||delete r[l];e?.emit("mergedFilterChanged",{value:r})},[e]);J.default.useEffect(()=>(e?.on("filterChanged",a),()=>{e?.off("filterChanged",a)}),[e])},at=({id:e,cache:t,dashboard:a,channel:n,...r})=>{const[l,i]=J.default.useState(),[o,s]=J.default.useState(),[c,d]=J.default.useState(),[u,f]=J.default.useState(),[p,g]=J.default.useState(We()),[h,y]=J.default.useState(),[E,v]=J.default.useState(0),[x,b]=J.default.useState(!1),[w,S]=J.default.useState(),[C,k]=J.default.useState(!1),D=J.default.useRef({value:r?.filter}),[T,R]=J.default.useState({}),{ref:B,inView:P,entry:q}=m.useInView({threshold:.1,delay:1e3}),M=et(n);tt(M);const z=J.default.useCallback(e=>{const t=e.target.value;v(t),y(l.doc.view[t])},[l]);J.default.useEffect(()=>{e&&(async()=>{const a=e,n=t?.[a]||await Ke.getChart({id:a}),l=n.doc.source?.id,o=l?t?.[l]||await Ke.getReport({id:l}):void 0,c=t?.[`schema_${l}`]||r?.schema||await Ke.getReportSchema({id:l}),u=n.doc?.view?.[0];v(0),s(o),i(n),y(u),d(c),k(!0)})().catch(e=>{console.error(e.message)})},[e]),J.default.useEffect(()=>{l&&u&&(!l?.doc?.source?.id||o)&&c&&(async()=>{g(We(l.doc.chart?.component,{view:h,source:u,chart:l,report:o,schema:c,dashboard:a,query:T}))})().catch(e=>{console.error(e.message)})},[l,u,h,o,c]);const $=e=>{const t={...o?.doc.query.filter||{},...r?.filter,...e?.value},a=t.date_range||o?.doc.query.date_range;if(delete t.date_range,k(!1),S(),b(!0),"context"===l?.doc?.source?.type)return f({filter:t}),void b(!1);const n={filter:t,date_range:a,parameters:r?.params};R(n),Ke.runReport({id:o.id,query:n}).then(e=>{f(l.doc.source.reverse?e.reverse():e)}).catch(e=>{f([])}).finally(()=>{b(!1)})},F=e=>{D.current=e,P?$(e):(S(e),k(!0))};return J.default.useEffect(()=>(M?.on("mergedFilterChanged",F),()=>{M?.off("mergedFilterChanged",F)}),[M,o,l,P]),J.default.useEffect(()=>{P&&C&&$(w)},[P,C]),J.default.useEffect(()=>{k(!0)},[r.params]),J.default.createElement(Q.default,{ref:B,elevation:0,style:{borderRadius:12,padding:20,border:"1px solid #e5e5e5",background:"#fff",display:"flex",flexDirection:"column",gap:"12px",height:"100%"}},l&&J.default.createElement("div",{style:{display:"flex",alignItems:"center",lineHeight:0}},J.default.createElement(te.default,{variant:"subtitle2",style:{fontWeight:600,color:"#252525"}},r?.title||l.doc.name," ")),x?J.default.createElement(Ie,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100%",width:"100%"}}):J.default.createElement(J.default.Fragment,null,J.default.createElement("div",{style:{display:"flex"}},J.default.createElement("div",{style:{flexGrow:1}}),J.default.createElement("div",null,l?.doc?.view?.length>1&&J.default.createElement(ne.default,null,J.default.createElement(re.default,{labelId:"date-range-select-label",id:"date-range-select",value:E,onChange:z,style:{fontSize:"12px"},disableUnderline:!0},l.doc.view.map((e,t)=>J.default.createElement(le.default,{key:t,value:t},e.title)))))),J.default.createElement("div",{style:{position:"relative",flexGrow:a?void 0:1,display:"flex",flexDirection:"column"}},J.default.createElement(Xe,{filters:l?.doc?.filters,channel:M,query:T}),p)))};const nt=e.createContext(void 0),rt=({defaultParameters:t={},defaultApi:a={},children:n})=>{const[r,l]=e.useState(t),[i,o]=e.useState(a),s={parameters:r,setParameters:l,api:i,setApi:o,setReportingContext:({parameters:e,api:t})=>{void 0!==e&&l(e),void 0!==t&&o(t)}};return J.default.createElement(nt.Provider,{value:s},n)},lt=()=>e.useContext(nt);const it=e.createContext(),ot=({children:t})=>{const[a,n]=e.useState({open:!1,message:"",severity:"info",duration:6e3}),r=(e,t="info",a=6e3)=>{n({open:!0,message:e,severity:t,duration:a})},l=(e,t)=>{"clickaway"!==t&&n(e=>({...e,open:!1}))},i={success:(e,t)=>r(e,"success",t),error:(e,t)=>r(e,"error",t),warning:(e,t)=>r(e,"warning",t),info:(e,t)=>r(e,"info",t)};return J.default.createElement(it.Provider,{value:i},t,J.default.createElement(f.Snackbar,{open:a.open,autoHideDuration:a.duration,onClose:l,anchorOrigin:{vertical:"top",horizontal:"right"}},J.default.createElement(f.Alert,{onClose:l,severity:a.severity,variant:"filled",sx:{width:"100%"}},a.message)))},st=()=>{const t=e.useContext(it);if(!t)throw new Error("useNotify must be used within a NotifyProvider");return t},ct=({open:e,title:t="Confirm Action",message:a,onConfirm:n,onCancel:r,confirmText:l="Confirm",cancelText:i="Cancel",confirmColor:o="error"})=>J.default.createElement(f.Dialog,{open:e,onClose:r,"aria-labelledby":"confirm-dialog-title","aria-describedby":"confirm-dialog-description"},J.default.createElement(f.DialogTitle,{id:"confirm-dialog-title"},t),J.default.createElement(f.DialogContent,null,J.default.createElement(f.DialogContentText,{id:"confirm-dialog-description"},a)),J.default.createElement(f.DialogActions,null,J.default.createElement(f.Button,{onClick:r,variant:"outlined"},i),J.default.createElement(f.Button,{onClick:n,variant:"contained",color:o,autoFocus:!0},l))),dt=({onSelectReport:t,onAddNew:a,onCloneReport:n,onRunReport:r,refreshTrigger:l})=>{const i=st(),[o,s]=e.useState([]),[c,d]=e.useState(!0),[u,m]=e.useState(null),[p,g]=e.useState(!1),[h,y]=e.useState(null);e.useEffect(()=>{E()},[l]);const E=async()=>{try{d(!0),m(null);const e=await Ke.getReportDefinitions();s(e)}catch(e){console.error("Error loading report definitions:",e);const t="Failed to load report definitions: "+(e.message||"Unknown error");m(t),i.error(t)}finally{d(!1)}},v=[{field:"title",headerName:"Title",flex:1,minWidth:200},{field:"provider",headerName:"Provider",flex:1,minWidth:200},{field:"actions",headerName:"Actions",width:200,sortable:!1,filterable:!1,disableColumnMenu:!0,renderCell:e=>J.default.createElement(f.Box,{sx:{display:"flex",gap:1}},J.default.createElement(f.Tooltip,{title:"Run"},J.default.createElement(f.IconButton,{size:"small",color:"success",onClick:t=>{return a=e.row.id,t.stopPropagation(),void r(a);var a}},J.default.createElement(xe.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Edit"},J.default.createElement(f.IconButton,{size:"small",color:"primary",onClick:a=>{return n=e.row.id,a.stopPropagation(),void t(n);var n}},J.default.createElement(ye.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Clone"},J.default.createElement(f.IconButton,{size:"small",onClick:t=>(async(e,t)=>{t.stopPropagation();try{const t=await Ke.getReportDefinition({id:e}),a={...t,title:`${t.title} (Copy)`};n(a)}catch(e){console.error("Error cloning report:",e),i.error("Failed to clone report: "+(e.message||"Unknown error"))}})(e.row.id,t)},J.default.createElement(Ee.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Delete"},J.default.createElement(f.IconButton,{size:"small",color:"error",onClick:t=>((e,t)=>{t.stopPropagation();const a=o.find(t=>t.id===e);y(a),g(!0)})(e.row.id,t)},J.default.createElement(ve.default,{fontSize:"small"}))))}],x=o.map(e=>({id:e.id,title:e.title,provider:e.provider}));return c?J.default.createElement(f.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},J.default.createElement(f.CircularProgress,null)):u?J.default.createElement(f.Box,{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",minHeight:400,gap:2},J.default.createElement(f.Typography,{variant:"body1",color:"error"},u),J.default.createElement(f.Button,{variant:"contained",onClick:E},"Retry")):J.default.createElement(f.Box,{sx:{p:3}},J.default.createElement(f.Box,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:3}},J.default.createElement(f.Typography,{variant:"h4",component:"h1"},"Report Definitions"),J.default.createElement(f.Button,{variant:"contained",color:"primary",startIcon:J.default.createElement(he.default,null),onClick:a},"Add New Report")),J.default.createElement(f.Box,{sx:{height:600,width:"100%"}},J.default.createElement(C.DataGrid,{rows:x,columns:v,pageSize:10,rowsPerPageOptions:[10,25,50],disableSelectionOnClick:!0,onRowClick:e=>{t(e.row.id)},sx:{"& .MuiDataGrid-row":{cursor:"pointer"},"& .MuiDataGrid-row:hover":{backgroundColor:"#f5f5f5"},"& .MuiDataGrid-columnHeader":{backgroundColor:"#f5f5f5",fontWeight:"bold"}}})),J.default.createElement(ct,{open:p,title:"Delete Report Definition",message:h?`Are you sure you want to delete "${h.title}"? This action cannot be undone.`:"",onConfirm:async()=>{if(h)try{await Ke.deleteReportDefinition({id:h.id}),i.success(`Report "${h.title}" deleted successfully!`),g(!1),y(null),E()}catch(e){console.error("Error deleting report:",e),i.error("Failed to delete report: "+(e.response?.data?.message||e.message||"Unknown error")),g(!1),y(null)}},onCancel:()=>{g(!1),y(null)},confirmText:"Delete",cancelText:"Cancel",confirmColor:"error"}))},ut=({providersData:t,rootProvider:a,onSelectionChange:n,existingDimensions:r=[],existingMetrics:l=[],existingFilters:i={}})=>{const[o,s]=e.useState([]);e.useEffect(()=>{s([]),n&&n([])},[a]);const c=e=>{if(!t||!e)return[];const a=t[e];if(!a||!a.relations||0===a.relations.length)return[];const n=(()=>{const e=new Map,t=t=>{if(t.relations&&t.providerPath)for(let a=0;a<t.relations.length;a++){const n=t.relations[a],r=t.providerPath[a];n.type&&(e.has(r)||e.set(r,new Set),e.get(r).add(n.name))}};return r.forEach(t),l.forEach(t),Object.values(i).forEach(t),e})().get(e);return a.relations.filter(e=>t[e.target]).map(e=>{let t=!1,a=null;if(!!e.type&&n&&n.size>0){if(!n.has(e.name)&&n.size>0){t=!0;a=`Cannot select: '${Array.from(n)[0]}' is already in use`}}return{key:e.name,value:e.name,targetKey:e.target,disabled:t,disabledReason:a}})},d=(e,t)=>{const r=t.target.value,l=0===e?a:o[e-1].targetKey,i=c(l).find(e=>e.key===r);if(!i)return;const d=o.slice(0,e);d.push({providerKey:r,relationName:r,targetKey:i.targetKey}),s(d),console.log("Selection chain:",d),n&&n(d)};return J.default.createElement(f.Box,null,o.length>0&&J.default.createElement(f.Box,{sx:{marginBottom:2}},J.default.createElement(f.Typography,{variant:"subtitle2",sx:{marginBottom:1,color:"text.secondary"}},"Selected Path:"),J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:1,flexWrap:"wrap"}},J.default.createElement(f.Chip,{label:a,size:"small",color:"primary",variant:"outlined"}),o.map((e,t)=>J.default.createElement(J.default.Fragment,{key:t},J.default.createElement(f.Typography,{variant:"body2",sx:{color:"text.secondary"}},"→"),J.default.createElement(f.Chip,{label:e.targetKey,size:"small",color:"primary",onDelete:()=>(e=>{const t=o.slice(0,e);s(t),n&&n(t)})(t),sx:{fontWeight:500}}))))),J.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",alignItems:"flex-start",gap:"8px"}},(()=>{if(!t||!a)return null;const e=[],n=c(a);n.length>0&&e.push(J.default.createElement("div",{key:"level-0",style:{marginRight:"16px"}},J.default.createElement(Je,{items:n,value:o[0]?.providerKey||"",label:`Related to ${a}`,onChange:e=>d(0,e),sx:{width:"300px"}})));for(let t=0;t<o.length;t++){const a=o[t],n=c(a.targetKey);if(n.length>0){const r=o[t+1];e.push(J.default.createElement("div",{key:`level-${t+1}`,style:{marginRight:"16px"}},J.default.createElement(Je,{items:n,value:r?.providerKey||"",label:`Related to ${a.targetKey}`,onChange:e=>d(t+1,e),sx:{width:"300px"}})))}}return e})()))},mt=({id:t,label:a,fullLabel:n,onDelete:r,onMoveUp:l,onMoveDown:i,isFirst:o,isLast:s,sortOrder:c,onSortOrderChange:d,fullPath:u,defaultTitle:m,customTitle:p,onUpdateTitle:g,onResetTitle:h})=>{const[y,E]=e.useState(!1),[v,x]=e.useState(""),b=e.useRef(null),w=e.useRef(null),{attributes:S,listeners:C,setNodeRef:k,transform:D,transition:T,isDragging:R}=$.useSortable({id:t}),B={transform:F.CSS.Transform.toString(D),transition:T,opacity:R?.5:1,display:"flex",alignItems:"center",width:"100%"};e.useEffect(()=>{y&&b.current&&(b.current.focus(),b.current.select())},[y]),e.useEffect(()=>{const e=e=>{y&&w.current&&!w.current.contains(e.target)&&q()};if(y)return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[y]);const P=()=>{const e=v.trim();""!==e?(g(u,e),E(!1)):q()},q=()=>{E(!1),x("")},M=p||a,z=!!p;return J.default.createElement("div",$e({ref:k,style:B},S),J.default.createElement(f.Box,{ref:w,sx:{display:"flex",alignItems:"center",width:"100%",gap:1}},J.default.createElement(f.Box,$e({},C,{sx:{display:"flex",alignItems:"center",cursor:"grab","&:active":{cursor:"grabbing"}}}),J.default.createElement(Ce.default,{sx:{cursor:"grab"}})),y?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.TextField,{inputRef:b,value:v,onChange:e=>x(e.target.value),onKeyDown:e=>{"Enter"===e.key?P():"Escape"===e.key&&q()},size:"small",sx:{width:"200px"}}),J.default.createElement(f.Tooltip,{title:"Save",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:P,color:"primary","aria-label":"save title"},J.default.createElement(Re.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Cancel",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:q,"aria-label":"cancel edit"},J.default.createElement(Be.default,{fontSize:"small"}))),z&&J.default.createElement(f.Tooltip,{title:"Reset to default",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:()=>{h(u),E(!1),x("")},color:"warning","aria-label":"reset title"},J.default.createElement(Pe.default,{fontSize:"small"})))):J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Tooltip,{title:n,arrow:!0,placement:"top"},J.default.createElement(f.Chip,{label:M,onDelete:r,color:"primary",variant:"outlined",sx:{fontWeight:z?"bold":"normal",fontStyle:z?"italic":"normal"}})),J.default.createElement(f.Tooltip,{title:"Edit title",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:()=>{x(p||m),E(!0)},"aria-label":"edit title"},J.default.createElement(ye.default,{fontSize:"small"})))),!y&&J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Tooltip,{title:null===c?"No sort":"asc"===c?"Ascending":"Descending",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:()=>{d(null===c?"asc":"asc"===c?"desc":null)},"aria-label":"toggle sort order",color:c?"primary":"default"},"asc"===c?J.default.createElement(ke.default,{fontSize:"small"}):"desc"===c?J.default.createElement(De.default,{fontSize:"small"}):J.default.createElement(Te.default,{fontSize:"small",sx:{opacity:.3}}))),J.default.createElement(f.Box,{sx:{flex:1}}),J.default.createElement(f.Box,{sx:{display:"flex",gap:.5}},J.default.createElement(f.IconButton,{size:"small",onClick:l,disabled:o,"aria-label":"move up"},J.default.createElement(ke.default,{fontSize:"small"})),J.default.createElement(f.IconButton,{size:"small",onClick:i,disabled:s,"aria-label":"move down"},J.default.createElement(De.default,{fontSize:"small"}))))))},ft=({providersData:t,rootProvider:a,savedDimensions:n=[],onSaveDimension:r,onRemoveDimension:l,onReorderDimensions:i,titleOverrides:o={},onUpdateTitle:s,onResetTitle:c,existingMetrics:d=[],existingFilters:u={}})=>{const[m,p]=e.useState(!1),[g,h]=e.useState([]),[y,E]=e.useState(""),v=z.useSensors(z.useSensor(z.PointerSensor),z.useSensor(z.KeyboardSensor,{coordinateGetter:$.sortableKeyboardCoordinates})),x=()=>{const e=a?0===g.length?a:g[g.length-1].targetKey:null;if(!e||!t||!t[e])return[];const r=t[e];if(!r.dimensions)return[];const l=[t[a].default_alias];let i=a;g.forEach(e=>{const a=t[i];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&l.push(t.alias)}i=e.targetKey});const o=new Set(n.map(e=>e.fullPath)),s=[];return Object.keys(r.dimensions).forEach(t=>{const a=r.dimensions[t];Object.keys(a).forEach(n=>{const r=a[n],i=`${l.join("_")}.${n}`,c=o.has(i);s.push({key:`${e}_${t}.${n}`,value:r.title||n,dimensionKey:n,alias:t,dimension:r,disabled:c})})}),s},b=()=>{p(!1),h([]),E("")},w=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")};return J.default.createElement("div",null,J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:2,marginBottom:2}},m?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Button,{variant:"outlined",onClick:b},"Cancel"),J.default.createElement(f.Button,{variant:"contained",onClick:()=>{if(!y)return;const e=x().find(e=>e.key===y);if(!e)return;const n=[],l=[a],i=[];let o=a;g.forEach(e=>{const a=t[o];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&(n.push(t),i.push(t.name))}l.push(e.targetKey),o=e.targetKey});const s=[t[a].default_alias];n.forEach(e=>{s.push(e.alias)});const c=`${s.join("_")}.${e.dimensionKey}`,d={dimension:e.dimension,relations:n,providerPath:l,relationNames:i,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:c};r(d),b()},disabled:!y},"Save Dimension")):J.default.createElement(f.Button,{variant:"contained",onClick:()=>{p(!0),h([]),E("")}},"Add Dimension")),m&&J.default.createElement(f.Paper,{sx:{padding:3,marginBottom:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Select Provider Path"),J.default.createElement(ut,{providersData:t,rootProvider:a,onSelectionChange:h,existingDimensions:n,existingMetrics:d,existingFilters:u}),J.default.createElement(f.Typography,{variant:"h6",sx:{marginTop:3,marginBottom:2}},"Select Dimension"),J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:1}},J.default.createElement(Je,{items:x(),value:y,label:"Choose Dimension",onChange:e=>{E(e.target.value)},sx:{width:"400px"}}),J.default.createElement(f.Tooltip,{title:"Add all available dimensions",arrow:!0,placement:"top"},J.default.createElement("span",null,J.default.createElement(f.IconButton,{color:"primary",onClick:()=>{const e=x().filter(e=>!e.disabled);if(0===e.length)return;const n=[],l=[a],i=[];let o=a;g.forEach(e=>{const a=t[o];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&(n.push(t),i.push(t.name))}l.push(e.targetKey),o=e.targetKey});const s=[t[a].default_alias];n.forEach(e=>{s.push(e.alias)}),e.forEach(e=>{const t=`${s.join("_")}.${e.dimensionKey}`,a={dimension:e.dimension,relations:n,providerPath:l,relationNames:i,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:t};r(a)}),b()},disabled:0===x().filter(e=>!e.disabled).length,"aria-label":"add all dimensions"},J.default.createElement(qe.default,null)))))),n.length>0&&J.default.createElement(f.Box,{sx:{marginTop:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Saved Dimensions (Drag to reorder or use arrows)"),J.default.createElement(z.DndContext,{sensors:v,collisionDetection:z.closestCenter,onDragEnd:e=>{const{active:t,over:a}=e;if(a&&t.id!==a.id){const e=n.findIndex((e,a)=>a===t.id),r=n.findIndex((e,t)=>t===a.id),l=$.arrayMove(n,e,r);i(l)}}},J.default.createElement($.SortableContext,{items:n.map((e,t)=>t),strategy:$.verticalListSortingStrategy},J.default.createElement(f.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},n.map((e,t)=>J.default.createElement(mt,{key:t,id:t,label:e.dimensionTitle,fullLabel:`${w(e)} → ${e.dimensionTitle} (${e.fullPath})`,onDelete:()=>l(t),onMoveUp:()=>(e=>{if(e>0){const t=$.arrayMove(n,e,e-1);i(t)}})(t),onMoveDown:()=>(e=>{if(e<n.length-1){const t=$.arrayMove(n,e,e+1);i(t)}})(t),isFirst:0===t,isLast:t===n.length-1,sortOrder:e.sortOrder||null,onSortOrderChange:e=>((e,t)=>{const a=[...n];a[e]={...a[e],sortOrder:t},i(a)})(t,e),fullPath:e.fullPath,defaultTitle:e.dimensionTitle,customTitle:o[e.fullPath],onUpdateTitle:s,onResetTitle:c})))))))},pt=({id:t,label:a,fullLabel:n,onDelete:r,onMoveUp:l,onMoveDown:i,isFirst:o,isLast:s,fullPath:c,defaultTitle:d,customTitle:u,onUpdateTitle:m,onResetTitle:p})=>{const[g,h]=e.useState(!1),[y,E]=e.useState(""),v=e.useRef(null),x=e.useRef(null),{attributes:b,listeners:w,setNodeRef:S,transform:C,transition:k,isDragging:D}=$.useSortable({id:t}),T={transform:F.CSS.Transform.toString(C),transition:k,opacity:D?.5:1,display:"flex",alignItems:"center",width:"100%"};e.useEffect(()=>{g&&v.current&&(v.current.focus(),v.current.select())},[g]),e.useEffect(()=>{const e=e=>{g&&x.current&&!x.current.contains(e.target)&&B()};if(g)return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[g]);const R=()=>{const e=y.trim();""!==e?(m(c,e),h(!1)):B()},B=()=>{h(!1),E("")},P=u||a,q=!!u;return J.default.createElement("div",$e({ref:S,style:T},b),J.default.createElement(f.Box,{ref:x,sx:{display:"flex",alignItems:"center",width:"100%",gap:1}},J.default.createElement(f.Box,$e({},w,{sx:{display:"flex",alignItems:"center",cursor:"grab","&:active":{cursor:"grabbing"}}}),J.default.createElement(Ce.default,{sx:{cursor:"grab"}})),g?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.TextField,{inputRef:v,value:y,onChange:e=>E(e.target.value),onKeyDown:e=>{"Enter"===e.key?R():"Escape"===e.key&&B()},size:"small",sx:{width:"200px"}}),J.default.createElement(f.Tooltip,{title:"Save",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:R,color:"primary","aria-label":"save title"},J.default.createElement(Re.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Cancel",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:B,"aria-label":"cancel edit"},J.default.createElement(Be.default,{fontSize:"small"}))),q&&J.default.createElement(f.Tooltip,{title:"Reset to default",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:()=>{p(c),h(!1),E("")},color:"warning","aria-label":"reset title"},J.default.createElement(Pe.default,{fontSize:"small"})))):J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Tooltip,{title:n,arrow:!0,placement:"top"},J.default.createElement(f.Chip,{label:P,onDelete:r,color:"secondary",variant:"outlined",sx:{fontWeight:q?"bold":"normal",fontStyle:q?"italic":"normal"}})),J.default.createElement(f.Tooltip,{title:"Edit title",arrow:!0,placement:"top"},J.default.createElement(f.IconButton,{size:"small",onClick:()=>{E(u||d),h(!0)},"aria-label":"edit title"},J.default.createElement(ye.default,{fontSize:"small"})))),!g&&J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Box,{sx:{flex:1}}),J.default.createElement(f.Box,{sx:{display:"flex",gap:.5}},J.default.createElement(f.IconButton,{size:"small",onClick:l,disabled:o,"aria-label":"move up"},J.default.createElement(ke.default,{fontSize:"small"})),J.default.createElement(f.IconButton,{size:"small",onClick:i,disabled:s,"aria-label":"move down"},J.default.createElement(De.default,{fontSize:"small"}))))))},gt=({providersData:t,rootProvider:a,savedMetrics:n=[],onSaveMetric:r,onRemoveMetric:l,onReorderMetrics:i,titleOverrides:o={},onUpdateTitle:s,onResetTitle:c,existingDimensions:d=[],existingFilters:u={}})=>{const[m,p]=e.useState(!1),[g,h]=e.useState([]),[y,E]=e.useState(""),v=z.useSensors(z.useSensor(z.PointerSensor),z.useSensor(z.KeyboardSensor,{coordinateGetter:$.sortableKeyboardCoordinates})),x=()=>{const e=a?0===g.length?a:g[g.length-1].targetKey:null;if(!e||!t||!t[e])return[];const r=t[e];if(!r.metrics)return[];const l=[t[a].default_alias];let i=a;g.forEach(e=>{const a=t[i];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&l.push(t.alias)}i=e.targetKey});const o=new Set(n.map(e=>e.fullPath)),s=r.metrics.map((t,a)=>{const n=`${l.join("_")}.${t.name}`,r=o.has(n);return{key:`${e}_${t.name}_${a}`,value:t.title||t.name,metricName:t.name,metric:t,disabled:r}});return s},b=()=>{p(!1),h([]),E("")},w=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")};return J.default.createElement("div",null,J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:2,marginBottom:2}},m?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Button,{variant:"outlined",onClick:b},"Cancel"),J.default.createElement(f.Button,{variant:"contained",onClick:()=>{if(!y)return;const e=x().find(e=>e.key===y);if(!e)return;const n=[],l=[a],i=[];let o=a;g.forEach(e=>{const a=t[o];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&(n.push(t),i.push(t.name))}l.push(e.targetKey),o=e.targetKey});const s=[t[a].default_alias];n.forEach(e=>{s.push(e.alias)});const c=`${s.join("_")}.${e.metricName}`,d={metric:e.metric,relations:n,providerPath:l,relationNames:i,metricName:e.metricName,metricTitle:e.value,fullPath:c};r(d),b()},disabled:!y},"Save Metric")):J.default.createElement(f.Button,{variant:"contained",onClick:()=>{p(!0),h([]),E("")}},"Add Metric")),m&&J.default.createElement(f.Paper,{sx:{padding:3,marginBottom:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Select Provider Path"),J.default.createElement(ut,{providersData:t,rootProvider:a,onSelectionChange:h,existingDimensions:d,existingMetrics:n,existingFilters:u}),J.default.createElement(f.Typography,{variant:"h6",sx:{marginTop:3,marginBottom:2}},"Select Metric"),J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:1}},J.default.createElement(Je,{items:x(),value:y,label:"Choose Metric",onChange:e=>{E(e.target.value)},sx:{width:"400px"}}),J.default.createElement(f.Tooltip,{title:"Add all available metrics",arrow:!0,placement:"top"},J.default.createElement("span",null,J.default.createElement(f.IconButton,{color:"primary",onClick:()=>{const e=x().filter(e=>!e.disabled);if(0===e.length)return;const n=[],l=[a],i=[];let o=a;g.forEach(e=>{const a=t[o];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&(n.push(t),i.push(t.name))}l.push(e.targetKey),o=e.targetKey});const s=[t[a].default_alias];n.forEach(e=>{s.push(e.alias)}),e.forEach(e=>{const t=`${s.join("_")}.${e.metricName}`,a={metric:e.metric,relations:n,providerPath:l,relationNames:i,metricName:e.metricName,metricTitle:e.value,fullPath:t};r(a)}),b()},disabled:0===x().filter(e=>!e.disabled).length,"aria-label":"add all metrics"},J.default.createElement(qe.default,null)))))),n.length>0&&J.default.createElement(f.Box,{sx:{marginTop:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Saved Metrics (Drag to reorder or use arrows)"),J.default.createElement(z.DndContext,{sensors:v,collisionDetection:z.closestCenter,onDragEnd:e=>{const{active:t,over:a}=e;if(a&&t.id!==a.id){const e=n.findIndex((e,a)=>a===t.id),r=n.findIndex((e,t)=>t===a.id),l=$.arrayMove(n,e,r);i(l)}}},J.default.createElement($.SortableContext,{items:n.map((e,t)=>t),strategy:$.verticalListSortingStrategy},J.default.createElement(f.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},n.map((e,t)=>J.default.createElement(pt,{key:t,id:t,label:e.metricTitle,fullLabel:`${w(e)} → ${e.metricTitle} (${e.fullPath})`,onDelete:()=>l(t),onMoveUp:()=>(e=>{if(e>0){const t=$.arrayMove(n,e,e-1);i(t)}})(t),onMoveDown:()=>(e=>{if(e<n.length-1){const t=$.arrayMove(n,e,e+1);i(t)}})(t),isFirst:0===t,isLast:t===n.length-1,fullPath:e.fullPath,defaultTitle:e.metricTitle,customTitle:o[e.fullPath],onUpdateTitle:s,onResetTitle:c})))))))},ht=({providersData:t,rootProvider:a,savedFilters:n={},onSaveFilter:r,onRemoveFilter:l,existingDimensions:i=[],existingMetrics:o=[],titleOverrides:s={},onUpdateTitle:c,onResetTitle:d})=>{const u=lt(),[m,p]=e.useState(!1),[g,h]=e.useState([]),[y,E]=e.useState(""),[v,x]=e.useState([]),[b,w]=e.useState([]),[S,C]=e.useState(!1),[k,D]=e.useState(null),[T,R]=e.useState(null),[B,P]=e.useState(null),[q,M]=e.useState(null),[z,$]=e.useState("");e.useEffect(()=>{E(""),x([]),w([]),R(null),P(null)},[g]);const F=e=>e&&("date"===e.type||"timestamp"===e.type),I=()=>{const e=a?0===g.length?a:g[g.length-1].targetKey:null;if(!e||!t||!t[e])return[];const n=t[e];if(!n.dimensions)return[];const r=[];return Object.keys(n.dimensions).forEach(t=>{const a=n.dimensions[t];Object.keys(a).forEach(n=>{const l=a[n];(e=>!!e.column&&/^[a-zA-Z0-9_.]+$/.test(e.column))(l)&&r.push({key:`${e}_${t}.${n}`,value:l.title||n,dimensionKey:n,alias:t,dimension:l})})}),r},A=()=>{p(!1),h([]),E(""),x([]),w([]),R(null),P(null),D(null)},O=()=>{D(null),x([]),w([]),R(null),P(null)},j=e=>{const t=z.trim();""!==t?(c(e,t),M(null),$("")):_()},_=()=>{M(null),$("")},N=async e=>{C(!0);try{const t={provider:a,doc:{query:{dimensions:[e],metrics:[],order_by:[{name:e}]}},parameters:u?.parameters||{base_currency:"EUR"}};console.log("Fetching filter values with payload:",t);const n=await Ke.runAdHocReport({report:t});console.log("Filter values results:",n);const r=(Array.isArray(n)?n:n.data||[]).map(t=>{let a=t[e];if(void 0===a){a=t[e.replace(/\./g,"_")]}if(void 0===a){const e=Object.keys(t);e.length>0&&(a=t[e[0]])}return{key:String(a),value:String(a)}});console.log("Transformed distinct values:",r),x(r)}catch(e){console.error("Error fetching filter values:",e),x([])}finally{C(!1)}},K=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")},U=Object.entries(n);return J.default.createElement("div",null,J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:2,marginBottom:2}},m?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Button,{variant:"outlined",onClick:A},"Cancel"),J.default.createElement(f.Button,{variant:"contained",onClick:()=>{const e=I().find(e=>e.key===y);if(!e)return;const n=F(e.dimension);if(n){if(!T&&!B)return}else if(0===b.length)return;if(!y)return;const l=[],i=[a],o=[];let s=a;g.forEach(e=>{const a=t[s];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&(l.push(t),o.push(t.name))}i.push(e.targetKey),s=e.targetKey});const c=[t[a].default_alias];l.forEach(e=>{c.push(e.alias)});const d=`${c.join("_")}.${e.dimensionKey}`;let u;n?(u={},T&&(u.gte=T.format("YYYY-MM-DD")),B&&(u.lte=B.format("YYYY-MM-DD"))):u=b;const m={dimension:e.dimension,relations:l,providerPath:i,relationNames:o,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:d,values:u};r(d,m),A()},disabled:(()=>{if(!y)return!0;const e=I().find(e=>e.key===y);if(!e)return!0;return F(e.dimension)?!T&&!B:0===b.length})()},"Save Filter")):J.default.createElement(f.Button,{variant:"contained",onClick:()=>{p(!0),h([]),E(""),x([]),w([]),R(null),P(null),D(null)}},"Add Filter")),m&&J.default.createElement(f.Paper,{sx:{padding:3,marginBottom:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Select Provider Path"),J.default.createElement(ut,{providersData:t,rootProvider:a,onSelectionChange:h,existingDimensions:i,existingMetrics:o,existingFilters:n}),J.default.createElement(f.Typography,{variant:"h6",sx:{marginTop:3,marginBottom:2}},"Select Dimension for Filter"),J.default.createElement(Je,{items:I(),value:y,label:"Choose Dimension",onChange:e=>{const n=e.target.value;if(E(n),w([]),R(null),P(null),n){const e=I().find(e=>e.key===n);if(e){if(!F(e.dimension)){const n=[];let r=a;g.forEach(e=>{const a=t[r];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&n.push(t)}r=e.targetKey});const l=[t[a].default_alias];n.forEach(e=>{l.push(e.alias)});const i=`${l.join("_")}.${e.dimensionKey}`;N(i)}}}else x([])},sx:{width:"400px"}}),y&&(()=>{const e=I().find(e=>e.key===y),t=e&&F(e.dimension);return J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Typography,{variant:"h6",sx:{marginTop:3,marginBottom:2}},t?"Select Date Range":"Select Filter Values"),t?J.default.createElement(Y.LocalizationProvider,{dateAdapter:H.AdapterDayjs},J.default.createElement(f.Box,{sx:{display:"flex",gap:2,width:"400px"}},J.default.createElement(W.DatePicker,{label:"From Date",value:T,onChange:e=>R(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}),J.default.createElement(W.DatePicker,{label:"To Date",value:B,onChange:e=>P(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}))):J.default.createElement(f.Box,{sx:{width:"400px"}},J.default.createElement(Ve,{items:v,selectedKeys:b,onChange:e=>w(e),label:"Choose Values",placeholder:"Select one or more values...",loading:S,helperText:b.length>0?`${b.length} value(s) selected`:"Select at least one value"})))})()),U.length>0&&J.default.createElement(f.Box,{sx:{marginTop:3}},J.default.createElement(f.Typography,{variant:"h6",sx:{marginBottom:2}},"Saved Filters"),J.default.createElement(f.Box,{sx:{display:"flex",flexDirection:"column",gap:2}},U.map(([e,t])=>{const a=F(t.dimension),i=k===e,o=q===e;let c,u,m;a&&t.values&&"object"==typeof t.values&&!Array.isArray(t.values)?(u=t.values.gte&&t.values.lte?`${t.values.gte} to ${t.values.lte}`:t.values.gte?`From ${t.values.gte}`:t.values.lte?`Until ${t.values.lte}`:"No dates",m="📅"):(c=t.values?.length||0,u=t.values?.join(", ")||"No values",m=c);const g=s[e]||t.dimensionTitle,h=!!s[e];return J.default.createElement(f.Box,{key:e},J.default.createElement(f.Box,{sx:{display:"flex",alignItems:"center",gap:1,marginBottom:i?2:0}},o?J.default.createElement(J.default.Fragment,null,J.default.createElement(f.TextField,{value:z,onChange:e=>$(e.target.value),onKeyDown:t=>((e,t)=>{"Enter"===e.key?j(t):"Escape"===e.key&&_()})(t,e),size:"small",autoFocus:!0,placeholder:"Enter custom title",sx:{width:"300px"}}),J.default.createElement(f.Tooltip,{title:"Save",arrow:!0},J.default.createElement(f.IconButton,{size:"small",onClick:()=>j(e),color:"primary"},J.default.createElement(Re.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Cancel",arrow:!0},J.default.createElement(f.IconButton,{size:"small",onClick:_,color:"default"},J.default.createElement(Be.default,{fontSize:"small"}))),h&&J.default.createElement(f.Tooltip,{title:"Reset to default",arrow:!0},J.default.createElement(f.IconButton,{size:"small",onClick:()=>(e=>{d(e),M(null),$("")})(e),color:"warning"},J.default.createElement(Pe.default,{fontSize:"small"})))):J.default.createElement(J.default.Fragment,null,J.default.createElement(f.Tooltip,{title:J.default.createElement("div",null,J.default.createElement("div",null,J.default.createElement("strong",null,"Path:")," ",K(t)," → ",t.dimensionTitle),J.default.createElement("div",null,J.default.createElement("strong",null,"Full Path:")," ",e),J.default.createElement("div",null,J.default.createElement("strong",null,a?"Date Range":`Values (${c})`,":")," ",u)),arrow:!0,placement:"top"},J.default.createElement(f.Badge,{badgeContent:m,color:"secondary"},J.default.createElement(f.Chip,{label:g,onDelete:()=>l(e),color:"secondary",variant:"outlined",sx:{fontWeight:h?"bold":"normal",fontStyle:h?"italic":"normal"}}))),J.default.createElement(f.Tooltip,{title:"Rename filter",arrow:!0},J.default.createElement(f.IconButton,{size:"small",onClick:()=>((e,t)=>{M(e),$(s[e]||t||"")})(e,t.dimensionTitle),color:"primary",disabled:i},J.default.createElement(ye.default,{fontSize:"small"}))),J.default.createElement(f.Tooltip,{title:"Edit filter values",arrow:!0},J.default.createElement(f.IconButton,{size:"small",onClick:()=>(async(e,t)=>{p(!1),D(e),F(t.dimension)?t.values&&"object"==typeof t.values&&!Array.isArray(t.values)&&(R(t.values.gte?ze.default(t.values.gte):null),P(t.values.lte?ze.default(t.values.lte):null)):(w(t.values||[]),await N(e))})(e,t),color:"primary",disabled:i},J.default.createElement(Me.default,{fontSize:"small"}))))),i&&J.default.createElement(f.Paper,{sx:{padding:2,marginLeft:2}},J.default.createElement(f.Typography,{variant:"subtitle2",sx:{marginBottom:1}},"Edit Filter ",a?"Date Range":"Values"," for: ",t.dimensionTitle),a?J.default.createElement(Y.LocalizationProvider,{dateAdapter:H.AdapterDayjs},J.default.createElement(f.Box,{sx:{display:"flex",gap:2,width:"400px",marginBottom:2}},J.default.createElement(W.DatePicker,{label:"From Date",value:T,onChange:e=>R(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}),J.default.createElement(W.DatePicker,{label:"To Date",value:B,onChange:e=>P(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}))):J.default.createElement(f.Box,{sx:{width:"400px",marginBottom:2}},J.default.createElement(Ve,{items:v,selectedKeys:b,onChange:e=>w(e),label:"Choose Values",placeholder:"Select one or more values...",loading:S,helperText:b.length>0?`${b.length} value(s) selected`:"Select at least one value"})),J.default.createElement(f.Box,{sx:{display:"flex",gap:1}},J.default.createElement(f.Button,{variant:"outlined",size:"small",onClick:O},"Cancel"),J.default.createElement(f.Button,{variant:"contained",size:"small",onClick:()=>(e=>{const t=n[e];if(F(t.dimension)){if(!T&&!B)return;const a={};T&&(a.gte=T.format("YYYY-MM-DD")),B&&(a.lte=B.format("YYYY-MM-DD"));const n={...t,values:a};r(e,n)}else{if(0===b.length)return;const a={...t,values:b};r(e,a)}D(null),x([]),w([]),R(null),P(null)})(e),disabled:a?!T&&!B:0===b.length},"Save Changes"))))}))))},yt=({reportData:t,dimensions:a,metrics:n,loading:r,onPageChange:l,totalRows:i=0,titleOverrides:o={dimensions:{},metrics:{}}})=>{const[s,c]=e.useState({page:0,pageSize:50}),d=J.default.useMemo(()=>{const e=[];return a.forEach(t=>{let a,n;if(t.relations&&t.relations.length>0){const e=t.fullPath.split("."),n=e[0],r=e[1],l=n.split("_");l.shift();const i=l.join("_");a=i?`${i}_${r}`:r}else a=t.fullPath.replace(".","_");n=o.dimensions[t.fullPath]||t.dimensionTitle||a,e.push({field:a,headerName:n,flex:1,minWidth:150})}),n.forEach(t=>{const a=t.metric;let n,r;if(t.relations&&t.relations.length>0){const e=t.fullPath.split("."),a=e[0],r=e[1],l=a.split("_");l.shift();const i=l.join("_");n=i?`${i}_${r}`:r}else n=t.metricName;r=o.metrics[t.fullPath]||t.metricTitle||n,e.push({field:n,headerName:r,flex:1,minWidth:150,type:"integer"===a?.type||"currency"===a?.type?"number":"string",valueFormatter:e=>{if(null==e)return"";if(a?.format){const t=X.default(e).format(a.format);return a?.prefix?`${a.prefix} ${t}`:t}return e}})}),e},[a,n,o]),u=J.default.useMemo(()=>t&&Array.isArray(t)?t.map((e,t)=>({id:t,...e})):[],[t]);return r?J.default.createElement(f.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},J.default.createElement(f.CircularProgress,null)):t&&0!==t.length?J.default.createElement(f.Box,{sx:{height:600,width:"100%"}},J.default.createElement(C.DataGrid,{rows:u,columns:d,paginationModel:s,onPaginationModelChange:e=>{c(e),l&&e.page!==s.page&&l(e.page,e.pageSize)},pageSizeOptions:[10,25,50,100],paginationMode:"server",rowCount:i||u.length,loading:r,disableRowSelectionOnClick:!0,sx:{"& .MuiDataGrid-cell":{padding:"8px"},"& .MuiDataGrid-columnHeader":{backgroundColor:"#f5f5f5",fontWeight:"bold"}}})):J.default.createElement(f.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},J.default.createElement(f.Typography,{variant:"body1",color:"textSecondary"},"No data available. Run a report to see results."))};function Et({children:e,value:t,index:a}){return J.default.createElement("div",{role:"tabpanel",hidden:t!==a,id:`report-tabpanel-${a}`,"aria-labelledby":`report-tab-${a}`},t===a&&J.default.createElement(f.Box,{sx:{py:3}},e))}const vt=({reportDefinitionId:t,cloneData:a,autoRun:n,onBackToList:r})=>{const l=st(),i=lt(),[o,s]=e.useState(null),[c,d]=e.useState(""),[u,m]=e.useState(""),[p,g]=e.useState({dimensions:[],metrics:[],filters:{}}),[h,y]=e.useState({dimensions:{},metrics:{},filters:{}}),[E,v]=e.useState(null),[x,b]=e.useState(!1),[w,S]=e.useState(0),[C,k]=e.useState(0),[D,T]=e.useState(50),[R,B]=e.useState(0),[P,q]=e.useState(!1),[M,z]=e.useState(!1);e.useEffect(()=>{(async()=>{const e=await Ke.getProviders();console.log({providers:e}),s(e)})()},[]),e.useEffect(()=>{t&&o&&I(t)},[t,o]),e.useEffect(()=>{a&&o&&A(a)},[a,o]),e.useEffect(()=>{n&&M&&c&&p.dimensions.length>0&&_()},[n,M]);const $=(e,t,a)=>{try{const[n,r]=e.split("."),l=n.split("_");let i=a;const o=[],s=[a],c=[];for(let e=1;e<l.length;e++){const a=l[e],n=t[i];if(!n||!n.relations)return console.warn(`Provider ${i} not found or has no relations`),null;const r=n.relations.find(e=>e.alias===a);if(!r)return console.warn(`Relation with alias ${a} not found in provider ${i}`),null;o.push(r),c.push(r.name),i=r.target,s.push(i)}const d=t[i];if(!d)return console.warn(`Final provider ${i} not found`),null;const u=d.default_alias;if(!d.dimensions||!d.dimensions[u])return console.warn(`Dimensions not found for alias ${u} in provider ${i}`),null;const m=d.dimensions[u][r];return m?{dimension:m,relations:o,providerPath:s,relationNames:c,dimensionKey:r,dimensionTitle:m.title||r,fullPath:e}:(console.warn(`Dimension ${r} not found in provider ${i}, alias ${u}`),null)}catch(t){return console.warn(`Error reconstructing dimension from path ${e}:`,t),null}},F=(e,t,a)=>{try{const[n,r]=e.split("."),l=n.split("_");let i=a;const o=[],s=[a],c=[];for(let e=1;e<l.length;e++){const a=l[e],n=t[i];if(!n||!n.relations)return console.warn(`Provider ${i} not found or has no relations`),null;const r=n.relations.find(e=>e.alias===a);if(!r)return console.warn(`Relation with alias ${a} not found in provider ${i}`),null;o.push(r),c.push(r.name),i=r.target,s.push(i)}const d=t[i];if(!d)return console.warn(`Final provider ${i} not found`),null;if(!d.metrics)return console.warn(`Metrics not found in provider ${i}`),null;const u=d.metrics.find(e=>e.name===r);return u?{metric:u,relations:o,providerPath:s,relationNames:c,metricName:r,metricTitle:u.title||r,fullPath:e}:(console.warn(`Metric ${r} not found in provider ${i}`),null)}catch(t){return console.warn(`Error reconstructing metric from path ${e}:`,t),null}},I=async e=>{try{console.log("Loading report definition:",e);const t=await Ke.getReportDefinition({id:e});console.log("Loaded report definition:",t),d(t.provider),m(t.title||"");const a=[],n={};if(t.definition?.doc?.query?.order_by)for(const e of t.definition.doc.query.order_by)!0===e.desc?n[e.name]="desc":n[e.name]="asc";if(t.definition?.doc?.query?.dimensions)for(const e of t.definition.doc.query.dimensions){const r=$(e,o,t.provider);r&&(r.sortOrder=n[e]||null,a.push(r))}const r=[];if(t.definition?.doc?.query?.metrics)for(const e of t.definition.doc.query.metrics){const a=F(e,o,t.provider);a&&r.push(a)}const l={dimensions:{},metrics:{},filters:{}};t.definition?.doc?.query?.titles&&(t.definition.doc.query.titles.dimensions&&(l.dimensions=t.definition.doc.query.titles.dimensions),t.definition.doc.query.titles.metrics&&(l.metrics=t.definition.doc.query.titles.metrics),t.definition.doc.query.titles.filters&&(l.filters=t.definition.doc.query.titles.filters));const i={};if(t.definition?.doc?.query?.filter){const e=t.definition.doc.query.filter;(e.and||e.or||[]).forEach(e=>{const[a,n]=Object.entries(e)[0],r=$(a,o,t.provider);r&&(i[a]={...r,values:n})})}g({dimensions:a,metrics:r,filters:i}),y(l),z(!0),console.log("Reconstructed report:",{dimensions:a,metrics:r,filters:i,titleOverrides:l})}catch(e){console.error("Error loading report definition:",e),l.error("Error loading report definition: "+(e.message||"Unknown error"))}},A=e=>{try{console.log("Loading cloned report:",e),d(e.provider),m(e.title||"");const t=[],a={};if(e.definition?.doc?.query?.order_by)for(const t of e.definition.doc.query.order_by)!0===t.desc?a[t.name]="desc":a[t.name]="asc";if(e.definition?.doc?.query?.dimensions)for(const n of e.definition.doc.query.dimensions){const r=$(n,o,e.provider);r&&(r.sortOrder=a[n]||null,t.push(r))}const n=[];if(e.definition?.doc?.query?.metrics)for(const t of e.definition.doc.query.metrics){const a=F(t,o,e.provider);a&&n.push(a)}const r={dimensions:{},metrics:{},filters:{}};e.definition?.doc?.query?.titles&&(e.definition.doc.query.titles.dimensions&&(r.dimensions=e.definition.doc.query.titles.dimensions),e.definition.doc.query.titles.metrics&&(r.metrics=e.definition.doc.query.titles.metrics),e.definition.doc.query.titles.filters&&(r.filters=e.definition.doc.query.titles.filters));const l={};if(e.definition?.doc?.query?.filter){const t=e.definition.doc.query.filter;(t.and||t.or||[]).forEach(t=>{const[a,n]=Object.entries(t)[0],r=$(a,o,e.provider);r&&(l[a]={...r,values:n})})}g({dimensions:t,metrics:n,filters:l}),y(r),console.log("Loaded cloned report:",{dimensions:t,metrics:n,filters:l,titleOverrides:r})}catch(e){console.error("Error loading cloned report:",e),l.error("Error loading cloned report: "+(e.message||"Unknown error"))}},O=(e=0,t=50)=>{const a=p.dimensions.map(e=>{const t={name:e.fullPath};return"desc"===e.sortOrder&&(t.desc=!0),t}),n=[];p.filters&&Object.keys(p.filters).length>0&&Object.entries(p.filters).forEach(([e,t])=>{t.values&&(Array.isArray(t.values)?t.values.length>0&&n.push({[e]:t.values}):"object"==typeof t.values&&n.push({[e]:t.values}))});const r=n.length>0?{and:n}:null,l={};Object.keys(h.dimensions).length>0&&(l.dimensions=h.dimensions),Object.keys(h.metrics).length>0&&(l.metrics=h.metrics),Object.keys(h.filters).length>0&&(l.filters=h.filters);const o={dimensions:p.dimensions.map(e=>e.fullPath),metrics:p.metrics.map(e=>e.fullPath),order_by:a,limit:t,offset:e*t};Object.keys(l).length>0&&(o.titles=l),r&&(o.filter=r);return{provider:c,doc:{query:o},parameters:i?.parameters||{base_currency:"EUR"}}},j=async(e,t)=>{try{b(!0);const a=O(e,t);console.log("Running report with:",a);const n=await Ke.runAdHocReport({report:a});console.log("Report result:",n),v(n),n&&n.length<t?S(e*t+n.length):S((e+2)*t)}catch(e){console.error("Error running report:",e),l.error("Error running report: "+(e.message||"Unknown error")),v(null)}finally{b(!1)}},_=async()=>{k(0),await j(0,D),B(3)},N=c,K=c&&u.trim()&&(p.dimensions.length>0||p.metrics.length>0);return J.default.createElement(f.Box,{sx:{p:3}},J.default.createElement(f.Box,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:2}},J.default.createElement("h1",null,t?"Edit Report":"Create New Report"),r&&J.default.createElement(f.Button,{variant:"outlined",startIcon:J.default.createElement(be.default,null),onClick:r},"Back to List")),J.default.createElement(f.Box,{sx:{mt:2,display:"flex",gap:2,alignItems:"flex-start",flexWrap:"wrap"}},J.default.createElement(f.TextField,{label:"Report Title",value:u,onChange:e=>m(e.target.value),placeholder:"Enter report title",sx:{width:"300px"},size:"small"}),J.default.createElement(Je,{items:o?Object.keys(o).map(e=>({key:e,value:o[e].name||e})):[],value:c,label:"Select Root Provider",onChange:e=>{d(e.target.value),g({dimensions:[],metrics:[],filters:{}}),y({dimensions:{},metrics:{},filters:{}}),console.log("Selected root provider:",e.target.value)},sx:{width:"300px"},disabled:!!t}),J.default.createElement(f.Button,{variant:"contained",onClick:_,disabled:!N,sx:{height:"40px"}},"Run Report"),J.default.createElement(f.Button,{variant:"contained",color:"secondary",startIcon:J.default.createElement(Se.default,null),onClick:async()=>{try{b(!0);const e=O();console.log("Downloading report with:",e);const t=(new Date).toISOString().split("T")[0],a=`${(u||"report").replace(/[^a-z0-9]/gi,"_").toLowerCase()}_${t}.csv`;await Ke.downloadAdHocReport({report:e,filename:a}),l.success("Report downloaded successfully!")}catch(e){console.error("Error downloading report:",e),l.error("Error downloading report: "+(e.message||"Unknown error"))}finally{b(!1)}},disabled:!N||x,sx:{height:"40px"}},"Download CSV"),J.default.createElement(f.Button,{variant:"contained",color:"success",startIcon:J.default.createElement(we.default,null),onClick:async()=>{if(c)if(u.trim())if(0!==p.dimensions.length||0!==p.metrics.length)try{q(!0);const e=p.dimensions.map(e=>{const t={name:e.fullPath};return"desc"===e.sortOrder&&(t.desc=!0),t}),a={};Object.keys(h.dimensions).length>0&&(a.dimensions=h.dimensions),Object.keys(h.metrics).length>0&&(a.metrics=h.metrics),Object.keys(h.filters).length>0&&(a.filters=h.filters);const n={dimensions:p.dimensions.map(e=>e.fullPath),metrics:p.metrics.map(e=>e.fullPath),order_by:e};if(Object.keys(a).length>0&&(n.titles=a),Object.keys(p.filters).length>0){const e=[];Object.entries(p.filters).forEach(([t,a])=>{a.values&&(Array.isArray(a.values)?a.values.length>0&&e.push({[t]:a.values}):"object"==typeof a.values&&e.push({[t]:a.values}))}),e.length>0&&(n.filter={and:e})}const i={query:n},o={provider:c,title:u.trim(),definition:{provider:c,doc:i,parameters:{base_currency:"EUR"}}};console.log("Saving report definition:",o),t?(await Ke.updateReportDefinition({id:t,reportDefinition:o}),l.success("Report definition updated successfully!")):(await Ke.createReportDefinition({reportDefinition:o}),l.success("Report definition created successfully!")),r&&r()}catch(e){console.error("Error saving report definition:",e),l.error("Error saving report definition: "+(e.message||"Unknown error"))}finally{q(!1)}else l.warning("Please add at least one dimension or metric");else l.warning("Please enter a report title");else l.warning("Please select a provider first")},disabled:!K||P,sx:{height:"40px"}},P?"Saving...":t?"Update Report":"Save Report")),c&&J.default.createElement(f.Box,{sx:{mt:4}},J.default.createElement(f.Box,{sx:{borderBottom:1,borderColor:"divider"}},J.default.createElement(f.Tabs,{value:R,onChange:(e,t)=>{B(t)},"aria-label":"report builder tabs"},J.default.createElement(f.Tab,{label:J.default.createElement(f.Badge,{badgeContent:p.dimensions.length,color:"primary"},J.default.createElement("span",{style:{marginRight:p.dimensions.length>0?"12px":"0"}},"Dimensions")),id:"report-tab-0","aria-controls":"report-tabpanel-0"}),J.default.createElement(f.Tab,{label:J.default.createElement(f.Badge,{badgeContent:p.metrics.length,color:"primary"},J.default.createElement("span",{style:{marginRight:p.metrics.length>0?"12px":"0"}},"Metrics")),id:"report-tab-1","aria-controls":"report-tabpanel-1"}),J.default.createElement(f.Tab,{label:J.default.createElement(f.Badge,{badgeContent:Object.keys(p.filters).length,color:"secondary"},J.default.createElement("span",{style:{marginRight:Object.keys(p.filters).length>0?"12px":"0"}},"Filters")),id:"report-tab-2","aria-controls":"report-tabpanel-2"}),J.default.createElement(f.Tab,{label:E?"Results":"Results (Run report first)",id:"report-tab-3","aria-controls":"report-tabpanel-3",disabled:!E}))),J.default.createElement(Et,{value:R,index:0},J.default.createElement(ft,{providersData:o,rootProvider:c,savedDimensions:p.dimensions,onSaveDimension:e=>{g(t=>{const a={...t,dimensions:[...t.dimensions,e]};return console.log("Dimension saved:",e),console.log("Complete report:",a),a})},onRemoveDimension:e=>{g(t=>({...t,dimensions:t.dimensions.filter((t,a)=>a!==e)}))},onReorderDimensions:e=>{g(t=>({...t,dimensions:e}))},titleOverrides:h.dimensions,onUpdateTitle:(e,t)=>{y(a=>({...a,dimensions:{...a.dimensions,[e]:t}}))},onResetTitle:e=>{y(t=>{const a={...t.dimensions};return delete a[e],{...t,dimensions:a}})},existingMetrics:p.metrics,existingFilters:p.filters})),J.default.createElement(Et,{value:R,index:1},J.default.createElement(gt,{providersData:o,rootProvider:c,savedMetrics:p.metrics,onSaveMetric:e=>{g(t=>{const a={...t,metrics:[...t.metrics,e]};return console.log("Metric saved:",e),console.log("Complete report:",a),a})},onRemoveMetric:e=>{g(t=>({...t,metrics:t.metrics.filter((t,a)=>a!==e)}))},onReorderMetrics:e=>{g(t=>({...t,metrics:e}))},titleOverrides:h.metrics,onUpdateTitle:(e,t)=>{y(a=>({...a,metrics:{...a.metrics,[e]:t}}))},onResetTitle:e=>{y(t=>{const a={...t.metrics};return delete a[e],{...t,metrics:a}})},existingDimensions:p.dimensions,existingFilters:p.filters})),J.default.createElement(Et,{value:R,index:2},J.default.createElement(ht,{providersData:o,rootProvider:c,savedFilters:p.filters,existingDimensions:p.dimensions,existingMetrics:p.metrics,onSaveFilter:(e,t)=>{g(a=>{const n={...a,filters:{...a.filters,[e]:t}};return console.log("Filter saved:",{fullPath:e,filterData:t}),console.log("Complete report:",n),n})},onRemoveFilter:e=>{g(t=>{const a={...t.filters};return delete a[e],{...t,filters:a}})},titleOverrides:h.filters,onUpdateTitle:(e,t)=>{y(a=>({...a,filters:{...a.filters,[e]:t}}))},onResetTitle:e=>{y(t=>{const a={...t.filters};return delete a[e],{...t,filters:a}})}})),J.default.createElement(Et,{value:R,index:3},E&&J.default.createElement(yt,{reportData:E,dimensions:p.dimensions,metrics:p.metrics,loading:x,onPageChange:async(e,t)=>{k(e),t!==D&&T(t),await j(e,t)},totalRows:w,titleOverrides:h}))))},xt=()=>{const[t,a]=e.useState("list"),[n,r]=e.useState(null),[l,i]=e.useState(null),[o,s]=e.useState(!1),[c,d]=e.useState(0),u=e=>{r(e),i(null),s(!1),a("builder")},m=()=>{r(null),i(null),s(!1),a("builder")},f=e=>{r(e),i(null),s(!0),a("builder")},p=e=>{r(null),i(e),s(!1),a("builder")};return"list"===t?J.default.createElement(dt,{onSelectReport:u,onAddNew:m,onCloneReport:p,onRunReport:f,refreshTrigger:c}):J.default.createElement(vt,{reportDefinitionId:n,cloneData:l,autoRun:o,onBackToList:()=>{r(null),i(null),s(!1),a("list"),d(e=>e+1)}})};var bt={Chart:at,Dashboard:function({id:t="sample_dashboard",api:a,params:n}){const r=lt(),l=a||r?.api||{},i=n||r?.parameters||{},[o,s]=J.default.useState(),[c]=J.default.useState(),[d,u]=J.default.useState([]),m=J.default.useRef({}),f=et();tt(f),console.log({rows:d},{dashboard:o},{schema:c},{params:i}),e.useEffect(()=>{Ke.setBaseUrl(l.base_url),Ke.setToken(l.token)},[l]);const p=async e=>{const t=e?.doc?.rows||[],a=[];for(let e=0;e<t.length;e++){const n=t[e];n.columns?.forEach(e=>{if(e.override?.filter?.length){const t={};e.override.filter.forEach(e=>{e.hasOwnProperty("value")&&(t[e.field]=[e.value])}),e.filter=t}}),a.push(n)}u(a)};return J.default.useEffect(()=>{t&&(async()=>{Ke.setBaseUrl(l.base_url),Ke.setToken(l.token),await Ke.loadDashboardMeta({dashboardId:t});const e=await Ke.getDashboard({id:t});m.current[e?.id]=e,s(e),await p(e)})().catch(e=>console.error(e.message))},[t]),J.default.createElement(ge.default,{maxWidth:!1,disableGutters:!0},J.default.createElement(pe.default,{container:!0,spacing:3},d?.map((e,t)=>{const a=(e=>0===e?12:12/e)(e.columns.length);return J.default.createElement(J.default.Fragment,{key:t},1===t?J.default.createElement(pe.default,{item:!0,xs:12},J.default.createElement(pe.default,{container:!0,spacing:3},e.columns.map((e,t)=>J.default.createElement(pe.default,{key:t,item:!0,xs:12,md:a},J.default.createElement(at,{api:l,cache:m.current,id:e.id,dashboard:o,schema:c,title:e.title,filter:e.filter,params:i}))))):e.columns.map((e,t)=>J.default.createElement(pe.default,{key:t,item:!0,xs:12,md:a},J.default.createElement(at,{api:l,cache:m.current,id:e.id,dashboard:o,schema:c,title:e.title,filter:e.filter,params:i}))))})))},ReportApp:({params:t,api:a})=>(Ke._initialized||(Ke.setBaseUrl(a.base_url),Ke.setToken(a.token),Ke._initialized=!0),e.useEffect(()=>{Ke.setBaseUrl(a.base_url),Ke.setToken(a.token)},[a]),J.default.createElement(ot,null,J.default.createElement(rt,{defaultParameters:t,defaultApi:a},J.default.createElement(xt,null))))};exports.default=bt;
|
|
@@ -5176,12 +5176,25 @@ const ReportDefinitionsManager = () => {
|
|
|
5176
5176
|
};
|
|
5177
5177
|
|
|
5178
5178
|
const ReportApp = ({
|
|
5179
|
-
|
|
5180
|
-
|
|
5179
|
+
params,
|
|
5180
|
+
api
|
|
5181
5181
|
}) => {
|
|
5182
|
+
// Set API configuration initially (synchronously before first render)
|
|
5183
|
+
// This ensures API is ready before child components mount
|
|
5184
|
+
if (!Api._initialized) {
|
|
5185
|
+
Api.setBaseUrl(api.base_url);
|
|
5186
|
+
Api.setToken(api.token);
|
|
5187
|
+
Api._initialized = true;
|
|
5188
|
+
}
|
|
5189
|
+
|
|
5190
|
+
// Update API configuration when apiDefaults change
|
|
5191
|
+
useEffect(() => {
|
|
5192
|
+
Api.setBaseUrl(api.base_url);
|
|
5193
|
+
Api.setToken(api.token);
|
|
5194
|
+
}, [api]);
|
|
5182
5195
|
return /*#__PURE__*/React__default.createElement(NotifyProvider, null, /*#__PURE__*/React__default.createElement(ReportingProvider, {
|
|
5183
|
-
defaultParameters:
|
|
5184
|
-
defaultApi:
|
|
5196
|
+
defaultParameters: params,
|
|
5197
|
+
defaultApi: api
|
|
5185
5198
|
}, /*#__PURE__*/React__default.createElement(ReportDefinitionsManager, null)));
|
|
5186
5199
|
};
|
|
5187
5200
|
|