@bygd/nc-report-ui 0.1.27 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/default/cjs/index.cjs +1 -1
- package/dist/default/esm/index.js +412 -58
- package/package.json +1 -1
|
@@ -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"),r=require("@material-ui/core"),n=require("react-google-charts"),o=require("numeral"),l=require("axios"),i=require("@material-ui/core/Typography"),s=require("nunjucks"),d=require("@material-ui/core/FormControl"),c=require("@material-ui/core/Select"),u=require("@material-ui/core/MenuItem"),f=require("react-intersection-observer"),m=require("@mui/material"),p=require("@mui/icons-material/CheckBoxOutlineBlank"),g=require("@mui/icons-material/CheckBox"),h=require("@mui/material/Box"),y=require("@mui/material/MenuItem"),x=require("@mui/material/FormControl"),b=require("@mui/material/Select"),E=require("eventemitter3"),v=require("@material-ui/core/Grid"),w=require("@material-ui/core/Container"),S=require("@mui/x-data-grid"),C=require("@mui/icons-material/Add"),k=require("@mui/icons-material/Edit"),R=require("@mui/icons-material/ContentCopy"),T=require("@mui/icons-material/Delete"),D=require("@mui/icons-material/PlayArrow"),B=require("@mui/icons-material/Restore"),z=require("@mui/icons-material/ArrowBack"),P=require("@mui/icons-material/Save"),F=require("@mui/icons-material/Download"),M=require("@dnd-kit/core"),q=require("@dnd-kit/sortable"),I=require("@dnd-kit/utilities"),$=require("@mui/icons-material/DragIndicator"),j=require("@mui/icons-material/ArrowUpward"),A=require("@mui/icons-material/ArrowDownward"),O=require("@mui/icons-material/Sort"),_=require("@mui/icons-material/Check"),W=require("@mui/icons-material/Close"),N=require("@mui/icons-material/RestartAlt"),K=require("@mui/icons-material/PlaylistAdd"),U=require("@mui/icons-material/FilterAlt"),L=require("@mui/x-date-pickers/LocalizationProvider"),Y=require("@mui/x-date-pickers/DatePicker"),G=require("@mui/x-date-pickers/AdapterDayjs"),H=require("dayjs"),V=require("@mui/material/styles");function Z(e){return e&&e.__esModule?e:{default:e}}function J(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(a){if("default"!==a){var r=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,r.get?r:{enumerable:!0,get:function(){return e[a]}})}}),t.default=e,Object.freeze(t)}var Q=J(e),X=Z(t),ee=Z(o),te=Z(l),ae=Z(i),re=Z(s),ne=Z(d),oe=Z(c),le=Z(u),ie=Z(p),se=Z(g),de=Z(h),ce=Z(y),ue=Z(x),fe=Z(b),me=Z(E),pe=Z(v),ge=Z(w),he=Z(C),ye=Z(k),xe=Z(R),be=Z(T),Ee=Z(D),ve=Z(B),we=Z(z),Se=Z(P),Ce=Z(F),ke=Z($),Re=Z(j),Te=Z(A),De=Z(O),Be=Z(_),ze=Z(W),Pe=Z(N),Fe=Z(K),Me=Z(U),qe=Z(H);function Ie(){return Ie=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var r in a)({}).hasOwnProperty.call(a,r)&&(e[r]=a[r])}return e},Ie.apply(null,arguments)}const $e=a.makeStyles(e=>({root:{width:"100%","& > * + *":{marginTop:e.spacing(2)}}}));function je(e){const t=$e();return Q.default.createElement("div",Ie({className:t.root},e),Q.default.createElement(r.CircularProgress,{style:{color:"rgb(70, 134, 128)"},size:25}))}function Ae(e,t,a="array"){const r=e.columns,n=[...t.doc.metrics,...t.doc.dimensions].reduce((e,t)=>(e[t.name]=t,e),{});return e=>{const t="array"===a?[]:{};return r.reduce((t,r)=>{const o=e[r.name],l=n[r.name];let i=o;return i="timestamp"===l.type?new Date(o):l.format?l.format&&l.prefix?{v:+o,f:l.prefix+" "+ee.default(o).format(l.format)}:l.format?{v:+o,f:ee.default(o).format(l.format)}:o:o,"array"===a?t.push(i):t[r.name]=i?.f||i,t},t)}}const Oe="https://report-api.netcapital.pro",_e=te.default.create({baseURL:Oe,headers:{"Content-Type":"application/json"}}),We={},Ne=()=>{const e=Object.keys(We);return e.length>0?e[0]:null},Ke={setBaseUrl(e){_e.defaults.baseURL=e||Oe},setToken(e){e&&(_e.defaults.headers.common.Authorization=`Bearer ${e}`)},loadDashboardMeta:async({dashboardId:e})=>{const{data:t}=await _e.get(`/dashboard-meta/${e}`);return We[e]={dashboards:t.dashboards||{},charts:t.charts||{},reports:t.reports||{},reportMetadata:t.reportMetadata||{},dateRanges:t.dateRanges||[]},We[e]},getDashboard:async({id:e,dashboardId:t})=>{const a=t||Ne();if(a&&We[a]?.dashboards?.[e])return We[a].dashboards[e];const{data:r}=await _e.get(`/entity/dashboards/${e}`);return r},getChart:async({id:e,dashboardId:t})=>{const a=t||Ne();if(a&&We[a]?.charts?.[e])return We[a].charts[e];const{data:r}=await _e.get(`/entity/charts/${e}`);return r},getReport:async({id:e,dashboardId:t})=>{const a=t||Ne();if(a&&We[a]?.reports?.[e])return We[a].reports[e];const{data:r}=await _e.get(`/entity/reports/${e}`);return r},getProviders:async()=>{const{data:e}=await _e.get("/entity/providers");return e},getReportSchema:async({id:e,dashboardId:t,query:a={}})=>{const r=t||Ne();if(r&&We[r]?.reportMetadata?.[e])return We[r].reportMetadata[e];const{data:n}=await _e.post(`/reports/${e}/metadata`,a);return n},runReport:async({id:e,query:t={}})=>{const{data:a}=await _e.post(`/reports/${e}/run`,t);return a},runAdHocReport:async({report:e})=>{const{data:t}=await _e.post("/report-build/run",e);return t},downloadAdHocReport:async({report:e,filename:t})=>{const a=await _e.post("/report-build/run?download=csv",e,{responseType:"blob"}),r=window.URL.createObjectURL(new Blob([a.data])),n=document.createElement("a");n.href=r;let o=t||"report.csv";if(!t){const e=a.headers["content-disposition"];if(e){const t=e.match(/filename="?(.+)"?/i);t&&t[1]&&(o=t[1])}}n.setAttribute("download",o),document.body.appendChild(n),n.click(),n.remove(),window.URL.revokeObjectURL(r)},getDateRanges:async({dashboardId:e}={})=>{const t=e||Ne();if(t&&We[t]?.dateRanges)return We[t].dateRanges;const{data:a}=await _e.get("/globals/date-ranges");return a},getReportDefinitions:async()=>{const{data:e}=await _e.get("/report-definitions");return e},getReportDefinition:async({id:e})=>{const{data:t}=await _e.get(`/report-definitions/${e}`);return t},createReportDefinition:async({reportDefinition:e})=>{const{data:t}=await _e.post("/report-definitions",e);return t},updateReportDefinition:async({id:e,reportDefinition:t})=>{const{data:a}=await _e.put(`/report-definitions/${e}`,t);return a},deleteReportDefinition:async({id:e})=>{const{data:t}=await _e.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:r,report:o,schema:l,dashboard:i,query:s}){const[d,c]=Q.default.useState([]),u=Ue(),[f,m]=Q.default.useState([]);e.useEffect(()=>{(async()=>{const e=await Ke.getDateRanges();m(e)})()},[]);const p=e.useMemo(()=>{const e="YYYY-MM-dd",t=s?.date_range?.name,a=f.find(e=>e.name===t);if(!a)return e;return Le[a?.granularity]||e},[f,s]);return Q.default.useEffect(()=>{if(!(t&&r&&a&&o&&l))return;let e=[];e.push(function(e,t){const a=[...t.doc.metrics,...t.doc.dimensions];return e.columns.reduce((e,t)=>{const r=a.find(e=>e.name===t.name)||t;return e.push(r.title||r.name),e},[])}(r,l));const n=Ae(r,l);a?.forEach(t=>{const a=n(t);e.push(a)}),a?.length?c(e):c()},[t,a,r,o,l]),d?Q.default.createElement("div",{style:{}},Q.default.createElement(n.Chart,Ie({width:t?.doc.size?.width||"100%",chartType:t?.doc.chart?.type,data:d,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 r=t?.doc.chart?.options?.hAxis||{},n={...{ticks:e.slice(1).map(e=>e[0]),format:p},...r};return{...t?.doc.chart?.options,hAxis:n,focusTarget:"category",colors:a}}return{...t?.doc.chart?.options,colors:a}})(d)},t?.doc.chart?.props))):Q.default.createElement("div",null)},LabelChart:function({chart:e,source:t,view:a,report:r,schema:n}){const[o,l]=Q.default.useState([]),[i,s]=Q.default.useState(),[d,c]=Q.default.useState();return Q.default.useEffect(()=>{if(!(e&&a&&t&&r&&n))return;let o=[];const i=Ae(a,n);t.forEach(e=>o.push(i(e))),l(o);const d=e?.doc?.chart?.options||{},u=d?.index||0;if(o.length>0&&s(o[0][u]),d.subText?.format){re.default.configure({autoescape:!1});const e=Ae(a,n,"object")(t[0]),r=re.default.renderString(d.subText?.format,e);c(r)}},[e,t,a,r,n]),Q.default.createElement("div",{style:{display:"flex",justifyContent:"center",alignContent:"center",height:"100%",flexDirection:"column"}},Q.default.createElement(ae.default,{variant:"h6"},i?.f||i),Q.default.createElement(ae.default,{variant:"caption"},d))}};function Ge(e,t){return void 0!==Ye[e]?Q.default.createElement(Ye[e],t):Q.default.createElement(je,t)}const He=Q.createElement(ie.default,{fontSize:"small"}),Ve=Q.createElement(se.default,{fontSize:"small"});function Ze({items:t,selectedKeys:a,defaultSelectedKeys:r,onChange:n,inputValue:o,defaultInputValue:l,onInputChange:i,debounceMs:s=300,label:d,placeholder:c,loading:u,disabled:f,size:p="small",error:g,helperText:h,limitTags:y=3,disableClearable:x,id:b,textFieldProps:E}){const v=e.useMemo(()=>Array.isArray(t)?t:[],[t]),w=Array.isArray(a),[S,C]=e.useState(Array.isArray(r)?r:[]),k=w?a:S,R=e.useMemo(()=>{const e=new Map;for(const t of v)e.set(t&&t.key,t);return e},[v]),T=e.useMemo(()=>(Array.isArray(k)?k:[]).map(e=>R.get(e)).filter(Boolean),[k,R]),D="string"==typeof o,[B,z]=e.useState("string"==typeof l?l:""),P=D?o:B,F=function(t,a=300){const r=e.useRef(t),n=e.useRef(null);return r.current=t,e.useEffect(()=>()=>{n.current&&window.clearTimeout(n.current)},[]),Q.useCallback((...e)=>{r.current&&(n.current&&window.clearTimeout(n.current),n.current=window.setTimeout(()=>{r.current&&r.current(...e)},a))},[a])}(e=>{i&&i(e)},s),M=T;return Q.createElement(m.FormControl,{fullWidth:!0,error:g,disabled:f},Q.createElement(m.Autocomplete,{openOnFocus:!0,forcePopupIcon:!0,id:b,multiple:!0,disableCloseOnSelect:!0,options:v,value:M,inputValue:P,getOptionLabel:e=>e&&"object"==typeof e?e.value??"":"",isOptionEqualToValue:(e,t)=>e&&t&&e.key===t.key,loading:u,limitTags:y,disableClearable:x,onChange:(e,t)=>{const a=Array.isArray(t)?t.map(e=>e&&e.key):[];w||C(a),n&&n(a,Array.isArray(t)?t:[])},onInputChange:(e,t,a)=>{D||z(t??""),"input"===a?F(t??""):"clear"===a&&F("")},renderOption:(e,t,{selected:a})=>Q.createElement("li",Ie({},e,{key:t&&t.key||Math.random().toString(36)}),Q.createElement(m.Checkbox,{icon:He,checkedIcon:Ve,style:{marginRight:8},checked:!!a}),t&&t.value),renderTags:(e,t)=>(Array.isArray(e)?e:[]).map((e,a)=>Q.createElement(m.Chip,Ie({},t({index:a}),{key:e&&e.key||a,label:e&&e.value||""}))),renderInput:e=>Q.createElement(m.TextField,Ie({},e,{label:d,placeholder:c,InputProps:{...e.InputProps,endAdornment:Q.createElement(Q.Fragment,null,u?Q.createElement(m.CircularProgress,{size:18}):null,e.InputProps.endAdornment)},size:p},E))}),h?Q.createElement(m.FormHelperText,null,h):null)}const Je=({filter:t,channel:a,query:r})=>{const[n,o]=e.useState([]),[l,i]=e.useState([]),[s,d]=e.useState(!1),[c,u]=e.useState("");return e.useEffect(()=>{i(r?.filter?.[t?.filter]||[])},[r]),e.useEffect(()=>{(async()=>{d(!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);o(e),d(!1)})()},[c]),Q.default.createElement("div",{style:{display:"flex"}},Q.default.createElement("div",{style:{maxWidth:640,minWidth:200}},Q.default.createElement(Ze,{id:t?.title,label:t?.title,placeholder:"Type to search…",items:n,selectedKeys:l,onChange:(e,r)=>{i(e),a.emit("filterChanged",t,{[t.filter]:e})},onInputChange:e=>{u(e)},loading:s,debounceMs:300,helperText:l.length?`${l.length} selected`:""})))},Qe=e=>e?.replace(/([a-z])([A-Z])/g,"$1 $2")?.replace(/_/g," ")?.replace(/-/g," ").replace(/\b\w/g,e=>e.toUpperCase());function Xe({items:e,value:t,onChange:a,sx:r={width:"100%"},disabled:n=!1,label:o}){const l=e.some(e=>e.key===t)?t:"";return Q.default.createElement(de.default,{sx:r},Q.default.createElement(ue.default,{fullWidth:!0,size:"small"},Q.default.createElement(fe.default,{value:l,onChange:a,disabled:n,displayEmpty:!0,MenuProps:{style:{maxHeight:300}},sx:{height:"40px",borderRadius:"8px",fontFamily:"system-ui",backgroundColor:"white","& .MuiSelect-select":{display:"flex",alignItems:"center",padding:"8px 12px"},"& fieldset":{borderColor:"rgba(0,0,0,0.23)"},"&:hover fieldset":{borderColor:"rgb(70, 134, 128) !important"},"&.Mui-focused fieldset":{borderColor:"rgb(70, 134, 128) !important"}}},Q.default.createElement(ce.default,{value:"",disabled:!0,sx:{color:"rgba(37, 37, 37, 0.58)"}},Qe(o)),e.map(e=>{const{key:t,value:a,disabled:r}=e;return Q.default.createElement(ce.default,{key:t,value:t,disabled:r,sx:{fontFamily:"system-ui",minHeight:"36px"}},Qe(a))}))))}const et=({filter:t,channel:a,query:r})=>{const[n,o]=e.useState([]),[l,i]=e.useState("");return e.useEffect(()=>{i(r?.date_range?.name)},[r]),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}));o(e)})()},[]),Q.default.createElement("div",{style:{minWidth:"200px",maxWidth:"640px"}},Q.default.createElement(Xe,{items:n,value:l,label:t?.title,onChange:(e,r)=>{const n=e.target.value;i(n),a.emit("filterChanged",t,{date_range:{name:n}})}}))},tt=({filters:e=[],channel:t,query:a})=>Q.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px"}},e.map(e=>"multi-select"===e.type?Q.default.createElement(Je,{key:e.title,channel:t,filter:e,query:a}):"date-range"===e.type?Q.default.createElement(et,{key:e.title,channel:t,filter:e,query:a}):null));var at=e=>Q.default.useRef(e||new me.default).current,rt=e=>{const t=Q.default.useState({}),a=Q.default.useCallback((a,r)=>{let n={...t.current,...r};for(var o in t.current=n,n)"date_range"===o||n[o].length||delete n[o];e?.emit("mergedFilterChanged",{value:n})},[e]);Q.default.useEffect(()=>(e?.on("filterChanged",a),()=>{e?.off("filterChanged",a)}),[e])},nt=({id:e,cache:t,dashboard:a,channel:r,...n})=>{const[o,l]=Q.default.useState(),[i,s]=Q.default.useState(),[d,c]=Q.default.useState(),[u,m]=Q.default.useState(),[p,g]=Q.default.useState(Ge()),[h,y]=Q.default.useState(),[x,b]=Q.default.useState(0),[E,v]=Q.default.useState(!1),[w,S]=Q.default.useState(),[C,k]=Q.default.useState(!1),R=Q.default.useRef({value:n?.filter}),[T,D]=Q.default.useState({}),{ref:B,inView:z,entry:P}=f.useInView({threshold:.1,delay:1e3}),F=at(r);rt(F);const M=Q.default.useCallback(e=>{const t=e.target.value;b(t),y(o.doc.view[t])},[o]);Q.default.useEffect(()=>{e&&(async()=>{const a=e,r=t?.[a]||await Ke.getChart({id:a}),o=r.doc.source?.id,i=o?t?.[o]||await Ke.getReport({id:o}):void 0,d=t?.[`schema_${o}`]||n?.schema||await Ke.getReportSchema({id:o}),u=r.doc?.view?.[0];b(0),s(i),l(r),y(u),c(d),k(!0)})().catch(e=>{console.error(e.message)})},[e]),Q.default.useEffect(()=>{o&&u&&(!o?.doc?.source?.id||i)&&d&&(async()=>{g(Ge(o.doc.chart?.component,{view:h,source:u,chart:o,report:i,schema:d,dashboard:a,query:T}))})().catch(e=>{console.error(e.message)})},[o,u,h,i,d]);const q=e=>{const t={...i?.doc.query.filter||{},...n?.filter,...e?.value},a=t.date_range||i?.doc.query.date_range;if(delete t.date_range,k(!1),S(),v(!0),"context"===o?.doc?.source?.type)return m({filter:t}),void v(!1);const r={filter:t,date_range:a,parameters:n?.params};D(r),Ke.runReport({id:i.id,query:r}).then(e=>{m(o.doc.source.reverse?e.reverse():e)}).catch(e=>{m([])}).finally(()=>{v(!1)})},I=e=>{R.current=e,z?q(e):(S(e),k(!0))};return Q.default.useEffect(()=>(F?.on("mergedFilterChanged",I),()=>{F?.off("mergedFilterChanged",I)}),[F,i,o,z]),Q.default.useEffect(()=>{z&&C&&q(w)},[z,C]),Q.default.useEffect(()=>{k(!0)},[n.params]),Q.default.createElement(X.default,{ref:B,elevation:0,style:{borderRadius:12,padding:20,border:"1px solid #e5e5e5",background:"#fff",display:"flex",flexDirection:"column",gap:"12px",height:"100%"}},o&&Q.default.createElement("div",{style:{display:"flex",alignItems:"center",lineHeight:0}},Q.default.createElement(ae.default,{variant:"subtitle2",style:{fontWeight:600,color:"#252525"}},n?.title||o.doc.name," ")),E?Q.default.createElement(je,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100%",width:"100%"}}):Q.default.createElement(Q.default.Fragment,null,Q.default.createElement("div",{style:{display:"flex"}},Q.default.createElement("div",{style:{flexGrow:1}}),Q.default.createElement("div",null,o?.doc?.view?.length>1&&Q.default.createElement(ne.default,null,Q.default.createElement(oe.default,{labelId:"date-range-select-label",id:"date-range-select",value:x,onChange:M,style:{fontSize:"12px"},disableUnderline:!0},o.doc.view.map((e,t)=>Q.default.createElement(le.default,{key:t,value:t},e.title)))))),Q.default.createElement("div",{style:{position:"relative",flexGrow:a?void 0:1,display:"flex",flexDirection:"column"}},Q.default.createElement(tt,{filters:o?.doc?.filters,channel:F,query:T}),p)))};const ot=e.createContext(void 0),lt=({defaultParameters:t={},defaultApi:a={},children:r})=>{const n={base_currency:"EUR",...t},[o,l]=e.useState(n),[i,s]=e.useState(a);e.useEffect(()=>{const e={base_currency:"EUR",...t};l(e)},[t]),e.useEffect(()=>{s(a)},[a]);const d={parameters:o,setParameters:e=>{const t={base_currency:"EUR",...e};l(t)},api:i,setApi:s,setReportingContext:({parameters:e,api:t})=>{if(void 0!==e){const t={base_currency:"EUR",...e};l(t)}void 0!==t&&s(t)}};return Q.default.createElement(ot.Provider,{value:d},r)},it=()=>e.useContext(ot);const st=e.createContext(),dt=({children:t})=>{const[a,r]=e.useState({open:!1,message:"",severity:"info",duration:6e3}),n=(e,t="info",a=6e3)=>{r({open:!0,message:e,severity:t,duration:a})},o=(e,t)=>{"clickaway"!==t&&r(e=>({...e,open:!1}))},l={success:(e,t)=>n(e,"success",t),error:(e,t)=>n(e,"error",t),warning:(e,t)=>n(e,"warning",t),info:(e,t)=>n(e,"info",t)};return Q.default.createElement(st.Provider,{value:l},t,Q.default.createElement(m.Snackbar,{open:a.open,autoHideDuration:a.duration,onClose:o,anchorOrigin:{vertical:"top",horizontal:"right"}},Q.default.createElement(m.Alert,{onClose:o,severity:a.severity,variant:"filled",sx:{width:"100%"}},a.message)))},ct=()=>{const t=e.useContext(st);if(!t)throw new Error("useNotify must be used within a NotifyProvider");return t},ut=({open:e,title:t="Confirm Action",message:a,onConfirm:r,onCancel:n,confirmText:o="Confirm",cancelText:l="Cancel",confirmColor:i="error"})=>Q.default.createElement(m.Dialog,{open:e,onClose:n,"aria-labelledby":"confirm-dialog-title","aria-describedby":"confirm-dialog-description"},Q.default.createElement(m.DialogTitle,{id:"confirm-dialog-title"},t),Q.default.createElement(m.DialogContent,null,Q.default.createElement(m.DialogContentText,{id:"confirm-dialog-description"},a)),Q.default.createElement(m.DialogActions,null,Q.default.createElement(m.Button,{onClick:n,variant:"outlined"},l),Q.default.createElement(m.Button,{onClick:r,variant:"contained",color:i,autoFocus:!0},o))),ft=({onSelectReport:t,onAddNew:a,onCloneReport:r,onRunReport:n,refreshTrigger:o})=>{const l=ct(),[i,s]=e.useState([]),[d,c]=e.useState(!0),[u,f]=e.useState(null),[p,g]=e.useState(!1),[h,y]=e.useState(null);e.useEffect(()=>{x()},[o]);const x=async()=>{try{c(!0),f(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");f(t),l.error(t)}finally{c(!1)}},b=(e,t)=>{t.stopPropagation();const a=i.find(t=>t.id===e);y(a),g(!0)},E=[{field:"title",headerName:"Title",flex:1,minWidth:200},{field:"provider",headerName:"Provider",flex:1,minWidth:200},{field:"source",headerName:"Source",flex:1,minWidth:150},{field:"actions",headerName:"Actions",width:200,sortable:!1,filterable:!1,disableColumnMenu:!0,renderCell:e=>{const a="user-override"===e.row.source;return Q.default.createElement(m.Box,{sx:{display:"flex",gap:1}},Q.default.createElement(m.Tooltip,{title:"Run"},Q.default.createElement(m.IconButton,{size:"small",color:"success",onClick:t=>{return a=e.row.id,t.stopPropagation(),void n(a);var a}},Q.default.createElement(Ee.default,{fontSize:"small"}))),Q.default.createElement(m.Tooltip,{title:"Edit"},Q.default.createElement(m.IconButton,{size:"small",color:"primary",onClick:a=>{return r=e.row.id,a.stopPropagation(),void t(r);var r}},Q.default.createElement(ye.default,{fontSize:"small"}))),Q.default.createElement(m.Tooltip,{title:"Clone"},Q.default.createElement(m.IconButton,{size:"small",onClick:t=>(async(e,t)=>{t.stopPropagation();try{const t=await Ke.getReportDefinition({id:e}),a={...t,title:`${t.title} (Copy)`};r(a)}catch(e){console.error("Error cloning report:",e),l.error("Failed to clone report: "+(e.message||"Unknown error"))}})(e.row.id,t)},Q.default.createElement(xe.default,{fontSize:"small"}))),a?Q.default.createElement(m.Tooltip,{title:"Revert to the system report"},Q.default.createElement(m.IconButton,{size:"small",color:"warning",onClick:t=>b(e.row.id,t)},Q.default.createElement(ve.default,{fontSize:"small"}))):Q.default.createElement(m.Tooltip,{title:"Delete"},Q.default.createElement(m.IconButton,{size:"small",color:"error",onClick:t=>b(e.row.id,t)},Q.default.createElement(be.default,{fontSize:"small"}))))}}],v=i.map(e=>({id:e.id,title:e.title,provider:e.provider,source:e.source}));return d?Q.default.createElement(m.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},Q.default.createElement(m.CircularProgress,null)):u?Q.default.createElement(m.Box,{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",minHeight:400,gap:2},Q.default.createElement(m.Typography,{variant:"body1",color:"error"},u),Q.default.createElement(m.Button,{variant:"contained",onClick:x},"Retry")):Q.default.createElement(m.Box,{sx:{p:3,display:"flex",flexDirection:"column",fontFamily:"system-ui"}},Q.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-end",alignItems:"center",mb:2,fontFamily:"system-ui"}},Q.default.createElement(m.Button,{variant:"contained",sx:{backgroundColor:" rgb(70, 134, 128)",borderRadius:"0.5rem",boxShadow:"none",textTransform:"none"},startIcon:Q.default.createElement(he.default,null),onClick:a},"Add New Report")),Q.default.createElement(m.Box,{sx:{flex:1,width:"100%",borderRadius:"0.5rem",overflow:"hidden",fontFamily:"system-ui"}},Q.default.createElement(S.DataGrid,{rows:v,columns:E,pageSize:10,rowsPerPageOptions:[10,25,50],disableSelectionOnClick:!0,onRowClick:e=>{t(e.row.id)},sx:{height:"100%",borderRadius:"0.5rem",overflow:"hidden",fontFamily:"system-ui","& .MuiDataGrid-columnHeaders":{backgroundColor:"#ffff"},"& .MuiDataGrid-columnHeaderTitle":{fontWeight:"600 !important",fontSize:"0.875rem !important"},"& .MuiDataGrid-columnHeader:first-of-type":{borderTopLeftRadius:"0.5rem"},"& .MuiDataGrid-columnHeader:last-of-type":{borderTopRightRadius:"0.5rem"},"& .MuiDataGrid-row":{cursor:"pointer",fontSize:"0.875rem !important"},"& .MuiDataGrid-row:hover":{backgroundColor:"#f6f5f5ff"}}})),Q.default.createElement(ut,{open:p,title:"user-override"===h?.source?"Revert Report Definition":"Delete Report Definition",message:h?"user-override"===h.source?`Are you sure you want to revert "${h.title}" to the system version? Your custom changes will be lost.`:`Are you sure you want to delete "${h.title}"? This action cannot be undone.`:"",onConfirm:async()=>{if(!h)return;const e="user-override"===h.source,t=e?"reverted":"deleted";try{await Ke.deleteReportDefinition({id:h.id}),l.success(e?`Report "${h.title}" reverted to system version successfully!`:`Report "${h.title}" deleted successfully!`),g(!1),y(null),x()}catch(e){console.error(`Error ${t} report:`,e),l.error(`Failed to ${t.toLowerCase()} report: `+(e.response?.data?.message||e.message||"Unknown error")),g(!1),y(null)}},onCancel:()=>{g(!1),y(null)},confirmText:"user-override"===h?.source?"Revert":"Delete",cancelText:"Cancel",confirmColor:"user-override"===h?.source?"warning":"error"}))},mt=({providersData:t,rootProvider:a,onSelectionChange:r,existingDimensions:n=[],existingMetrics:o=[],existingFilters:l={}})=>{const[i,s]=e.useState([]);e.useEffect(()=>{s([]),r&&r([])},[a]);const d=e=>{if(!t||!e)return[];const a=t[e];if(!a||!a.relations||0===a.relations.length)return[];const r=(()=>{const e=new Map,t=t=>{if(t.relations&&t.providerPath)for(let a=0;a<t.relations.length;a++){const r=t.relations[a],n=t.providerPath[a];r.type&&(e.has(n)||e.set(n,new Set),e.get(n).add(r.name))}};return n.forEach(t),o.forEach(t),Object.values(l).forEach(t),e})().get(e);return a.relations.filter(e=>t[e.target]).map(e=>{let t=!1,a=null;if(!!e.type&&r&&r.size>0){if(!r.has(e.name)&&r.size>0){t=!0;a=`Cannot select: '${Array.from(r)[0]}' is already in use`}}return{key:e.name,value:e.name,targetKey:e.target,disabled:t,disabledReason:a}})},c=(e,t)=>{const n=t.target.value,o=0===e?a:i[e-1].targetKey,l=d(o).find(e=>e.key===n);if(!l)return;const c=i.slice(0,e);c.push({providerKey:n,relationName:n,targetKey:l.targetKey}),s(c),console.log("Selection chain:",c),r&&r(c)};return Q.default.createElement(m.Box,null,i.length>0&&Q.default.createElement(m.Box,{sx:{marginBottom:2}},Q.default.createElement(m.Box,{sx:{display:"flex",alignItems:"center",gap:1.5,flexWrap:"wrap"}},Q.default.createElement(m.Chip,{label:Qe(a),size:"medium",variant:"outlined",sx:{fontWeight:600,borderColor:"rgb(70, 134, 128)",color:"rgb(70, 134, 128)",backgroundColor:"white",height:"32px",fontFamily:"system-ui"}}),i.map((e,t)=>Q.default.createElement(Q.default.Fragment,{key:t},Q.default.createElement(m.Typography,{variant:"body2",sx:{color:"#9e9e9e",fontWeight:"bold"}},"→"),Q.default.createElement(m.Chip,{label:Qe(e.targetKey),size:"medium",onDelete:()=>(e=>{const t=i.slice(0,e);s(t),r&&r(t)})(t),sx:{fontWeight:500,backgroundColor:"rgb(70, 134, 128)",color:"white",height:"32px",fontFamily:"system-ui","& .MuiChip-deleteIcon":{color:"rgba(255, 255, 255, 0.7)","&:hover":{color:"white"}}}}))))),Q.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",alignItems:"flex-start",gap:"16px"}},(()=>{if(!t||!a)return null;const e=[],r=d(a);r.length>0&&e.push(Q.default.createElement("div",{key:"level-0",style:{marginRight:"16px"}},Q.default.createElement(Xe,{items:r,value:i[0]?.providerKey||"",label:`Related to ${a}`,onChange:e=>c(0,e),sx:{width:"300px"}})));for(let t=0;t<i.length;t++){const a=i[t],r=d(a.targetKey);if(r.length>0){const n=i[t+1];e.push(Q.default.createElement("div",{key:`level-${t+1}`,style:{marginRight:"16px"}},Q.default.createElement(Xe,{items:r,value:n?.providerKey||"",label:`Related to ${a.targetKey}`,onChange:e=>c(t+1,e),sx:{width:"300px"}})))}}return e})()))},pt=({id:t,label:a,fullLabel:r,onDelete:n,onMoveUp:o,onMoveDown:l,isFirst:i,isLast:s,sortOrder:d,onSortOrderChange:c,fullPath:u,defaultTitle:f,customTitle:p,onUpdateTitle:g,onResetTitle:h})=>{const[y,x]=e.useState(!1),[b,E]=e.useState(""),v=e.useRef(null),w=e.useRef(null),{attributes:C,listeners:k,setNodeRef:R,transform:T,transition:D,isDragging:B}=q.useSortable({id:t}),z={transform:I.CSS.Transform.toString(T),transition:D,opacity:B?.5:1,display:"flex",alignItems:"center",width:"100%"};e.useEffect(()=>{y&&v.current&&(v.current.focus(),v.current.select())},[y]),e.useEffect(()=>{const e=e=>{y&&w.current&&!w.current.contains(e.target)&&F()};if(y)return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[y]);const P=()=>{const e=b.trim();""!==e?(g(u,e),x(!1)):F()},F=()=>{x(!1),E("")},M=p||a,$=!!p;return Q.default.createElement("div",Ie({ref:R,style:z},C),Q.default.createElement(m.Box,{ref:w,sx:{display:"flex",alignItems:"center",width:"100%",gap:1,backgroundColor:"white",border:"1px solid #e0e0e0",borderRadius:2,padding:1,transition:"transform 0.2s ease, box-shadow 0.2s ease","&:hover .hover-icons":{opacity:1}}},Q.default.createElement(m.Box,Ie({},k,{sx:{display:"flex",alignItems:"center",cursor:"grab","&:active":{cursor:"grabbing"}}}),Q.default.createElement(ke.default,{sx:{cursor:"grab",color:"rgba(110, 110, 110, 0.62)"}})),y?Q.default.createElement(Q.default.Fragment,null,Q.default.createElement(m.TextField,{inputRef:v,value:b,onChange:e=>E(e.target.value),onKeyDown:e=>{"Enter"===e.key?P():"Escape"===e.key&&F()},size:"small",sx:{minWidth:"200px",maxWidth:"400px"}}),Q.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:1}},Q.default.createElement(m.Tooltip,{title:"Save",arrow:!0,placement:"top"},Q.default.createElement(m.IconButton,{size:"small",onClick:P,color:"primary","aria-label":"save title"},Q.default.createElement(Be.default,{fontSize:"small"}))),Q.default.createElement(m.Tooltip,{title:"Cancel",arrow:!0,placement:"top"},Q.default.createElement(m.IconButton,{size:"small",onClick:F,"aria-label":"cancel edit"},Q.default.createElement(ze.default,{fontSize:"small"}))),$&&Q.default.createElement(m.Tooltip,{title:"Reset to default",arrow:!0,placement:"top"},Q.default.createElement(m.IconButton,{size:"small",onClick:()=>{h(u),x(!1),E("")},color:"warning","aria-label":"reset title"},Q.default.createElement(Pe.default,{fontSize:"small"})))),Q.default.createElement(m.Box,{sx:{flex:1}})):Q.default.createElement(Q.default.Fragment,null,Q.default.createElement(m.Box,{sx:{minWidth:0}},Q.default.createElement(m.Tooltip,{title:r||M,arrow:!0,placement:"top"},Q.default.createElement(m.Typography,{variant:"h6",sx:{fontWeight:$?600:500,fontStyle:$?"italic":"normal",color:"#1a1a1a",fontSize:"14px",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},M))),Q.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:0,transition:"opacity 0.2s"}},Q.default.createElement(m.Tooltip,{title:"Edit title",arrow:!0,placement:"top"},Q.default.createElement(m.IconButton,{size:"small",onClick:()=>{E(p||f),x(!0)},"aria-label":"edit title"},Q.default.createElement(ye.default,{fontSize:"small"}))),Q.default.createElement(m.Tooltip,{title:null===d?"No sort":"asc"===d?"Ascending":"Descending",arrow:!0,placement:"top"},Q.default.createElement(m.IconButton,{size:"small",onClick:()=>{c(null===d?"asc":"asc"===d?"desc":null)},"aria-label":"toggle sort order",color:d?"primary":"default"},"asc"===d?Q.default.createElement(Re.default,{fontSize:"small"}):"desc"===d?Q.default.createElement(Te.default,{fontSize:"small"}):Q.default.createElement(De.default,{fontSize:"small",sx:{opacity:.3}}))),Q.default.createElement(m.Tooltip,{title:"Delete",arrow:!0,placement:"top"},Q.default.createElement(m.IconButton,{size:"small",onClick:n,"aria-label":"delete",sx:{color:"#ef5350"}},Q.default.createElement(S.GridDeleteIcon,{fontSize:"small"})))),Q.default.createElement(m.Box,{sx:{flex:1}}),Q.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:0,transition:"opacity 0.2s"}},Q.default.createElement(m.IconButton,{size:"small",onClick:o,disabled:i,"aria-label":"move up"},Q.default.createElement(Re.default,{fontSize:"small"})),Q.default.createElement(m.IconButton,{size:"small",onClick:l,disabled:s,"aria-label":"move down"},Q.default.createElement(Te.default,{fontSize:"small"}))))))},gt=({providersData:t,rootProvider:a,savedDimensions:r=[],onSaveDimension:n,onRemoveDimension:o,onReorderDimensions:l,titleOverrides:i={},onUpdateTitle:s,onResetTitle:d,existingMetrics:c=[],existingFilters:u={}})=>{const[f,p]=e.useState(!1),[g,h]=e.useState([]),[y,x]=e.useState(""),b=M.useSensors(M.useSensor(M.PointerSensor),M.useSensor(M.KeyboardSensor,{coordinateGetter:q.sortableKeyboardCoordinates})),E=()=>{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 o=[t[a].default_alias];let l=a;g.forEach(e=>{const a=t[l];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&o.push(t.alias)}l=e.targetKey});const i=new Set(r.map(e=>e.fullPath)),s=[];return Object.keys(n.dimensions).forEach(t=>{const a=n.dimensions[t];Object.keys(a).forEach(r=>{const n=a[r],l=`${o.join("_")}.${r}`,d=i.has(l);s.push({key:`${e}_${t}.${r}`,value:n.title||r,dimensionKey:r,alias:t,dimension:n,disabled:d})})}),s},v=()=>{p(!1),h([]),x("")},w=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")};return Q.default.createElement("div",null,Q.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-start",mb:2}},!f&&Q.default.createElement(m.Button,{variant:"contained",startIcon:Q.default.createElement(S.GridAddIcon,null),onClick:()=>{p(!0),h([]),x("")},sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",textTransform:"none",backgroundColor:"rgb(70, 134, 128)",boxShadow:"none","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Add Dimension")),f&&Q.default.createElement(m.Paper,{elevation:0,sx:{p:3,mb:3,border:"1px solid #e0e0e0",borderRadius:"12px",backgroundColor:"white",boxShadow:"0px 2px 4px rgba(0,0,0,0.02)",fontFamily:"system-ui"}},Q.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Provider Path"),Q.default.createElement(m.Box,{sx:{mb:3}},Q.default.createElement(mt,{providersData:t,rootProvider:a,onSelectionChange:h,existingDimensions:r,existingMetrics:c,existingFilters:u})),Q.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Dimension"),Q.default.createElement(m.Box,{sx:{display:"flex",alignItems:"center",gap:2,mb:3}},Q.default.createElement(Xe,{items:E(),value:y,label:"Choose Dimension",onChange:e=>{x(e.target.value)},sx:{width:"400px",fontFamily:"system-ui"}}),Q.default.createElement(m.Tooltip,{title:"Add all available dimensions",arrow:!0,placement:"top"},Q.default.createElement("span",null,Q.default.createElement(m.IconButton,{onClick:()=>{const e=E().filter(e=>!e.disabled);if(0===e.length)return;const r=[],o=[a],l=[];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&&(r.push(t),l.push(t.name))}o.push(e.targetKey),i=e.targetKey});const s=[t[a].default_alias];r.forEach(e=>{s.push(e.alias)}),e.forEach(e=>{const t=`${s.join("_")}.${e.dimensionKey}`,a={dimension:e.dimension,relations:r,providerPath:o,relationNames:l,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:t};n(a)}),v()},disabled:0===E().filter(e=>!e.disabled).length,"aria-label":"add all dimensions",sx:{color:"rgb(70, 134, 128)",border:"1px solid #e0e0e0",borderRadius:"8px",padding:"8px","&:hover":{backgroundColor:"#f5f5f5"},"&.Mui-disabled":{opacity:.5}}},Q.default.createElement(Fe.default,null))))),Q.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-end",gap:2,mt:3}},Q.default.createElement(m.Button,{variant:"outlined",onClick:v,sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",borderColor:"#e0e0e0",color:"rgb(37, 37, 37)",textTransform:"none","&:hover":{backgroundColor:"#f5f5f5",borderColor:"#d0d0d0"}}},"Cancel"),Q.default.createElement(m.Button,{variant:"contained",onClick:()=>{if(!y)return;const e=E().find(e=>e.key===y);if(!e)return;const r=[],o=[a],l=[];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&&(r.push(t),l.push(t.name))}o.push(e.targetKey),i=e.targetKey});const s=[t[a].default_alias];r.forEach(e=>{s.push(e.alias)});const d=`${s.join("_")}.${e.dimensionKey}`,c={dimension:e.dimension,relations:r,providerPath:o,relationNames:l,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:d};n(c),v()},disabled:!y,sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",textTransform:"none",backgroundColor:"rgb(70, 134, 128)","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Save Dimension"))),r.length>0&&Q.default.createElement(m.Box,{sx:{marginTop:0}},Q.default.createElement(m.Typography,{variant:"h6",sx:{fontSize:"16px",fontWeight:600,marginTop:2,color:"rgb(37, 37, 37)"}},"Saved Dimensions"),Q.default.createElement(m.Typography,{sx:{fontSize:"13px",color:"#666",marginBottom:2}},"Drag to reorder or use arrows"),Q.default.createElement(M.DndContext,{sensors:b,collisionDetection:M.closestCenter,onDragEnd:e=>{const{active:t,over:a}=e;if(a&&t.id!==a.id){const e=r.findIndex((e,a)=>a===t.id),n=r.findIndex((e,t)=>t===a.id),o=q.arrayMove(r,e,n);l(o)}}},Q.default.createElement(q.SortableContext,{items:r.map((e,t)=>t),strategy:q.verticalListSortingStrategy},Q.default.createElement(m.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},r.map((e,t)=>Q.default.createElement(pt,{key:t,id:t,label:e.dimensionTitle,fullLabel:`${w(e)} → ${e.dimensionTitle} (${e.fullPath})`,onDelete:()=>o(t),onMoveUp:()=>(e=>{if(e>0){const t=q.arrayMove(r,e,e-1);l(t)}})(t),onMoveDown:()=>(e=>{if(e<r.length-1){const t=q.arrayMove(r,e,e+1);l(t)}})(t),isFirst:0===t,isLast:t===r.length-1,sortOrder:e.sortOrder||null,onSortOrderChange:e=>((e,t)=>{const a=[...r];a[e]={...a[e],sortOrder:t},l(a)})(t,e),fullPath:e.fullPath,defaultTitle:e.dimensionTitle,customTitle:i[e.fullPath],onUpdateTitle:s,onResetTitle:d})))))))},ht=({id:t,label:a,fullLabel:r,onDelete:n,onMoveUp:o,onMoveDown:l,isFirst:i,isLast:s,fullPath:d,defaultTitle:c,customTitle:u,onUpdateTitle:f,onResetTitle:p})=>{const[g,h]=e.useState(!1),[y,x]=e.useState(""),b=e.useRef(null),E=e.useRef(null),{attributes:v,listeners:w,setNodeRef:C,transform:k,transition:R,isDragging:T}=q.useSortable({id:t}),D={transform:I.CSS.Transform.toString(k),transition:R,opacity:T?.5:1,display:"flex",alignItems:"center",width:"100%"};e.useEffect(()=>{g&&b.current&&(b.current.focus(),b.current.select())},[g]),e.useEffect(()=>{const e=e=>{g&&E.current&&!E.current.contains(e.target)&&z()};if(g)return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[g]);const B=()=>{const e=y.trim();""!==e?(f(d,e),h(!1)):z()},z=()=>{h(!1),x("")},P=u||a,F=!!u;return Q.default.createElement("div",Ie({ref:C,style:D},v),Q.default.createElement(m.Box,{ref:E,sx:{display:"flex",alignItems:"center",width:"100%",gap:1,backgroundColor:"white",border:"1px solid #e0e0e0",borderRadius:2,padding:1,transition:"transform 0.2s ease, box-shadow 0.2s ease","&:hover .hover-icons":{opacity:1}}},Q.default.createElement(m.Box,Ie({},w,{sx:{display:"flex",alignItems:"center",cursor:"grab","&:active":{cursor:"grabbing"}}}),Q.default.createElement(ke.default,{sx:{cursor:"grab",color:"rgba(110, 110, 110, 0.62)"}})),g?Q.default.createElement(Q.default.Fragment,null,Q.default.createElement(m.TextField,{inputRef:b,value:y,onChange:e=>x(e.target.value),onKeyDown:e=>{"Enter"===e.key?B():"Escape"===e.key&&z()},size:"small",sx:{minWidth:"200px",maxWidth:"400px"}}),Q.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:1}},Q.default.createElement(m.Tooltip,{title:"Save",arrow:!0,placement:"top"},Q.default.createElement(m.IconButton,{size:"small",onClick:B,color:"primary","aria-label":"save title"},Q.default.createElement(Be.default,{fontSize:"small"}))),Q.default.createElement(m.Tooltip,{title:"Cancel",arrow:!0,placement:"top"},Q.default.createElement(m.IconButton,{size:"small",onClick:z,"aria-label":"cancel edit"},Q.default.createElement(ze.default,{fontSize:"small"}))),F&&Q.default.createElement(m.Tooltip,{title:"Reset to default",arrow:!0,placement:"top"},Q.default.createElement(m.IconButton,{size:"small",onClick:()=>{p(d),h(!1),x("")},color:"warning","aria-label":"reset title"},Q.default.createElement(Pe.default,{fontSize:"small"})))),Q.default.createElement(m.Box,{sx:{flex:1}})):Q.default.createElement(Q.default.Fragment,null,Q.default.createElement(m.Box,{sx:{minWidth:0}},Q.default.createElement(m.Tooltip,{title:r||P,arrow:!0,placement:"top"},Q.default.createElement(m.Typography,{variant:"h6",sx:{fontWeight:F?600:500,fontStyle:F?"italic":"normal",color:"#1a1a1a",fontSize:"14px",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},P))),Q.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:0,transition:"opacity 0.2s"}},Q.default.createElement(m.Tooltip,{title:"Edit title",arrow:!0,placement:"top"},Q.default.createElement(m.IconButton,{size:"small",onClick:()=>{x(u||c),h(!0)},"aria-label":"edit title"},Q.default.createElement(ye.default,{fontSize:"small"}))),Q.default.createElement(m.Tooltip,{title:"Delete",arrow:!0,placement:"top"},Q.default.createElement(m.IconButton,{size:"small",onClick:n,"aria-label":"delete",sx:{color:"#ef5350"}},Q.default.createElement(S.GridDeleteIcon,{fontSize:"small"})))),Q.default.createElement(m.Box,{sx:{flex:1}}),Q.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:0,transition:"opacity 0.2s"}},Q.default.createElement(m.IconButton,{size:"small",onClick:o,disabled:i,"aria-label":"move up"},Q.default.createElement(Re.default,{fontSize:"small"})),Q.default.createElement(m.IconButton,{size:"small",onClick:l,disabled:s,"aria-label":"move down"},Q.default.createElement(Te.default,{fontSize:"small"}))))))},yt=({providersData:t,rootProvider:a,savedMetrics:r=[],onSaveMetric:n,onRemoveMetric:o,onReorderMetrics:l,titleOverrides:i={},onUpdateTitle:s,onResetTitle:d,existingDimensions:c=[],existingFilters:u={}})=>{const[f,p]=e.useState(!1),[g,h]=e.useState([]),[y,x]=e.useState(""),b=M.useSensors(M.useSensor(M.PointerSensor),M.useSensor(M.KeyboardSensor,{coordinateGetter:q.sortableKeyboardCoordinates})),E=()=>{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.metrics)return[];const o=[t[a].default_alias];let l=a;g.forEach(e=>{const a=t[l];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&o.push(t.alias)}l=e.targetKey});const i=new Set(r.map(e=>e.fullPath)),s=n.metrics.map((t,a)=>{const r=`${o.join("_")}.${t.name}`,n=i.has(r);return{key:`${e}_${t.name}_${a}`,value:t.title||t.name,metricName:t.name,metric:t,disabled:n}});return s},v=()=>{p(!1),h([]),x("")},w=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")};return Q.default.createElement("div",null,Q.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-start",mb:2}},!f&&Q.default.createElement(m.Button,{variant:"contained",startIcon:Q.default.createElement(S.GridAddIcon,null),onClick:()=>{p(!0),h([]),x("")},sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",textTransform:"none",backgroundColor:"rgb(70, 134, 128)",boxShadow:"none","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Add Metric")),f&&Q.default.createElement(m.Paper,{elevation:0,sx:{p:3,mb:3,border:"1px solid #e0e0e0",borderRadius:"12px",backgroundColor:"white",boxShadow:"0px 2px 4px rgba(0,0,0,0.02)",fontFamily:"system-ui"}},Q.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Provider Path"),Q.default.createElement(m.Box,{sx:{mb:3}},Q.default.createElement(mt,{providersData:t,rootProvider:a,onSelectionChange:h,existingDimensions:c,existingMetrics:r,existingFilters:u})),Q.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Metric"),Q.default.createElement(m.Box,{sx:{display:"flex",alignItems:"center",gap:2,mb:3}},Q.default.createElement(Xe,{items:E(),value:y,label:"Choose Metric",onChange:e=>{x(e.target.value)},sx:{width:"400px",fontFamily:"system-ui"}}),Q.default.createElement(m.Tooltip,{title:"Add all available metrics",arrow:!0,placement:"top"},Q.default.createElement("span",null,Q.default.createElement(m.IconButton,{onClick:()=>{const e=E().filter(e=>!e.disabled);if(0===e.length)return;const r=[],o=[a],l=[];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&&(r.push(t),l.push(t.name))}o.push(e.targetKey),i=e.targetKey});const s=[t[a].default_alias];r.forEach(e=>{s.push(e.alias)}),e.forEach(e=>{const t=`${s.join("_")}.${e.metricName}`,a={metric:e.metric,relations:r,providerPath:o,relationNames:l,metricName:e.metricName,metricTitle:e.value,fullPath:t};n(a)}),v()},disabled:0===E().filter(e=>!e.disabled).length,"aria-label":"add all metrics",sx:{color:"rgb(70, 134, 128)",border:"1px solid #e0e0e0",borderRadius:"8px",padding:"8px","&:hover":{backgroundColor:"#f5f5f5"},"&.Mui-disabled":{opacity:.5}}},Q.default.createElement(Fe.default,null))))),Q.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-end",gap:2,mt:3}},Q.default.createElement(m.Button,{variant:"outlined",onClick:v,sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",borderColor:"#e0e0e0",color:"rgb(37, 37, 37)",textTransform:"none","&:hover":{backgroundColor:"#f5f5f5",borderColor:"#d0d0d0"}}},"Cancel"),Q.default.createElement(m.Button,{variant:"contained",onClick:()=>{if(!y)return;const e=E().find(e=>e.key===y);if(!e)return;const r=[],o=[a],l=[];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&&(r.push(t),l.push(t.name))}o.push(e.targetKey),i=e.targetKey});const s=[t[a].default_alias];r.forEach(e=>{s.push(e.alias)});const d=`${s.join("_")}.${e.metricName}`,c={metric:e.metric,relations:r,providerPath:o,relationNames:l,metricName:e.metricName,metricTitle:e.value,fullPath:d};n(c),v()},disabled:!y,sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",textTransform:"none",backgroundColor:"rgb(70, 134, 128)","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Save Metric"))),r.length>0&&Q.default.createElement(m.Box,{sx:{marginTop:0}},Q.default.createElement(m.Typography,{variant:"h6",sx:{fontSize:"16px",fontWeight:600,marginBottom:1,color:"rgb(37, 37, 37)"}},"Saved Metrics"),Q.default.createElement(M.DndContext,{sensors:b,collisionDetection:M.closestCenter,onDragEnd:e=>{const{active:t,over:a}=e;if(a&&t.id!==a.id){const e=r.findIndex((e,a)=>a===t.id),n=r.findIndex((e,t)=>t===a.id),o=q.arrayMove(r,e,n);l(o)}}},Q.default.createElement(q.SortableContext,{items:r.map((e,t)=>t),strategy:q.verticalListSortingStrategy},Q.default.createElement(m.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},r.map((e,t)=>Q.default.createElement(ht,{key:t,id:t,label:e.metricTitle,fullLabel:`${w(e)} → ${e.metricTitle} (${e.fullPath})`,onDelete:()=>o(t),onMoveUp:()=>(e=>{if(e>0){const t=q.arrayMove(r,e,e-1);l(t)}})(t),onMoveDown:()=>(e=>{if(e<r.length-1){const t=q.arrayMove(r,e,e+1);l(t)}})(t),isFirst:0===t,isLast:t===r.length-1,fullPath:e.fullPath,defaultTitle:e.metricTitle,customTitle:i[e.fullPath],onUpdateTitle:s,onResetTitle:d})))))))},xt=({providersData:t,rootProvider:a,savedFilters:r={},onSaveFilter:n,onRemoveFilter:o,existingDimensions:l=[],existingMetrics:i=[],titleOverrides:s={},onUpdateTitle:d,onResetTitle:c})=>{const u=it(),[f,p]=e.useState(!1),[g,h]=e.useState([]),[y,x]=e.useState(""),[b,E]=e.useState([]),[v,w]=e.useState([]),[C,k]=e.useState(!1),[R,T]=e.useState(null),[D,B]=e.useState(null),[z,P]=e.useState(null),[F,M]=e.useState(null),[q,I]=e.useState("");e.useEffect(()=>{x(""),E([]),w([]),B(null),P(null)},[g]);const $=e=>e&&("date"===e.type||"timestamp"===e.type),j=()=>{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 n=[];return Object.keys(r.dimensions).forEach(t=>{const a=r.dimensions[t];Object.keys(a).forEach(r=>{const o=a[r];(e=>!!e.column&&/^[a-zA-Z0-9_.]+$/.test(e.column))(o)&&n.push({key:`${e}_${t}.${r}`,value:o.title||r,dimensionKey:r,alias:t,dimension:o})})}),n},A=()=>{p(!1),h([]),x(""),E([]),w([]),B(null),P(null),T(null)},O=()=>{T(null),E([]),w([]),B(null),P(null)},_=e=>{const t=q.trim();""!==t?(d(e,t),M(null),I("")):W()},W=()=>{M(null),I("")},N=async e=>{k(!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 r=await Ke.runAdHocReport({report:t});console.log("Filter values results:",r);const n=(Array.isArray(r)?r:r.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:",n),E(n)}catch(e){console.error("Error fetching filter values:",e),E([])}finally{k(!1)}},K=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")},U=Object.entries(r);return Q.default.createElement("div",null,Q.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-start",mb:2}},!f&&Q.default.createElement(m.Button,{variant:"contained",startIcon:Q.default.createElement(S.GridAddIcon,null),onClick:()=>{p(!0),h([]),x(""),E([]),w([]),B(null),P(null),T(null)},sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",textTransform:"none",backgroundColor:"rgb(70, 134, 128)",boxShadow:"none","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Add Filter")),f&&Q.default.createElement(m.Paper,{elevation:0,sx:{p:3,mb:3,border:"1px solid #e0e0e0",borderRadius:"12px",backgroundColor:"white",boxShadow:"0px 2px 4px rgba(0,0,0,0.02)",fontFamily:"system-ui"}},Q.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Provider Path"),Q.default.createElement(m.Box,{sx:{mb:3}},Q.default.createElement(mt,{providersData:t,rootProvider:a,onSelectionChange:h,existingDimensions:l,existingMetrics:i,existingFilters:r})),Q.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Dimension for Filter"),Q.default.createElement(m.Box,{sx:{mb:3}},Q.default.createElement(Xe,{items:j(),value:y,label:"Choose Dimension",onChange:e=>{const r=e.target.value;if(x(r),w([]),B(null),P(null),r){const e=j().find(e=>e.key===r);if(e){if(!$(e.dimension)){const r=[];let n=a;g.forEach(e=>{const a=t[n];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&r.push(t)}n=e.targetKey});const o=[t[a].default_alias];r.forEach(e=>{o.push(e.alias)});const l=`${o.join("_")}.${e.dimensionKey}`;N(l)}}}else E([])},sx:{width:"400px",fontFamily:"system-ui"}})),y&&(()=>{const e=j().find(e=>e.key===y),t=e&&$(e.dimension);return Q.default.createElement(Q.default.Fragment,null,Q.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,mt:3,color:"rgb(37, 37, 37)"}},t?"Select Date Range":"Select Filter Values"),t?Q.default.createElement(L.LocalizationProvider,{dateAdapter:G.AdapterDayjs},Q.default.createElement(m.Box,{sx:{display:"flex",gap:2,width:"400px"}},Q.default.createElement(Y.DatePicker,{label:"From Date",value:D,onChange:e=>B(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}),Q.default.createElement(Y.DatePicker,{label:"To Date",value:z,onChange:e=>P(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}))):Q.default.createElement(m.Box,{sx:{width:"400px"}},Q.default.createElement(Ze,{items:b,selectedKeys:v,onChange:e=>w(e),label:"Choose Values",placeholder:"Select one or more values...",loading:C,helperText:v.length>0?`${v.length} value(s) selected`:"Select at least one value"})))})(),Q.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-end",gap:2,mt:3}},Q.default.createElement(m.Button,{variant:"outlined",onClick:A,sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",borderColor:"#e0e0e0",color:"rgb(37, 37, 37)",textTransform:"none","&:hover":{backgroundColor:"#f5f5f5",borderColor:"#d0d0d0"}}},"Cancel"),Q.default.createElement(m.Button,{variant:"contained",onClick:()=>{const e=j().find(e=>e.key===y);if(!e)return;const r=$(e.dimension);if(r){if(!D&&!z)return}else if(0===v.length)return;if(!y)return;const o=[],l=[a],i=[];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&&(o.push(t),i.push(t.name))}l.push(e.targetKey),s=e.targetKey});const d=[t[a].default_alias];o.forEach(e=>{d.push(e.alias)});const c=`${d.join("_")}.${e.dimensionKey}`;let u;r?(u={},D&&(u.gte=D.format("YYYY-MM-DD")),z&&(u.lte=z.format("YYYY-MM-DD"))):u=v;const f={dimension:e.dimension,relations:o,providerPath:l,relationNames:i,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:c,values:u};n(c,f),A()},disabled:(()=>{if(!y)return!0;const e=j().find(e=>e.key===y);if(!e)return!0;return $(e.dimension)?!D&&!z:0===v.length})(),sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",textTransform:"none",backgroundColor:"rgb(70, 134, 128)","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Save Filter"))),U.length>0&&Q.default.createElement(m.Box,{sx:{marginTop:0}},Q.default.createElement(m.Typography,{variant:"h6",sx:{fontSize:"16px",fontWeight:600,marginBottom:1,color:"rgb(37, 37, 37)"}},"Saved Filters"),Q.default.createElement(m.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},U.map(([e,t])=>{const a=$(t.dimension),l=R===e,i=F===e;let d,u;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":(d=t.values?.length||0,u=t.values?.join(", ")||"No values");const f=s[e]||t.dimensionTitle,g=!!s[e];return Q.default.createElement(m.Box,{key:e},Q.default.createElement(m.Box,{sx:{display:"flex",alignItems:"center",width:"100%",gap:1,backgroundColor:"white",border:"1px solid #e0e0e0",borderRadius:2,padding:2,transition:"box-shadow 0.2s ease","&:hover .hover-icons":{opacity:1}}},i?Q.default.createElement(Q.default.Fragment,null,Q.default.createElement(m.TextField,{value:q,onChange:e=>I(e.target.value),onKeyDown:t=>((e,t)=>{"Enter"===e.key?_(t):"Escape"===e.key&&W()})(t,e),size:"small",autoFocus:!0,placeholder:"Enter custom title",sx:{flex:1}}),Q.default.createElement(m.Box,{sx:{display:"flex",gap:.5}},Q.default.createElement(m.Tooltip,{title:"Save",arrow:!0},Q.default.createElement(m.IconButton,{size:"small",onClick:()=>_(e),color:"primary"},Q.default.createElement(Be.default,{fontSize:"small"}))),Q.default.createElement(m.Tooltip,{title:"Cancel",arrow:!0},Q.default.createElement(m.IconButton,{size:"small",onClick:W},Q.default.createElement(ze.default,{fontSize:"small"}))),g&&Q.default.createElement(m.Tooltip,{title:"Reset to default",arrow:!0},Q.default.createElement(m.IconButton,{size:"small",onClick:()=>(e=>{c(e),M(null),I("")})(e),color:"warning"},Q.default.createElement(Pe.default,{fontSize:"small"}))))):Q.default.createElement(Q.default.Fragment,null,Q.default.createElement(m.Box,{sx:{flex:1,minWidth:0}},Q.default.createElement(m.Box,{sx:{display:"flex",alignItems:"center",gap:1}},Q.default.createElement(m.Typography,{variant:"h6",sx:{fontWeight:g?600:500,fontStyle:g?"italic":"normal",color:"#1a1a1a",fontSize:"14px"}},f),Q.default.createElement(m.Tooltip,{title:Q.default.createElement("div",null,Q.default.createElement("div",null,Q.default.createElement("strong",null,"Path:")," ",K(t)," → ",t.dimensionTitle),Q.default.createElement("div",null,Q.default.createElement("strong",null,"Full Path:")," ",e),Q.default.createElement("div",null,Q.default.createElement("strong",null,a?"Date Range":`Values (${d})`,":")," ",u)),arrow:!0,placement:"top"},Q.default.createElement(m.Chip,{size:"small",label:a?u:`${d} values`,color:"default",variant:"outlined",sx:{marginLeft:1,height:"20px",fontSize:"14px"}})))),Q.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:0,transition:"opacity 0.2s"}},Q.default.createElement(m.Tooltip,{title:"Rename filter",arrow:!0},Q.default.createElement(m.IconButton,{size:"small",onClick:()=>((e,t)=>{M(e),I(s[e]||t||"")})(e,t.dimensionTitle),disabled:l},Q.default.createElement(ye.default,{fontSize:"small"}))),Q.default.createElement(m.Tooltip,{title:"Edit filter values",arrow:!0},Q.default.createElement(m.IconButton,{size:"small",onClick:()=>(async(e,t)=>{p(!1),T(e),$(t.dimension)?t.values&&"object"==typeof t.values&&!Array.isArray(t.values)&&(B(t.values.gte?qe.default(t.values.gte):null),P(t.values.lte?qe.default(t.values.lte):null)):(w(t.values||[]),await N(e))})(e,t),disabled:l},Q.default.createElement(Me.default,{fontSize:"small"}))),Q.default.createElement(m.Tooltip,{title:"Remove filter",arrow:!0},Q.default.createElement(m.IconButton,{size:"small",onClick:()=>o(e),sx:{color:"#ef5350"}},Q.default.createElement(S.GridDeleteIcon,{fontSize:"small"})))))),l&&Q.default.createElement(m.Paper,{elevation:0,sx:{p:2,mt:1,ml:2,border:"1px solid #e0e0e0",borderRadius:"8px",backgroundColor:"#fafafa"}},Q.default.createElement(m.Typography,{variant:"subtitle2",sx:{marginBottom:1.5,fontWeight:600}},"Edit ",a?"Date Range":"Values"," for: ",t.dimensionTitle),a?Q.default.createElement(L.LocalizationProvider,{dateAdapter:G.AdapterDayjs},Q.default.createElement(m.Box,{sx:{display:"flex",gap:2,width:"400px",marginBottom:2}},Q.default.createElement(Y.DatePicker,{label:"From Date",value:D,onChange:e=>B(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}),Q.default.createElement(Y.DatePicker,{label:"To Date",value:z,onChange:e=>P(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}))):Q.default.createElement(m.Box,{sx:{width:"400px",marginBottom:2}},Q.default.createElement(Ze,{items:b,selectedKeys:v,onChange:e=>w(e),label:"Choose Values",placeholder:"Select one or more values...",loading:C,helperText:v.length>0?`${v.length} value(s) selected`:"Select at least one value"})),Q.default.createElement(m.Box,{sx:{display:"flex",gap:1,justifyContent:"flex-end"}},Q.default.createElement(m.Button,{variant:"outlined",size:"small",onClick:O,sx:{textTransform:"none",borderRadius:"6px"}},"Cancel"),Q.default.createElement(m.Button,{variant:"contained",size:"small",onClick:()=>(e=>{const t=r[e];if($(t.dimension)){if(!D&&!z)return;const a={};D&&(a.gte=D.format("YYYY-MM-DD")),z&&(a.lte=z.format("YYYY-MM-DD"));const r={...t,values:a};n(e,r)}else{if(0===v.length)return;const a={...t,values:v};n(e,a)}T(null),E([]),w([]),B(null),P(null)})(e),disabled:a?!D&&!z:0===v.length,sx:{textTransform:"none",borderRadius:"6px",backgroundColor:"rgb(70, 134, 128)",boxShadow:"none","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Save Changes"))))}))))},bt=({reportData:t,dimensions:a,metrics:r,loading:n,onPageChange:o,totalRows:l=0,titleOverrides:i={dimensions:{},metrics:{}}})=>{const[s,d]=e.useState({page:0,pageSize:50}),c=Q.default.useMemo(()=>{const e=[];return a.forEach(t=>{let a,r;if(t.relations&&t.relations.length>0){const e=t.fullPath.split("."),r=e[0],n=e[1],o=r.split("_");o.shift();const l=o.join("_");a=l?`${l}_${n}`:n}else a=t.fullPath.replace(".","_");r=i.dimensions[t.fullPath]||t.dimensionTitle||a,e.push({field:a,headerName:r,flex:1,minWidth:150})}),r.forEach(t=>{const a=t.metric;let r,n;if(t.relations&&t.relations.length>0){const e=t.fullPath.split("."),a=e[0],n=e[1],o=a.split("_");o.shift();const l=o.join("_");r=l?`${l}_${n}`:n}else r=t.metricName;n=i.metrics[t.fullPath]||t.metricTitle||r,e.push({field:r,headerName:n,flex:1,minWidth:150,type:"integer"===a?.type||"currency"===a?.type?"number":"string",valueFormatter:e=>{if(null==e)return"";if(a?.format){const t=ee.default(e).format(a.format);return a?.prefix?`${a.prefix} ${t}`:t}return e}})}),e},[a,r,i]),u=Q.default.useMemo(()=>t&&Array.isArray(t)?t.map((e,t)=>({id:t,...e})):[],[t]);return n?Q.default.createElement(m.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},Q.default.createElement(m.CircularProgress,null)):t&&0!==t.length?Q.default.createElement(m.Box,{sx:{height:600,width:"100%"}},Q.default.createElement(S.DataGrid,{rows:u,columns:c,paginationModel:s,onPaginationModelChange:e=>{d(e),o&&e.page!==s.page&&o(e.page,e.pageSize)},pageSizeOptions:[10,25,50,100],paginationMode:"server",rowCount:l||u.length,loading:n,disableRowSelectionOnClick:!0,sx:{"& .MuiDataGrid-cell":{padding:"8px"},"& .MuiDataGrid-columnHeader":{backgroundColor:"#f5f5f5",fontWeight:"bold"}}})):Q.default.createElement(m.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},Q.default.createElement(m.Typography,{variant:"body1",color:"textSecondary"},"No data available. Run a report to see results."))};function Et({children:e,value:t,index:a}){return Q.default.createElement("div",{role:"tabpanel",hidden:t!==a,id:`report-tabpanel-${a}`,"aria-labelledby":`report-tab-${a}`},t===a&&Q.default.createElement(m.Box,{sx:{py:3}},e))}const vt=({reportDefinitionId:t,cloneData:a,autoRun:r,onBackToList:n})=>{const o=ct(),l=it(),[i,s]=e.useState(null),[d,c]=e.useState(""),[u,f]=e.useState(""),[p,g]=e.useState({dimensions:[],metrics:[],filters:{}}),[h,y]=e.useState({dimensions:{},metrics:{},filters:{}}),[x,b]=e.useState(null),[E,v]=e.useState(!1),[w,S]=e.useState(0),[C,k]=e.useState(0),[R,T]=e.useState(50),[D,B]=e.useState(0),[z,P]=e.useState(!1),[F,M]=e.useState(!1);e.useEffect(()=>{(async()=>{const e=await Ke.getProviders();console.log({providers:e}),s(e)})()},[]),e.useEffect(()=>{t&&i&&$(t)},[t,i]),e.useEffect(()=>{a&&i&&j(a)},[a,i]),e.useEffect(()=>{r&&F&&d&&p.dimensions.length>0&&_()},[r,F]);const q=(e,t,a)=>{try{const[r,n]=e.split("."),o=r.split("_");let l=a;const i=[],s=[a],d=[];for(let e=1;e<o.length;e++){const a=o[e],r=t[l];if(!r||!r.relations)return console.warn(`Provider ${l} not found or has no relations`),null;const n=r.relations.find(e=>e.alias===a);if(!n)return console.warn(`Relation with alias ${a} not found in provider ${l}`),null;i.push(n),d.push(n.name),l=n.target,s.push(l)}const c=t[l];if(!c)return console.warn(`Final provider ${l} not found`),null;const u=c.default_alias;if(!c.dimensions||!c.dimensions[u])return console.warn(`Dimensions not found for alias ${u} in provider ${l}`),null;const f=c.dimensions[u][n];return f?{dimension:f,relations:i,providerPath:s,relationNames:d,dimensionKey:n,dimensionTitle:f.title||n,fullPath:e}:(console.warn(`Dimension ${n} not found in provider ${l}, alias ${u}`),null)}catch(t){return console.warn(`Error reconstructing dimension from path ${e}:`,t),null}},I=(e,t,a)=>{try{const[r,n]=e.split("."),o=r.split("_");let l=a;const i=[],s=[a],d=[];for(let e=1;e<o.length;e++){const a=o[e],r=t[l];if(!r||!r.relations)return console.warn(`Provider ${l} not found or has no relations`),null;const n=r.relations.find(e=>e.alias===a);if(!n)return console.warn(`Relation with alias ${a} not found in provider ${l}`),null;i.push(n),d.push(n.name),l=n.target,s.push(l)}const c=t[l];if(!c)return console.warn(`Final provider ${l} not found`),null;if(!c.metrics)return console.warn(`Metrics not found in provider ${l}`),null;const u=c.metrics.find(e=>e.name===n);return u?{metric:u,relations:i,providerPath:s,relationNames:d,metricName:n,metricTitle:u.title||n,fullPath:e}:(console.warn(`Metric ${n} not found in provider ${l}`),null)}catch(t){return console.warn(`Error reconstructing metric from path ${e}:`,t),null}},$=async e=>{try{console.log("Loading report definition:",e);const t=await Ke.getReportDefinition({id:e});console.log("Loaded report definition:",t),c(t.provider),f(t.title||"");const a=[],r={};if(t.definition?.doc?.query?.order_by)for(const e of t.definition.doc.query.order_by)!0===e.desc?r[e.name]="desc":r[e.name]="asc";if(t.definition?.doc?.query?.dimensions)for(const e of t.definition.doc.query.dimensions){const n=q(e,i,t.provider);n&&(n.sortOrder=r[e]||null,a.push(n))}const n=[];if(t.definition?.doc?.query?.metrics)for(const e of t.definition.doc.query.metrics){const a=I(e,i,t.provider);a&&n.push(a)}const o={dimensions:{},metrics:{},filters:{}};t.definition?.doc?.query?.titles&&(t.definition.doc.query.titles.dimensions&&(o.dimensions=t.definition.doc.query.titles.dimensions),t.definition.doc.query.titles.metrics&&(o.metrics=t.definition.doc.query.titles.metrics),t.definition.doc.query.titles.filters&&(o.filters=t.definition.doc.query.titles.filters));const l={};if(t.definition?.doc?.query?.filter){const e=t.definition.doc.query.filter;(e.and||e.or||[]).forEach(e=>{const[a,r]=Object.entries(e)[0],n=q(a,i,t.provider);n&&(l[a]={...n,values:r})})}g({dimensions:a,metrics:n,filters:l}),y(o),M(!0),console.log("Reconstructed report:",{dimensions:a,metrics:n,filters:l,titleOverrides:o})}catch(e){console.error("Error loading report definition:",e),o.error("Error loading report definition: "+(e.message||"Unknown error"))}},j=e=>{try{console.log("Loading cloned report:",e),c(e.provider),f(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 r of e.definition.doc.query.dimensions){const n=q(r,i,e.provider);n&&(n.sortOrder=a[r]||null,t.push(n))}const r=[];if(e.definition?.doc?.query?.metrics)for(const t of e.definition.doc.query.metrics){const a=I(t,i,e.provider);a&&r.push(a)}const n={dimensions:{},metrics:{},filters:{}};e.definition?.doc?.query?.titles&&(e.definition.doc.query.titles.dimensions&&(n.dimensions=e.definition.doc.query.titles.dimensions),e.definition.doc.query.titles.metrics&&(n.metrics=e.definition.doc.query.titles.metrics),e.definition.doc.query.titles.filters&&(n.filters=e.definition.doc.query.titles.filters));const o={};if(e.definition?.doc?.query?.filter){const t=e.definition.doc.query.filter;(t.and||t.or||[]).forEach(t=>{const[a,r]=Object.entries(t)[0],n=q(a,i,e.provider);n&&(o[a]={...n,values:r})})}g({dimensions:t,metrics:r,filters:o}),y(n),console.log("Loaded cloned report:",{dimensions:t,metrics:r,filters:o,titleOverrides:n})}catch(e){console.error("Error loading cloned report:",e),o.error("Error loading cloned report: "+(e.message||"Unknown error"))}},A=(e=0,t=50)=>{const a=p.dimensions.map(e=>{const t={name:e.fullPath};return"desc"===e.sortOrder&&(t.desc=!0),t}),r=[];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&&r.push({[e]:t.values}):"object"==typeof t.values&&r.push({[e]:t.values}))});const n=r.length>0?{and:r}:null,o={};Object.keys(h.dimensions).length>0&&(o.dimensions=h.dimensions),Object.keys(h.metrics).length>0&&(o.metrics=h.metrics),Object.keys(h.filters).length>0&&(o.filters=h.filters);const i={dimensions:p.dimensions.map(e=>e.fullPath),metrics:p.metrics.map(e=>e.fullPath),order_by:a,limit:t,offset:e*t};Object.keys(o).length>0&&(i.titles=o),n&&(i.filter=n);return{provider:d,doc:{query:i},parameters:l?.parameters||{base_currency:"EUR"}}},O=async(e,t)=>{try{v(!0);const a=A(e,t);console.log("Running report with:",a);const r=await Ke.runAdHocReport({report:a});console.log("Report result:",r),b(r),r&&r.length<t?S(e*t+r.length):S((e+2)*t)}catch(e){console.error("Error running report:",e),o.error("Error running report: "+(e.message||"Unknown error")),b(null)}finally{v(!1)}},_=async()=>{k(0),await O(0,R),B(3)},W=d,N=d&&u.trim()&&(p.dimensions.length>0||p.metrics.length>0);return Q.default.createElement(m.Box,{sx:{p:3,fontFamily:"system-ui"}},Q.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:2,backgroundColor:"transparent",fontFamily:"system-ui"}},Q.default.createElement("h1",null,t?"Edit Report":"Create New Report"),n&&Q.default.createElement(m.Button,{variant:"outlined",startIcon:Q.default.createElement(we.default,null),onClick:n},"Back to List")),Q.default.createElement(m.Box,{sx:{mt:2,p:3,backgroundColor:"white",borderRadius:"12px",border:"1px solid #e0e0e0",fontFamily:"system-ui",display:"flex",flexDirection:"column",gap:3,boxShadow:"0px 2px 4px rgba(0,0,0,0.02)"}},Q.default.createElement(m.Box,{sx:{display:"flex",gap:4,alignItems:"flex-start",flexWrap:"wrap"}},Q.default.createElement("div",null,Q.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1,color:"rgb(37, 37, 37)"}},"Report Title"),Q.default.createElement(m.TextField,{value:u,onChange:e=>f(e.target.value),placeholder:"Enter report title",sx:{width:"400px",fontFamily:"system-ui","& .MuiOutlinedInput-root":{backgroundColor:"white",borderRadius:"8px"}},size:"small"})),Q.default.createElement("div",null,Q.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1,color:"rgb(37, 37, 37)"}},"Select Root Provider"),Q.default.createElement(Xe,{items:i?Object.keys(i).filter(e=>!0===i[e].base).map(e=>({key:e,value:i[e].name||e})):[],value:d,onChange:e=>{c(e.target.value),g({dimensions:[],metrics:[],filters:{}}),y({dimensions:{},metrics:{},filters:{}}),console.log("Selected root provider:",e.target.value)},sx:{width:"300px",fontFamily:"system-ui"},disabled:!!t}))),Q.default.createElement(m.Box,{sx:{display:"flex",gap:2,alignItems:"center"}},Q.default.createElement(m.Button,{variant:"contained",onClick:_,disabled:!W,startIcon:Q.default.createElement(Ee.default,null),sx:{height:"40px",fontFamily:"system-ui",borderRadius:"8px",boxShadow:"none",textTransform:"none",backgroundColor:"rgb(70, 134, 128)",fontWeight:500,padding:"0 20px","&:hover":{backgroundColor:"rgb(46, 102, 98)",boxShadow:"none"}}},"Run Report"),Q.default.createElement(m.Button,{variant:"outlined",startIcon:Q.default.createElement(Ce.default,null),onClick:async()=>{try{v(!0);const e=A();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}),o.success("Report downloaded successfully!")}catch(e){console.error("Error downloading report:",e),o.error("Error downloading report: "+(e.message||"Unknown error"))}finally{v(!1)}},disabled:!W||E,sx:{height:"40px",fontFamily:"system-ui",borderRadius:"8px",boxShadow:"none",textTransform:"none",color:"#9c27b0",borderColor:"#e1bee7",fontWeight:500,padding:"0 20px","&:hover":{borderColor:"#9c27b0",backgroundColor:"rgba(156, 39, 176, 0.04)"}}},"Download CSV"),Q.default.createElement(m.Button,{variant:"outlined",startIcon:Q.default.createElement(Se.default,null),onClick:async()=>{if(d)if(u.trim())if(0!==p.dimensions.length||0!==p.metrics.length)try{P(!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 r={dimensions:p.dimensions.map(e=>e.fullPath),metrics:p.metrics.map(e=>e.fullPath),order_by:e};if(Object.keys(a).length>0&&(r.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&&(r.filter={and:e})}const l={query:r},i={provider:d,title:u.trim(),definition:{provider:d,doc:l,parameters:{base_currency:"EUR"}}};console.log("Saving report definition:",i),t?(await Ke.updateReportDefinition({id:t,reportDefinition:i}),o.success("Report definition updated successfully!")):(await Ke.createReportDefinition({reportDefinition:i}),o.success("Report definition created successfully!")),n&&n()}catch(e){console.error("Error saving report definition:",e),o.error("Error saving report definition: "+(e.message||"Unknown error"))}finally{P(!1)}else o.warning("Please add at least one dimension or metric");else o.warning("Please enter a report title");else o.warning("Please select a provider first")},disabled:!N||z,sx:{height:"40px",fontFamily:"system-ui",borderRadius:"8px",boxShadow:"none",textTransform:"none",color:"#2e7d32",borderColor:"#a5d6a7",fontWeight:500,padding:"0 20px","&:hover":{borderColor:"#2e7d32",backgroundColor:"rgba(46, 125, 50, 0.04)"}}},z?"Saving...":t?"Update Report":"Save Report"))),d&&Q.default.createElement(m.Box,{sx:{mt:2,fontFamily:"system-ui",backgroundColor:"white",px:3,py:2,borderRadius:"8px"}},Q.default.createElement(m.Box,{sx:{borderBottom:1,borderColor:"rgba(70, 134, 127, 0.27)"}},Q.default.createElement(m.Tabs,{value:D,onChange:(e,t)=>{B(t)},"aria-label":"report builder tabs",sx:{"& .MuiTabs-indicator":{display:"flex",justifyContent:"center",backgroundColor:"rgb(70, 134, 128)"},"& .MuiTabs-indicatorSpan":{backgroundColor:"rgb(70, 134, 128)"}}},Q.default.createElement(m.Tab,{label:Q.default.createElement(m.Badge,{badgeContent:p.dimensions.length,sx:{"& .MuiBadge-badge":{backgroundColor:"rgb(70, 134, 128)",color:"#fff"}}},Q.default.createElement("span",{style:{marginRight:p.dimensions.length>0?"12px":"0"}},"Dimensions")),id:"report-tab-0","aria-controls":"report-tabpanel-0",sx:{height:"41px",fontFamily:"system-ui",borderRadius:"0.5rem",boxShadow:"none",textTransform:"none",color:"rgb(37, 37, 37)","&.Mui-selected":{color:"rgb(70, 134, 128)"}}}),Q.default.createElement(m.Tab,{label:Q.default.createElement(m.Badge,{badgeContent:p.metrics.length,sx:{"& .MuiBadge-badge":{backgroundColor:"rgb(70, 134, 128)",color:"#fff"}}},Q.default.createElement("span",{style:{marginRight:p.metrics.length>0?"12px":"0"}},"Metrics")),id:"report-tab-1","aria-controls":"report-tabpanel-1",sx:{height:"41px",fontFamily:"system-ui",borderRadius:"0.5rem",boxShadow:"none",textTransform:"none",color:"rgb(37, 37, 37)","&.Mui-selected":{color:"rgb(70, 134, 128)"}}}),Q.default.createElement(m.Tab,{label:Q.default.createElement(m.Badge,{badgeContent:Object.keys(p.filters).length,sx:{"& .MuiBadge-badge":{backgroundColor:"rgb(70, 134, 128)",color:"#fff"}}},Q.default.createElement("span",{style:{marginRight:Object.keys(p.filters).length>0?"12px":"0"}},"Filters")),id:"report-tab-2","aria-controls":"report-tabpanel-2",sx:{height:"41px",fontFamily:"system-ui",borderRadius:"0.5rem",boxShadow:"none",textTransform:"none",color:"rgb(37, 37, 37)","&.Mui-selected":{color:"rgb(70, 134, 128)"}}}),Q.default.createElement(m.Tab,{label:x?"Results":"Results (Run report first)",id:"report-tab-3","aria-controls":"report-tabpanel-3",disabled:!x,sx:{height:"41px",fontFamily:"system-ui",borderRadius:"0.5rem",boxShadow:"none",textTransform:"none",color:"rgb(37, 37, 37)","&.Mui-selected":{color:"rgb(70, 134, 128)"}}}))),Q.default.createElement(Et,{value:D,index:0},Q.default.createElement(gt,{providersData:i,rootProvider:d,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})),Q.default.createElement(Et,{value:D,index:1},Q.default.createElement(yt,{providersData:i,rootProvider:d,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})),Q.default.createElement(Et,{value:D,index:2},Q.default.createElement(xt,{providersData:i,rootProvider:d,savedFilters:p.filters,existingDimensions:p.dimensions,existingMetrics:p.metrics,onSaveFilter:(e,t)=>{g(a=>{const r={...a,filters:{...a.filters,[e]:t}};return console.log("Filter saved:",{fullPath:e,filterData:t}),console.log("Complete report:",r),r})},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}})}})),Q.default.createElement(Et,{value:D,index:3},x&&Q.default.createElement(bt,{reportData:x,dimensions:p.dimensions,metrics:p.metrics,loading:E,onPageChange:async(e,t)=>{k(e),t!==R&&T(t),await O(e,t)},totalRows:w,titleOverrides:h}))))},wt=()=>{const[t,a]=e.useState("list"),[r,n]=e.useState(null),[o,l]=e.useState(null),[i,s]=e.useState(!1),[d,c]=e.useState(0),u=e=>{n(e),l(null),s(!1),a("builder")},f=()=>{n(null),l(null),s(!1),a("builder")},m=e=>{n(e),l(null),s(!0),a("builder")},p=e=>{n(null),l(e),s(!1),a("builder")};return"list"===t?Q.default.createElement(ft,{onSelectReport:u,onAddNew:f,onCloneReport:p,onRunReport:m,refreshTrigger:d}):Q.default.createElement(vt,{reportDefinitionId:r,cloneData:o,autoRun:i,onBackToList:()=>{n(null),l(null),s(!1),a("list"),c(e=>e+1)}})};var St={Chart:nt,Dashboard:function({id:t="sample_dashboard",api:a,params:r}){const n=it(),o=a||n?.api||{},l=r||n?.parameters||{},[i,s]=Q.default.useState(),[d]=Q.default.useState(),[c,u]=Q.default.useState([]),f=Q.default.useRef({}),m=at();rt(m),console.log({rows:c},{dashboard:i},{schema:d},{params:l}),e.useEffect(()=>{Ke.setBaseUrl(o.base_url),Ke.setToken(o.token)},[o]);const p=async e=>{const t=e?.doc?.rows||[],a=[];for(let e=0;e<t.length;e++){const r=t[e];r.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(r)}u(a)};return Q.default.useEffect(()=>{t&&(async()=>{Ke.setBaseUrl(o.base_url),Ke.setToken(o.token),await Ke.loadDashboardMeta({dashboardId:t});const e=await Ke.getDashboard({id:t});f.current[e?.id]=e,s(e),await p(e)})().catch(e=>console.error(e.message))},[t]),Q.default.createElement(ge.default,{maxWidth:!1,disableGutters:!0},Q.default.createElement(pe.default,{container:!0,spacing:3},c?.map((e,t)=>{const a=(e=>0===e?12:12/e)(e.columns.length);return Q.default.createElement(Q.default.Fragment,{key:t},1===t?Q.default.createElement(pe.default,{item:!0,xs:12},Q.default.createElement(pe.default,{container:!0,spacing:3},e.columns.map((e,t)=>Q.default.createElement(pe.default,{key:t,item:!0,xs:12,md:a},Q.default.createElement(nt,{api:o,cache:f.current,id:e.id,dashboard:i,schema:d,title:e.title,filter:e.filter,params:l}))))):e.columns.map((e,t)=>Q.default.createElement(pe.default,{key:t,item:!0,xs:12,md:a},Q.default.createElement(nt,{api:o,cache:f.current,id:e.id,dashboard:i,schema:d,title:e.title,filter:e.filter,params:l}))))})))},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]),Q.default.createElement(dt,null,Q.default.createElement(lt,{defaultParameters:t,defaultApi:a},Q.default.createElement(V.ThemeProvider,{theme:V.createTheme({palette:{primary:{main:"rgb(70, 134, 128)"}},components:{MuiButton:{styleOverrides:{root:{borderRadius:8,textTransform:"none",boxShadow:"none","&:hover":{boxShadow:"none"}}}},MuiTooltip:{styleOverrides:{tooltip:{fontSize:"0.875rem",backgroundColor:"rgba(97, 97, 97, 0.95)",maxWidth:500},arrow:{color:"rgba(97, 97, 97, 0.95)"}},defaultProps:{arrow:!0,enterDelay:300,leaveDelay:200}},MuiPopper:{defaultProps:{style:{zIndex:1500}}}}})},Q.default.createElement(wt,null)))))};exports.default=St;
|
|
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"),r=require("@material-ui/core"),n=require("react-google-charts"),l=require("numeral"),o=require("axios"),i=require("@material-ui/core/Typography"),s=require("nunjucks"),d=require("@material-ui/core/FormControl"),c=require("@material-ui/core/Select"),u=require("@material-ui/core/MenuItem"),f=require("react-intersection-observer"),m=require("@mui/material"),p=require("@mui/icons-material/CheckBoxOutlineBlank"),g=require("@mui/icons-material/CheckBox"),h=require("@mui/material/Box"),y=require("@mui/material/MenuItem"),x=require("@mui/material/FormControl"),b=require("@mui/material/Select"),E=require("eventemitter3"),v=require("@material-ui/core/Grid"),w=require("@material-ui/core/Container"),C=require("@mui/x-data-grid"),S=require("@mui/icons-material/Add"),k=require("@mui/icons-material/Edit"),T=require("@mui/icons-material/ContentCopy"),R=require("@mui/icons-material/Delete"),D=require("@mui/icons-material/PlayArrow"),B=require("@mui/icons-material/Restore"),P=require("@mui/icons-material/ArrowBack"),z=require("@mui/icons-material/Save"),F=require("@mui/icons-material/Download"),M=require("@dnd-kit/core"),I=require("@dnd-kit/sortable"),q=require("@dnd-kit/utilities"),$=require("@mui/icons-material/DragIndicator"),A=require("@mui/icons-material/ArrowUpward"),j=require("@mui/icons-material/ArrowDownward"),O=require("@mui/icons-material/Sort"),_=require("@mui/icons-material/Check"),W=require("@mui/icons-material/Close"),N=require("@mui/icons-material/RestartAlt"),K=require("@mui/icons-material/PlaylistAdd"),U=require("@mui/icons-material/FilterAlt"),Y=require("@mui/icons-material/InfoOutlined"),L=require("@mui/x-date-pickers/LocalizationProvider"),G=require("@mui/x-date-pickers/DatePicker"),H=require("@mui/x-date-pickers/AdapterDayjs"),V=require("dayjs"),Z=require("@mui/material/styles");function J(e){return e&&e.__esModule?e:{default:e}}function Q(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(a){if("default"!==a){var r=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,r.get?r:{enumerable:!0,get:function(){return e[a]}})}}),t.default=e,Object.freeze(t)}var X=Q(e),ee=J(t),te=J(l),ae=J(o),re=J(i),ne=J(s),le=J(d),oe=J(c),ie=J(u),se=J(p),de=J(g),ce=J(h),ue=J(y),fe=J(x),me=J(b),pe=J(E),ge=J(v),he=J(w),ye=J(S),xe=J(k),be=J(T),Ee=J(R),ve=J(D),we=J(B),Ce=J(P),Se=J(z),ke=J(F),Te=J($),Re=J(A),De=J(j),Be=J(O),Pe=J(_),ze=J(W),Fe=J(N),Me=J(K),Ie=J(U),qe=J(Y),$e=J(V);function Ae(){return Ae=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var r in a)({}).hasOwnProperty.call(a,r)&&(e[r]=a[r])}return e},Ae.apply(null,arguments)}const je=a.makeStyles(e=>({root:{width:"100%","& > * + *":{marginTop:e.spacing(2)}}}));function Oe(e){const t=je();return X.default.createElement("div",Ae({className:t.root},e),X.default.createElement(r.CircularProgress,{style:{color:"rgb(70, 134, 128)"},size:25}))}function _e(e,t,a="array"){const r=e.columns,n=[...t.doc.metrics,...t.doc.dimensions].reduce((e,t)=>(e[t.name]=t,e),{});return e=>{const t="array"===a?[]:{};return r.reduce((t,r)=>{const l=e[r.name],o=n[r.name];let i=l;return i="timestamp"===o.type?new Date(l):o.format?o.format&&o.prefix?{v:+l,f:o.prefix+" "+te.default(l).format(o.format)}:o.format?{v:+l,f:te.default(l).format(o.format)}:l:l,"array"===a?t.push(i):t[r.name]=i?.f||i,t},t)}}const We="https://report-api.netcapital.pro",Ne=ae.default.create({baseURL:We,headers:{"Content-Type":"application/json"}}),Ke={},Ue=()=>{const e=Object.keys(Ke);return e.length>0?e[0]:null},Ye={setBaseUrl(e){Ne.defaults.baseURL=e||We},setToken(e){e&&(Ne.defaults.headers.common.Authorization=`Bearer ${e}`)},loadDashboardMeta:async({dashboardId:e})=>{const{data:t}=await Ne.get(`/dashboard-meta/${e}`);return Ke[e]={dashboards:t.dashboards||{},charts:t.charts||{},reports:t.reports||{},reportMetadata:t.reportMetadata||{},dateRanges:t.dateRanges||[]},Ke[e]},getDashboard:async({id:e,dashboardId:t})=>{const a=t||Ue();if(a&&Ke[a]?.dashboards?.[e])return Ke[a].dashboards[e];const{data:r}=await Ne.get(`/entity/dashboards/${e}`);return r},getChart:async({id:e,dashboardId:t})=>{const a=t||Ue();if(a&&Ke[a]?.charts?.[e])return Ke[a].charts[e];const{data:r}=await Ne.get(`/entity/charts/${e}`);return r},getReport:async({id:e,dashboardId:t})=>{const a=t||Ue();if(a&&Ke[a]?.reports?.[e])return Ke[a].reports[e];const{data:r}=await Ne.get(`/entity/reports/${e}`);return r},getProviders:async()=>{const{data:e}=await Ne.get("/entity/providers");return e},getReportSchema:async({id:e,dashboardId:t,query:a={}})=>{const r=t||Ue();if(r&&Ke[r]?.reportMetadata?.[e])return Ke[r].reportMetadata[e];const{data:n}=await Ne.post(`/reports/${e}/metadata`,a);return n},runReport:async({id:e,query:t={}})=>{const{data:a}=await Ne.post(`/reports/${e}/run`,t);return a},runAdHocReport:async({report:e})=>{const{data:t}=await Ne.post("/report-build/run",e);return t},downloadAdHocReport:async({report:e,filename:t})=>{const a=await Ne.post("/report-build/run?download=csv",e,{responseType:"blob"}),r=window.URL.createObjectURL(new Blob([a.data])),n=document.createElement("a");n.href=r;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])}}n.setAttribute("download",l),document.body.appendChild(n),n.click(),n.remove(),window.URL.revokeObjectURL(r)},getDateRanges:async({dashboardId:e}={})=>{const t=e||Ue();if(t&&Ke[t]?.dateRanges)return Ke[t].dateRanges;const{data:a}=await Ne.get("/globals/date-ranges");return a},getReportDefinitions:async()=>{const{data:e}=await Ne.get("/report-definitions");return e},getReportDefinition:async({id:e})=>{const{data:t}=await Ne.get(`/report-definitions/${e}`);return t},createReportDefinition:async({reportDefinition:e})=>{const{data:t}=await Ne.post("/report-definitions",e);return t},updateReportDefinition:async({id:e,reportDefinition:t})=>{const{data:a}=await Ne.put(`/report-definitions/${e}`,t);return a},deleteReportDefinition:async({id:e})=>{const{data:t}=await Ne.delete(`/report-definitions/${e}`);return t}},Le=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"}})),Ge={none:"YYYY-MM-dd",day:"MMM dd",week:"MMM dd",month:"YYYY MMM",year:"YYYY"};const He={GoogleChart:function({chart:t,source:a,view:r,report:l,schema:o,dashboard:i,query:s}){const[d,c]=X.default.useState([]),u=Le(),[f,m]=X.default.useState([]);e.useEffect(()=>{(async()=>{const e=await Ye.getDateRanges();m(e)})()},[]);const p=e.useMemo(()=>{const e="YYYY-MM-dd",t=s?.date_range?.name,a=f.find(e=>e.name===t);if(!a)return e;return Ge[a?.granularity]||e},[f,s]);return X.default.useEffect(()=>{if(!(t&&r&&a&&l&&o))return;let e=[];e.push(function(e,t){const a=[...t.doc.metrics,...t.doc.dimensions];return e.columns.reduce((e,t)=>{const r=a.find(e=>e.name===t.name)||t;return e.push(r.title||r.name),e},[])}(r,o));const n=_e(r,o);a?.forEach(t=>{const a=n(t);e.push(a)}),a?.length?c(e):c()},[t,a,r,l,o]),d?X.default.createElement("div",{style:{}},X.default.createElement(n.Chart,Ae({width:t?.doc.size?.width||"100%",chartType:t?.doc.chart?.type,data:d,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 r=t?.doc.chart?.options?.hAxis||{},n={...{ticks:e.slice(1).map(e=>e[0]),format:p},...r};return{...t?.doc.chart?.options,hAxis:n,focusTarget:"category",colors:a}}return{...t?.doc.chart?.options,colors:a}})(d)},t?.doc.chart?.props))):X.default.createElement("div",null)},LabelChart:function({chart:e,source:t,view:a,report:r,schema:n}){const[l,o]=X.default.useState([]),[i,s]=X.default.useState(),[d,c]=X.default.useState();return X.default.useEffect(()=>{if(!(e&&a&&t&&r&&n))return;let l=[];const i=_e(a,n);t.forEach(e=>l.push(i(e))),o(l);const d=e?.doc?.chart?.options||{},u=d?.index||0;if(l.length>0&&s(l[0][u]),d.subText?.format){ne.default.configure({autoescape:!1});const e=_e(a,n,"object")(t[0]),r=ne.default.renderString(d.subText?.format,e);c(r)}},[e,t,a,r,n]),X.default.createElement("div",{style:{display:"flex",justifyContent:"center",alignContent:"center",height:"100%",flexDirection:"column"}},X.default.createElement(re.default,{variant:"h6"},i?.f||i),X.default.createElement(re.default,{variant:"caption"},d))}};function Ve(e,t){return void 0!==He[e]?X.default.createElement(He[e],t):X.default.createElement(Oe,t)}const Ze=X.createElement(se.default,{fontSize:"small"}),Je=X.createElement(de.default,{fontSize:"small"});function Qe({items:t,selectedKeys:a,defaultSelectedKeys:r,onChange:n,inputValue:l,defaultInputValue:o,onInputChange:i,onInputChangeImmediate:s,debounceMs:d=300,label:c,placeholder:u,loading:f,disabled:p,size:g="small",error:h,helperText:y,limitTags:x=3,disableClearable:b,id:E,textFieldProps:v}){const w=e.useMemo(()=>Array.isArray(t)?t:[],[t]),C=Array.isArray(a),[S,k]=e.useState(Array.isArray(r)?r:[]),T=C?a:S,R=e.useMemo(()=>{const e=new Map;for(const t of w)e.set(t&&t.key,t);return e},[w]),D=e.useMemo(()=>(Array.isArray(T)?T:[]).map(e=>R.get(e)).filter(Boolean),[T,R]),B="string"==typeof l,[P,z]=e.useState("string"==typeof o?o:""),F=B?l:P,M=function(t,a=300){const r=e.useRef(t),n=e.useRef(null);return r.current=t,e.useEffect(()=>()=>{n.current&&window.clearTimeout(n.current)},[]),X.useCallback((...e)=>{r.current&&(n.current&&window.clearTimeout(n.current),n.current=window.setTimeout(()=>{r.current&&r.current(...e)},a))},[a])}(e=>{i&&i(e)},d),I=D;return X.createElement(m.FormControl,{fullWidth:!0,error:h,disabled:p},X.createElement(m.Autocomplete,{openOnFocus:!0,forcePopupIcon:!0,id:E,multiple:!0,disableCloseOnSelect:!0,options:w,value:I,inputValue:F,getOptionLabel:e=>e&&"object"==typeof e?e.value??"":"",isOptionEqualToValue:(e,t)=>e&&t&&e.key===t.key,loading:f,limitTags:x,disableClearable:b,onChange:(e,t)=>{const a=Array.isArray(t)?t.map(e=>e&&e.key):[];C||k(a),n&&n(a,Array.isArray(t)?t:[])},onInputChange:(e,t,a)=>{if(B||z(t??""),"input"===a||"clear"===a){s&&s("clear"===a?"":t??"")}"input"===a?M(t??""):"clear"===a&&M("")},renderOption:(e,t,{selected:a})=>X.createElement("li",Ae({},e,{key:t&&t.key||Math.random().toString(36)}),X.createElement(m.Checkbox,{icon:Ze,checkedIcon:Je,style:{marginRight:8},checked:!!a}),t&&t.value),renderTags:(e,t)=>(Array.isArray(e)?e:[]).map((e,a)=>X.createElement(m.Chip,Ae({},t({index:a}),{key:e&&e.key||a,label:e&&e.value||""}))),renderInput:e=>X.createElement(m.TextField,Ae({},e,{label:c,placeholder:u,InputProps:{...e.InputProps,endAdornment:X.createElement(X.Fragment,null,f?X.createElement(m.CircularProgress,{size:18}):null,e.InputProps.endAdornment)},size:g},v))}),y?X.createElement(m.FormHelperText,null,y):null)}const Xe=({filter:t,channel:a,query:r})=>{const[n,l]=e.useState([]),[o,i]=e.useState([]),[s,d]=e.useState(!1),[c,u]=e.useState("");return e.useEffect(()=>{i(r?.filter?.[t?.filter]||[])},[r]),e.useEffect(()=>{(async()=>{d(!0);const e=await async function(e,t){return t?.source?(await Ye.runReport({id:t.source})).map(e=>({key:e[t.field],value:e[t.field]})):[]}(0,t);l(e),d(!1)})()},[c]),X.default.createElement("div",{style:{display:"flex"}},X.default.createElement("div",{style:{maxWidth:640,minWidth:200}},X.default.createElement(Qe,{id:t?.title,label:t?.title,placeholder:"Type to search…",items:n,selectedKeys:o,onChange:(e,r)=>{i(e),a.emit("filterChanged",t,{[t.filter]:e})},onInputChange:e=>{u(e)},loading:s,debounceMs:300,helperText:o.length?`${o.length} selected`:""})))},et=e=>e?.replace(/([a-z])([A-Z])/g,"$1 $2")?.replace(/_/g," ")?.replace(/-/g," ").replace(/\b\w/g,e=>e.toUpperCase());function tt({items:e,value:t,onChange:a,sx:r={width:"100%"},disabled:n=!1,label:l}){const o=e.some(e=>e.key===t)?t:"";return X.default.createElement(ce.default,{sx:r},X.default.createElement(fe.default,{fullWidth:!0,size:"small"},X.default.createElement(me.default,{value:o,onChange:a,disabled:n,displayEmpty:!0,MenuProps:{style:{maxHeight:300}},sx:{height:"40px",borderRadius:"8px",fontFamily:"system-ui",backgroundColor:"white","& .MuiSelect-select":{display:"flex",alignItems:"center",padding:"8px 12px"},"& fieldset":{borderColor:"rgba(0,0,0,0.23)"},"&:hover fieldset":{borderColor:"rgb(70, 134, 128) !important"},"&.Mui-focused fieldset":{borderColor:"rgb(70, 134, 128) !important"}}},X.default.createElement(ue.default,{value:"",disabled:!0,sx:{color:"rgba(37, 37, 37, 0.58)"}},et(l)),e.map(e=>{const{key:t,value:a,disabled:r}=e;return X.default.createElement(ue.default,{key:t,value:t,disabled:r,sx:{fontFamily:"system-ui",minHeight:"36px"}},et(a))}))))}const at=({filter:t,channel:a,query:r})=>{const[n,l]=e.useState([]),[o,i]=e.useState("");return e.useEffect(()=>{i(r?.date_range?.name)},[r]),e.useEffect(()=>{(async()=>{const e=(await Ye.getDateRanges()).filter(e=>!(t.allowedOptions.length>0)||t.allowedOptions.some(t=>t===e.name)).map(e=>({key:e.name,value:e.title}));l(e)})()},[]),X.default.createElement("div",{style:{minWidth:"200px",maxWidth:"640px"}},X.default.createElement(tt,{items:n,value:o,label:t?.title,onChange:(e,r)=>{const n=e.target.value;i(n),a.emit("filterChanged",t,{date_range:{name:n}})}}))},rt=({filters:e=[],channel:t,query:a})=>X.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px"}},e.map(e=>"multi-select"===e.type?X.default.createElement(Xe,{key:e.title,channel:t,filter:e,query:a}):"date-range"===e.type?X.default.createElement(at,{key:e.title,channel:t,filter:e,query:a}):null));var nt=e=>X.default.useRef(e||new pe.default).current,lt=e=>{const t=X.default.useState({}),a=X.default.useCallback((a,r)=>{let n={...t.current,...r};for(var l in t.current=n,n)"date_range"===l||n[l].length||delete n[l];e?.emit("mergedFilterChanged",{value:n})},[e]);X.default.useEffect(()=>(e?.on("filterChanged",a),()=>{e?.off("filterChanged",a)}),[e])},ot=({id:e,cache:t,dashboard:a,channel:r,...n})=>{const[l,o]=X.default.useState(),[i,s]=X.default.useState(),[d,c]=X.default.useState(),[u,m]=X.default.useState(),[p,g]=X.default.useState(Ve()),[h,y]=X.default.useState(),[x,b]=X.default.useState(0),[E,v]=X.default.useState(!1),[w,C]=X.default.useState(),[S,k]=X.default.useState(!1),T=X.default.useRef({value:n?.filter}),[R,D]=X.default.useState({}),{ref:B,inView:P,entry:z}=f.useInView({threshold:.1,delay:1e3}),F=nt(r);lt(F);const M=X.default.useCallback(e=>{const t=e.target.value;b(t),y(l.doc.view[t])},[l]);X.default.useEffect(()=>{e&&(async()=>{const a=e,r=t?.[a]||await Ye.getChart({id:a}),l=r.doc.source?.id,i=l?t?.[l]||await Ye.getReport({id:l}):void 0,d=t?.[`schema_${l}`]||n?.schema||await Ye.getReportSchema({id:l}),u=r.doc?.view?.[0];b(0),s(i),o(r),y(u),c(d),k(!0)})().catch(e=>{console.error(e.message)})},[e]),X.default.useEffect(()=>{l&&u&&(!l?.doc?.source?.id||i)&&d&&(async()=>{g(Ve(l.doc.chart?.component,{view:h,source:u,chart:l,report:i,schema:d,dashboard:a,query:R}))})().catch(e=>{console.error(e.message)})},[l,u,h,i,d]);const I=e=>{const t={...i?.doc.query.filter||{},...n?.filter,...e?.value},a=t.date_range||i?.doc.query.date_range;if(delete t.date_range,k(!1),C(),v(!0),"context"===l?.doc?.source?.type)return m({filter:t}),void v(!1);const r={filter:t,date_range:a,parameters:n?.params};D(r),Ye.runReport({id:i.id,query:r}).then(e=>{m(l.doc.source.reverse?e.reverse():e)}).catch(e=>{m([])}).finally(()=>{v(!1)})},q=e=>{T.current=e,P?I(e):(C(e),k(!0))};return X.default.useEffect(()=>(F?.on("mergedFilterChanged",q),()=>{F?.off("mergedFilterChanged",q)}),[F,i,l,P]),X.default.useEffect(()=>{P&&S&&I(w)},[P,S]),X.default.useEffect(()=>{k(!0)},[n.params]),X.default.createElement(ee.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&&X.default.createElement("div",{style:{display:"flex",alignItems:"center",lineHeight:0}},X.default.createElement(re.default,{variant:"subtitle2",style:{fontWeight:600,color:"#252525"}},n?.title||l.doc.name," ")),E?X.default.createElement(Oe,{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100%",width:"100%"}}):X.default.createElement(X.default.Fragment,null,X.default.createElement("div",{style:{display:"flex"}},X.default.createElement("div",{style:{flexGrow:1}}),X.default.createElement("div",null,l?.doc?.view?.length>1&&X.default.createElement(le.default,null,X.default.createElement(oe.default,{labelId:"date-range-select-label",id:"date-range-select",value:x,onChange:M,style:{fontSize:"12px"},disableUnderline:!0},l.doc.view.map((e,t)=>X.default.createElement(ie.default,{key:t,value:t},e.title)))))),X.default.createElement("div",{style:{position:"relative",flexGrow:a?void 0:1,display:"flex",flexDirection:"column"}},X.default.createElement(rt,{filters:l?.doc?.filters,channel:F,query:R}),p)))};const it=e.createContext(void 0),st=({defaultParameters:t={},defaultApi:a={},children:r})=>{const n={base_currency:"EUR",...t},[l,o]=e.useState(n),[i,s]=e.useState(a);e.useEffect(()=>{const e={base_currency:"EUR",...t};o(e)},[t]),e.useEffect(()=>{s(a)},[a]);const d={parameters:l,setParameters:e=>{const t={base_currency:"EUR",...e};o(t)},api:i,setApi:s,setReportingContext:({parameters:e,api:t})=>{if(void 0!==e){const t={base_currency:"EUR",...e};o(t)}void 0!==t&&s(t)}};return X.default.createElement(it.Provider,{value:d},r)},dt=()=>e.useContext(it);const ct=e.createContext(),ut=({children:t})=>{const[a,r]=e.useState({open:!1,message:"",severity:"info",duration:6e3}),n=(e,t="info",a=6e3)=>{r({open:!0,message:e,severity:t,duration:a})},l=(e,t)=>{"clickaway"!==t&&r(e=>({...e,open:!1}))},o={success:(e,t)=>n(e,"success",t),error:(e,t)=>n(e,"error",t),warning:(e,t)=>n(e,"warning",t),info:(e,t)=>n(e,"info",t)};return X.default.createElement(ct.Provider,{value:o},t,X.default.createElement(m.Snackbar,{open:a.open,autoHideDuration:a.duration,onClose:l,anchorOrigin:{vertical:"top",horizontal:"right"}},X.default.createElement(m.Alert,{onClose:l,severity:a.severity,variant:"filled",sx:{width:"100%"}},a.message)))},ft=()=>{const t=e.useContext(ct);if(!t)throw new Error("useNotify must be used within a NotifyProvider");return t},mt=({open:e,title:t="Confirm Action",message:a,onConfirm:r,onCancel:n,confirmText:l="Confirm",cancelText:o="Cancel",confirmColor:i="error"})=>X.default.createElement(m.Dialog,{open:e,onClose:n,"aria-labelledby":"confirm-dialog-title","aria-describedby":"confirm-dialog-description"},X.default.createElement(m.DialogTitle,{id:"confirm-dialog-title"},t),X.default.createElement(m.DialogContent,null,X.default.createElement(m.DialogContentText,{id:"confirm-dialog-description"},a)),X.default.createElement(m.DialogActions,null,X.default.createElement(m.Button,{onClick:n,variant:"outlined"},o),X.default.createElement(m.Button,{onClick:r,variant:"contained",color:i,autoFocus:!0},l))),pt=({onSelectReport:t,onAddNew:a,onCloneReport:r,onRunReport:n,refreshTrigger:l})=>{const o=ft(),[i,s]=e.useState([]),[d,c]=e.useState(!0),[u,f]=e.useState(null),[p,g]=e.useState(!1),[h,y]=e.useState(null);e.useEffect(()=>{x()},[l]);const x=async()=>{try{c(!0),f(null);const e=await Ye.getReportDefinitions();s(e)}catch(e){console.error("Error loading report definitions:",e);const t="Failed to load report definitions: "+(e.message||"Unknown error");f(t),o.error(t)}finally{c(!1)}},b=(e,t)=>{t.stopPropagation();const a=i.find(t=>t.id===e);y(a),g(!0)},E=[{field:"title",headerName:"Title",flex:1,minWidth:200},{field:"provider",headerName:"Provider",flex:1,minWidth:200},{field:"source",headerName:"Source",flex:1,minWidth:150},{field:"actions",headerName:"Actions",width:200,sortable:!1,filterable:!1,disableColumnMenu:!0,renderCell:e=>{const a="user-override"===e.row.source;return X.default.createElement(m.Box,{sx:{display:"flex",gap:1}},X.default.createElement(m.Tooltip,{title:"Run"},X.default.createElement(m.IconButton,{size:"small",color:"success",onClick:t=>{return a=e.row.id,t.stopPropagation(),void n(a);var a}},X.default.createElement(ve.default,{fontSize:"small"}))),X.default.createElement(m.Tooltip,{title:"Edit"},X.default.createElement(m.IconButton,{size:"small",color:"primary",onClick:a=>{return r=e.row.id,a.stopPropagation(),void t(r);var r}},X.default.createElement(xe.default,{fontSize:"small"}))),X.default.createElement(m.Tooltip,{title:"Clone"},X.default.createElement(m.IconButton,{size:"small",onClick:t=>(async(e,t)=>{t.stopPropagation();try{const t=await Ye.getReportDefinition({id:e}),a={...t,title:`${t.title} (Copy)`};r(a)}catch(e){console.error("Error cloning report:",e),o.error("Failed to clone report: "+(e.message||"Unknown error"))}})(e.row.id,t)},X.default.createElement(be.default,{fontSize:"small"}))),a?X.default.createElement(m.Tooltip,{title:"Revert to the system report"},X.default.createElement(m.IconButton,{size:"small",color:"warning",onClick:t=>b(e.row.id,t)},X.default.createElement(we.default,{fontSize:"small"}))):X.default.createElement(m.Tooltip,{title:"Delete"},X.default.createElement(m.IconButton,{size:"small",color:"error",onClick:t=>b(e.row.id,t)},X.default.createElement(Ee.default,{fontSize:"small"}))))}}],v=i.map(e=>({id:e.id,title:e.title,provider:e.provider,source:e.source}));return d?X.default.createElement(m.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},X.default.createElement(m.CircularProgress,null)):u?X.default.createElement(m.Box,{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",minHeight:400,gap:2},X.default.createElement(m.Typography,{variant:"body1",color:"error"},u),X.default.createElement(m.Button,{variant:"contained",onClick:x},"Retry")):X.default.createElement(m.Box,{sx:{p:3,display:"flex",flexDirection:"column",fontFamily:"system-ui"}},X.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-end",alignItems:"center",mb:2,fontFamily:"system-ui"}},X.default.createElement(m.Button,{variant:"contained",sx:{backgroundColor:" rgb(70, 134, 128)",borderRadius:"0.5rem",boxShadow:"none",textTransform:"none"},startIcon:X.default.createElement(ye.default,null),onClick:a},"Add New Report")),X.default.createElement(m.Box,{sx:{flex:1,width:"100%",borderRadius:"0.5rem",overflow:"hidden",fontFamily:"system-ui"}},X.default.createElement(C.DataGrid,{rows:v,columns:E,pageSize:10,rowsPerPageOptions:[10,25,50],disableSelectionOnClick:!0,onRowClick:e=>{t(e.row.id)},sx:{height:"100%",borderRadius:"0.5rem",overflow:"hidden",fontFamily:"system-ui","& .MuiDataGrid-columnHeaders":{backgroundColor:"#ffff"},"& .MuiDataGrid-columnHeaderTitle":{fontWeight:"600 !important",fontSize:"0.875rem !important"},"& .MuiDataGrid-columnHeader:first-of-type":{borderTopLeftRadius:"0.5rem"},"& .MuiDataGrid-columnHeader:last-of-type":{borderTopRightRadius:"0.5rem"},"& .MuiDataGrid-row":{cursor:"pointer",fontSize:"0.875rem !important"},"& .MuiDataGrid-row:hover":{backgroundColor:"#f6f5f5ff"}}})),X.default.createElement(mt,{open:p,title:"user-override"===h?.source?"Revert Report Definition":"Delete Report Definition",message:h?"user-override"===h.source?`Are you sure you want to revert "${h.title}" to the system version? Your custom changes will be lost.`:`Are you sure you want to delete "${h.title}"? This action cannot be undone.`:"",onConfirm:async()=>{if(!h)return;const e="user-override"===h.source,t=e?"reverted":"deleted";try{await Ye.deleteReportDefinition({id:h.id}),o.success(e?`Report "${h.title}" reverted to system version successfully!`:`Report "${h.title}" deleted successfully!`),g(!1),y(null),x()}catch(e){console.error(`Error ${t} report:`,e),o.error(`Failed to ${t.toLowerCase()} report: `+(e.response?.data?.message||e.message||"Unknown error")),g(!1),y(null)}},onCancel:()=>{g(!1),y(null)},confirmText:"user-override"===h?.source?"Revert":"Delete",cancelText:"Cancel",confirmColor:"user-override"===h?.source?"warning":"error"}))},gt=({providersData:t,rootProvider:a,onSelectionChange:r,existingDimensions:n=[],existingMetrics:l=[],existingFilters:o={}})=>{const[i,s]=e.useState([]);e.useEffect(()=>{s([]),r&&r([])},[a]);const d=e=>{if(!t||!e)return[];const a=t[e];if(!a||!a.relations||0===a.relations.length)return[];const r=(()=>{const e=new Map,t=t=>{if(t.relations&&t.providerPath)for(let a=0;a<t.relations.length;a++){const r=t.relations[a],n=t.providerPath[a];r.type&&(e.has(n)||e.set(n,new Set),e.get(n).add(r.name))}};return n.forEach(t),l.forEach(t),Object.values(o).forEach(t),e})().get(e);return a.relations.filter(e=>t[e.target]).map(e=>{let t=!1,a=null;if(!!e.type&&r&&r.size>0){if(!r.has(e.name)&&r.size>0){t=!0;a=`Cannot select: '${Array.from(r)[0]}' is already in use`}}return{key:e.name,value:e.name,targetKey:e.target,disabled:t,disabledReason:a}})},c=(e,t)=>{const n=t.target.value,l=0===e?a:i[e-1].targetKey,o=d(l).find(e=>e.key===n);if(!o)return;const c=i.slice(0,e);c.push({providerKey:n,relationName:n,targetKey:o.targetKey}),s(c),console.log("Selection chain:",c),r&&r(c)};return X.default.createElement(m.Box,null,i.length>0&&X.default.createElement(m.Box,{sx:{marginBottom:2}},X.default.createElement(m.Box,{sx:{display:"flex",alignItems:"center",gap:1.5,flexWrap:"wrap"}},X.default.createElement(m.Chip,{label:et(a),size:"medium",variant:"outlined",sx:{fontWeight:600,borderColor:"rgb(70, 134, 128)",color:"rgb(70, 134, 128)",backgroundColor:"white",height:"32px",fontFamily:"system-ui"}}),i.map((e,t)=>X.default.createElement(X.default.Fragment,{key:t},X.default.createElement(m.Typography,{variant:"body2",sx:{color:"#9e9e9e",fontWeight:"bold"}},"→"),X.default.createElement(m.Chip,{label:et(e.targetKey),size:"medium",onDelete:()=>(e=>{const t=i.slice(0,e);s(t),r&&r(t)})(t),sx:{fontWeight:500,backgroundColor:"rgb(70, 134, 128)",color:"white",height:"32px",fontFamily:"system-ui","& .MuiChip-deleteIcon":{color:"rgba(255, 255, 255, 0.7)","&:hover":{color:"white"}}}}))))),X.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",alignItems:"flex-start",gap:"16px"}},(()=>{if(!t||!a)return null;const e=[],r=d(a);r.length>0&&e.push(X.default.createElement("div",{key:"level-0",style:{marginRight:"16px"}},X.default.createElement(tt,{items:r,value:i[0]?.providerKey||"",label:`Related to ${a}`,onChange:e=>c(0,e),sx:{width:"300px"}})));for(let t=0;t<i.length;t++){const a=i[t],r=d(a.targetKey);if(r.length>0){const n=i[t+1];e.push(X.default.createElement("div",{key:`level-${t+1}`,style:{marginRight:"16px"}},X.default.createElement(tt,{items:r,value:n?.providerKey||"",label:`Related to ${a.targetKey}`,onChange:e=>c(t+1,e),sx:{width:"300px"}})))}}return e})()))},ht=({id:t,label:a,fullLabel:r,onDelete:n,onMoveUp:l,onMoveDown:o,isFirst:i,isLast:s,sortOrder:d,onSortOrderChange:c,fullPath:u,defaultTitle:f,customTitle:p,onUpdateTitle:g,onResetTitle:h})=>{const[y,x]=e.useState(!1),[b,E]=e.useState(""),v=e.useRef(null),w=e.useRef(null),{attributes:S,listeners:k,setNodeRef:T,transform:R,transition:D,isDragging:B}=I.useSortable({id:t}),P={transform:q.CSS.Transform.toString(R),transition:D,opacity:B?.5:1,display:"flex",alignItems:"center",width:"100%"};e.useEffect(()=>{y&&v.current&&(v.current.focus(),v.current.select())},[y]),e.useEffect(()=>{const e=e=>{y&&w.current&&!w.current.contains(e.target)&&F()};if(y)return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[y]);const z=()=>{const e=b.trim();""!==e?(g(u,e),x(!1)):F()},F=()=>{x(!1),E("")},M=p||a,$=!!p;return X.default.createElement("div",Ae({ref:T,style:P},S),X.default.createElement(m.Box,{ref:w,sx:{display:"flex",alignItems:"center",width:"100%",gap:1,backgroundColor:"white",border:"1px solid #e0e0e0",borderRadius:2,padding:1,transition:"transform 0.2s ease, box-shadow 0.2s ease","&:hover .hover-icons":{opacity:1}}},X.default.createElement(m.Box,Ae({},k,{sx:{display:"flex",alignItems:"center",cursor:"grab","&:active":{cursor:"grabbing"}}}),X.default.createElement(Te.default,{sx:{cursor:"grab",color:"rgba(110, 110, 110, 0.62)"}})),y?X.default.createElement(X.default.Fragment,null,X.default.createElement(m.TextField,{inputRef:v,value:b,onChange:e=>E(e.target.value),onKeyDown:e=>{"Enter"===e.key?z():"Escape"===e.key&&F()},size:"small",sx:{minWidth:"200px",maxWidth:"400px"}}),X.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:1}},X.default.createElement(m.Tooltip,{title:"Save",arrow:!0,placement:"top"},X.default.createElement(m.IconButton,{size:"small",onClick:z,color:"primary","aria-label":"save title"},X.default.createElement(Pe.default,{fontSize:"small"}))),X.default.createElement(m.Tooltip,{title:"Cancel",arrow:!0,placement:"top"},X.default.createElement(m.IconButton,{size:"small",onClick:F,"aria-label":"cancel edit"},X.default.createElement(ze.default,{fontSize:"small"}))),$&&X.default.createElement(m.Tooltip,{title:"Reset to default",arrow:!0,placement:"top"},X.default.createElement(m.IconButton,{size:"small",onClick:()=>{h(u),x(!1),E("")},color:"warning","aria-label":"reset title"},X.default.createElement(Fe.default,{fontSize:"small"})))),X.default.createElement(m.Box,{sx:{flex:1}})):X.default.createElement(X.default.Fragment,null,X.default.createElement(m.Box,{sx:{minWidth:0}},X.default.createElement(m.Tooltip,{title:r||M,arrow:!0,placement:"top"},X.default.createElement(m.Typography,{variant:"h6",sx:{fontWeight:$?600:500,fontStyle:$?"italic":"normal",color:"#1a1a1a",fontSize:"14px",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},M))),X.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:0,transition:"opacity 0.2s"}},X.default.createElement(m.Tooltip,{title:"Edit title",arrow:!0,placement:"top"},X.default.createElement(m.IconButton,{size:"small",onClick:()=>{E(p||f),x(!0)},"aria-label":"edit title"},X.default.createElement(xe.default,{fontSize:"small"}))),X.default.createElement(m.Tooltip,{title:null===d?"No sort":"asc"===d?"Ascending":"Descending",arrow:!0,placement:"top"},X.default.createElement(m.IconButton,{size:"small",onClick:()=>{c(null===d?"asc":"asc"===d?"desc":null)},"aria-label":"toggle sort order",color:d?"primary":"default"},"asc"===d?X.default.createElement(Re.default,{fontSize:"small"}):"desc"===d?X.default.createElement(De.default,{fontSize:"small"}):X.default.createElement(Be.default,{fontSize:"small",sx:{opacity:.3}}))),X.default.createElement(m.Tooltip,{title:"Delete",arrow:!0,placement:"top"},X.default.createElement(m.IconButton,{size:"small",onClick:n,"aria-label":"delete",sx:{color:"#ef5350"}},X.default.createElement(C.GridDeleteIcon,{fontSize:"small"})))),X.default.createElement(m.Box,{sx:{flex:1}}),X.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:0,transition:"opacity 0.2s"}},X.default.createElement(m.IconButton,{size:"small",onClick:l,disabled:i,"aria-label":"move up"},X.default.createElement(Re.default,{fontSize:"small"})),X.default.createElement(m.IconButton,{size:"small",onClick:o,disabled:s,"aria-label":"move down"},X.default.createElement(De.default,{fontSize:"small"}))))))},yt=({providersData:t,rootProvider:a,savedDimensions:r=[],onSaveDimension:n,onRemoveDimension:l,onReorderDimensions:o,titleOverrides:i={},onUpdateTitle:s,onResetTitle:d,existingMetrics:c=[],existingFilters:u={}})=>{const[f,p]=e.useState(!1),[g,h]=e.useState([]),[y,x]=e.useState(""),b=M.useSensors(M.useSensor(M.PointerSensor),M.useSensor(M.KeyboardSensor,{coordinateGetter:I.sortableKeyboardCoordinates})),E=()=>{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 l=[t[a].default_alias];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&&l.push(t.alias)}o=e.targetKey});const i=new Set(r.map(e=>e.fullPath)),s=[];return Object.keys(n.dimensions).forEach(t=>{const a=n.dimensions[t];Object.keys(a).forEach(r=>{const n=a[r],o=`${l.join("_")}.${r}`,d=i.has(o);s.push({key:`${e}_${t}.${r}`,value:n.title||r,dimensionKey:r,alias:t,dimension:n,disabled:d})})}),s},v=()=>{p(!1),h([]),x("")},w=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")};return X.default.createElement("div",null,X.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-start",mb:2}},!f&&X.default.createElement(m.Button,{variant:"contained",startIcon:X.default.createElement(C.GridAddIcon,null),onClick:()=>{p(!0),h([]),x("")},sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",textTransform:"none",backgroundColor:"rgb(70, 134, 128)",boxShadow:"none","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Add Dimension")),f&&X.default.createElement(m.Paper,{elevation:0,sx:{p:3,mb:3,border:"1px solid #e0e0e0",borderRadius:"12px",backgroundColor:"white",boxShadow:"0px 2px 4px rgba(0,0,0,0.02)",fontFamily:"system-ui"}},X.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Provider Path"),X.default.createElement(m.Box,{sx:{mb:3}},X.default.createElement(gt,{providersData:t,rootProvider:a,onSelectionChange:h,existingDimensions:r,existingMetrics:c,existingFilters:u})),X.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Dimension"),X.default.createElement(m.Box,{sx:{display:"flex",alignItems:"center",gap:2,mb:3}},X.default.createElement(tt,{items:E(),value:y,label:"Choose Dimension",onChange:e=>{x(e.target.value)},sx:{width:"400px",fontFamily:"system-ui"}}),X.default.createElement(m.Tooltip,{title:"Add all available dimensions",arrow:!0,placement:"top"},X.default.createElement("span",null,X.default.createElement(m.IconButton,{onClick:()=>{const e=E().filter(e=>!e.disabled);if(0===e.length)return;const r=[],l=[a],o=[];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&&(r.push(t),o.push(t.name))}l.push(e.targetKey),i=e.targetKey});const s=[t[a].default_alias];r.forEach(e=>{s.push(e.alias)}),e.forEach(e=>{const t=`${s.join("_")}.${e.dimensionKey}`,a={dimension:e.dimension,relations:r,providerPath:l,relationNames:o,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:t};n(a)}),v()},disabled:0===E().filter(e=>!e.disabled).length,"aria-label":"add all dimensions",sx:{color:"rgb(70, 134, 128)",border:"1px solid #e0e0e0",borderRadius:"8px",padding:"8px","&:hover":{backgroundColor:"#f5f5f5"},"&.Mui-disabled":{opacity:.5}}},X.default.createElement(Me.default,null))))),X.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-end",gap:2,mt:3}},X.default.createElement(m.Button,{variant:"outlined",onClick:v,sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",borderColor:"#e0e0e0",color:"rgb(37, 37, 37)",textTransform:"none","&:hover":{backgroundColor:"#f5f5f5",borderColor:"#d0d0d0"}}},"Cancel"),X.default.createElement(m.Button,{variant:"contained",onClick:()=>{if(!y)return;const e=E().find(e=>e.key===y);if(!e)return;const r=[],l=[a],o=[];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&&(r.push(t),o.push(t.name))}l.push(e.targetKey),i=e.targetKey});const s=[t[a].default_alias];r.forEach(e=>{s.push(e.alias)});const d=`${s.join("_")}.${e.dimensionKey}`,c={dimension:e.dimension,relations:r,providerPath:l,relationNames:o,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:d};n(c),v()},disabled:!y,sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",textTransform:"none",backgroundColor:"rgb(70, 134, 128)","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Save Dimension"))),r.length>0&&X.default.createElement(m.Box,{sx:{marginTop:0}},X.default.createElement(m.Typography,{variant:"h6",sx:{fontSize:"16px",fontWeight:600,marginTop:2,color:"rgb(37, 37, 37)"}},"Saved Dimensions"),X.default.createElement(m.Typography,{sx:{fontSize:"13px",color:"#666",marginBottom:2}},"Drag to reorder or use arrows"),X.default.createElement(M.DndContext,{sensors:b,collisionDetection:M.closestCenter,onDragEnd:e=>{const{active:t,over:a}=e;if(a&&t.id!==a.id){const e=r.findIndex((e,a)=>a===t.id),n=r.findIndex((e,t)=>t===a.id),l=I.arrayMove(r,e,n);o(l)}}},X.default.createElement(I.SortableContext,{items:r.map((e,t)=>t),strategy:I.verticalListSortingStrategy},X.default.createElement(m.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},r.map((e,t)=>X.default.createElement(ht,{key:t,id:t,label:e.dimensionTitle,fullLabel:`${w(e)} → ${e.dimensionTitle} (${e.fullPath})`,onDelete:()=>l(t),onMoveUp:()=>(e=>{if(e>0){const t=I.arrayMove(r,e,e-1);o(t)}})(t),onMoveDown:()=>(e=>{if(e<r.length-1){const t=I.arrayMove(r,e,e+1);o(t)}})(t),isFirst:0===t,isLast:t===r.length-1,sortOrder:e.sortOrder||null,onSortOrderChange:e=>((e,t)=>{const a=[...r];a[e]={...a[e],sortOrder:t},o(a)})(t,e),fullPath:e.fullPath,defaultTitle:e.dimensionTitle,customTitle:i[e.fullPath],onUpdateTitle:s,onResetTitle:d})))))))},xt=({id:t,label:a,fullLabel:r,onDelete:n,onMoveUp:l,onMoveDown:o,isFirst:i,isLast:s,fullPath:d,defaultTitle:c,customTitle:u,onUpdateTitle:f,onResetTitle:p})=>{const[g,h]=e.useState(!1),[y,x]=e.useState(""),b=e.useRef(null),E=e.useRef(null),{attributes:v,listeners:w,setNodeRef:S,transform:k,transition:T,isDragging:R}=I.useSortable({id:t}),D={transform:q.CSS.Transform.toString(k),transition:T,opacity:R?.5:1,display:"flex",alignItems:"center",width:"100%"};e.useEffect(()=>{g&&b.current&&(b.current.focus(),b.current.select())},[g]),e.useEffect(()=>{const e=e=>{g&&E.current&&!E.current.contains(e.target)&&P()};if(g)return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[g]);const B=()=>{const e=y.trim();""!==e?(f(d,e),h(!1)):P()},P=()=>{h(!1),x("")},z=u||a,F=!!u;return X.default.createElement("div",Ae({ref:S,style:D},v),X.default.createElement(m.Box,{ref:E,sx:{display:"flex",alignItems:"center",width:"100%",gap:1,backgroundColor:"white",border:"1px solid #e0e0e0",borderRadius:2,padding:1,transition:"transform 0.2s ease, box-shadow 0.2s ease","&:hover .hover-icons":{opacity:1}}},X.default.createElement(m.Box,Ae({},w,{sx:{display:"flex",alignItems:"center",cursor:"grab","&:active":{cursor:"grabbing"}}}),X.default.createElement(Te.default,{sx:{cursor:"grab",color:"rgba(110, 110, 110, 0.62)"}})),g?X.default.createElement(X.default.Fragment,null,X.default.createElement(m.TextField,{inputRef:b,value:y,onChange:e=>x(e.target.value),onKeyDown:e=>{"Enter"===e.key?B():"Escape"===e.key&&P()},size:"small",sx:{minWidth:"200px",maxWidth:"400px"}}),X.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:1}},X.default.createElement(m.Tooltip,{title:"Save",arrow:!0,placement:"top"},X.default.createElement(m.IconButton,{size:"small",onClick:B,color:"primary","aria-label":"save title"},X.default.createElement(Pe.default,{fontSize:"small"}))),X.default.createElement(m.Tooltip,{title:"Cancel",arrow:!0,placement:"top"},X.default.createElement(m.IconButton,{size:"small",onClick:P,"aria-label":"cancel edit"},X.default.createElement(ze.default,{fontSize:"small"}))),F&&X.default.createElement(m.Tooltip,{title:"Reset to default",arrow:!0,placement:"top"},X.default.createElement(m.IconButton,{size:"small",onClick:()=>{p(d),h(!1),x("")},color:"warning","aria-label":"reset title"},X.default.createElement(Fe.default,{fontSize:"small"})))),X.default.createElement(m.Box,{sx:{flex:1}})):X.default.createElement(X.default.Fragment,null,X.default.createElement(m.Box,{sx:{minWidth:0}},X.default.createElement(m.Tooltip,{title:r||z,arrow:!0,placement:"top"},X.default.createElement(m.Typography,{variant:"h6",sx:{fontWeight:F?600:500,fontStyle:F?"italic":"normal",color:"#1a1a1a",fontSize:"14px",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},z))),X.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:0,transition:"opacity 0.2s"}},X.default.createElement(m.Tooltip,{title:"Edit title",arrow:!0,placement:"top"},X.default.createElement(m.IconButton,{size:"small",onClick:()=>{x(u||c),h(!0)},"aria-label":"edit title"},X.default.createElement(xe.default,{fontSize:"small"}))),X.default.createElement(m.Tooltip,{title:"Delete",arrow:!0,placement:"top"},X.default.createElement(m.IconButton,{size:"small",onClick:n,"aria-label":"delete",sx:{color:"#ef5350"}},X.default.createElement(C.GridDeleteIcon,{fontSize:"small"})))),X.default.createElement(m.Box,{sx:{flex:1}}),X.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:0,transition:"opacity 0.2s"}},X.default.createElement(m.IconButton,{size:"small",onClick:l,disabled:i,"aria-label":"move up"},X.default.createElement(Re.default,{fontSize:"small"})),X.default.createElement(m.IconButton,{size:"small",onClick:o,disabled:s,"aria-label":"move down"},X.default.createElement(De.default,{fontSize:"small"}))))))},bt=({providersData:t,rootProvider:a,savedMetrics:r=[],onSaveMetric:n,onRemoveMetric:l,onReorderMetrics:o,titleOverrides:i={},onUpdateTitle:s,onResetTitle:d,existingDimensions:c=[],existingFilters:u={}})=>{const[f,p]=e.useState(!1),[g,h]=e.useState([]),[y,x]=e.useState(""),b=M.useSensors(M.useSensor(M.PointerSensor),M.useSensor(M.KeyboardSensor,{coordinateGetter:I.sortableKeyboardCoordinates})),E=()=>{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.metrics)return[];const l=[t[a].default_alias];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&&l.push(t.alias)}o=e.targetKey});const i=new Set(r.map(e=>e.fullPath)),s=n.metrics.map((t,a)=>{const r=`${l.join("_")}.${t.name}`,n=i.has(r);return{key:`${e}_${t.name}_${a}`,value:t.title||t.name,metricName:t.name,metric:t,disabled:n}});return s},v=()=>{p(!1),h([]),x("")},w=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")};return X.default.createElement("div",null,X.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-start",mb:2}},!f&&X.default.createElement(m.Button,{variant:"contained",startIcon:X.default.createElement(C.GridAddIcon,null),onClick:()=>{p(!0),h([]),x("")},sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",textTransform:"none",backgroundColor:"rgb(70, 134, 128)",boxShadow:"none","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Add Metric")),f&&X.default.createElement(m.Paper,{elevation:0,sx:{p:3,mb:3,border:"1px solid #e0e0e0",borderRadius:"12px",backgroundColor:"white",boxShadow:"0px 2px 4px rgba(0,0,0,0.02)",fontFamily:"system-ui"}},X.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Provider Path"),X.default.createElement(m.Box,{sx:{mb:3}},X.default.createElement(gt,{providersData:t,rootProvider:a,onSelectionChange:h,existingDimensions:c,existingMetrics:r,existingFilters:u})),X.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Metric"),X.default.createElement(m.Box,{sx:{display:"flex",alignItems:"center",gap:2,mb:3}},X.default.createElement(tt,{items:E(),value:y,label:"Choose Metric",onChange:e=>{x(e.target.value)},sx:{width:"400px",fontFamily:"system-ui"}}),X.default.createElement(m.Tooltip,{title:"Add all available metrics",arrow:!0,placement:"top"},X.default.createElement("span",null,X.default.createElement(m.IconButton,{onClick:()=>{const e=E().filter(e=>!e.disabled);if(0===e.length)return;const r=[],l=[a],o=[];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&&(r.push(t),o.push(t.name))}l.push(e.targetKey),i=e.targetKey});const s=[t[a].default_alias];r.forEach(e=>{s.push(e.alias)}),e.forEach(e=>{const t=`${s.join("_")}.${e.metricName}`,a={metric:e.metric,relations:r,providerPath:l,relationNames:o,metricName:e.metricName,metricTitle:e.value,fullPath:t};n(a)}),v()},disabled:0===E().filter(e=>!e.disabled).length,"aria-label":"add all metrics",sx:{color:"rgb(70, 134, 128)",border:"1px solid #e0e0e0",borderRadius:"8px",padding:"8px","&:hover":{backgroundColor:"#f5f5f5"},"&.Mui-disabled":{opacity:.5}}},X.default.createElement(Me.default,null))))),X.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-end",gap:2,mt:3}},X.default.createElement(m.Button,{variant:"outlined",onClick:v,sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",borderColor:"#e0e0e0",color:"rgb(37, 37, 37)",textTransform:"none","&:hover":{backgroundColor:"#f5f5f5",borderColor:"#d0d0d0"}}},"Cancel"),X.default.createElement(m.Button,{variant:"contained",onClick:()=>{if(!y)return;const e=E().find(e=>e.key===y);if(!e)return;const r=[],l=[a],o=[];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&&(r.push(t),o.push(t.name))}l.push(e.targetKey),i=e.targetKey});const s=[t[a].default_alias];r.forEach(e=>{s.push(e.alias)});const d=`${s.join("_")}.${e.metricName}`,c={metric:e.metric,relations:r,providerPath:l,relationNames:o,metricName:e.metricName,metricTitle:e.value,fullPath:d};n(c),v()},disabled:!y,sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",textTransform:"none",backgroundColor:"rgb(70, 134, 128)","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Save Metric"))),r.length>0&&X.default.createElement(m.Box,{sx:{marginTop:0}},X.default.createElement(m.Typography,{variant:"h6",sx:{fontSize:"16px",fontWeight:600,marginBottom:1,color:"rgb(37, 37, 37)"}},"Saved Metrics"),X.default.createElement(M.DndContext,{sensors:b,collisionDetection:M.closestCenter,onDragEnd:e=>{const{active:t,over:a}=e;if(a&&t.id!==a.id){const e=r.findIndex((e,a)=>a===t.id),n=r.findIndex((e,t)=>t===a.id),l=I.arrayMove(r,e,n);o(l)}}},X.default.createElement(I.SortableContext,{items:r.map((e,t)=>t),strategy:I.verticalListSortingStrategy},X.default.createElement(m.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},r.map((e,t)=>X.default.createElement(xt,{key:t,id:t,label:e.metricTitle,fullLabel:`${w(e)} → ${e.metricTitle} (${e.fullPath})`,onDelete:()=>l(t),onMoveUp:()=>(e=>{if(e>0){const t=I.arrayMove(r,e,e-1);o(t)}})(t),onMoveDown:()=>(e=>{if(e<r.length-1){const t=I.arrayMove(r,e,e+1);o(t)}})(t),isFirst:0===t,isLast:t===r.length-1,fullPath:e.fullPath,defaultTitle:e.metricTitle,customTitle:i[e.fullPath],onUpdateTitle:s,onResetTitle:d})))))))},Et=({providersData:t,rootProvider:a,savedFilters:r={},onSaveFilter:n,onRemoveFilter:l,existingDimensions:o=[],existingMetrics:i=[],titleOverrides:s={},dimensionTitleOverrides:d={},onUpdateTitle:c,onResetTitle:u})=>{const f=dt(),[p,g]=e.useState(!1),[h,y]=e.useState(!1),[x,b]=e.useState([]),[E,v]=e.useState(""),[w,S]=e.useState(""),[k,T]=e.useState([]),[R,D]=e.useState([]),[B,P]=e.useState(!1),[z,F]=e.useState(null),[M,I]=e.useState(""),[q,$]=e.useState(null),[A,j]=e.useState(null),[O,_]=e.useState(null),[W,N]=e.useState("");e.useEffect(()=>{v(""),T([]),D([]),$(null),j(null),I("")},[x]);const K=e=>e&&("date"===e.type||"timestamp"===e.type),U=()=>{const e=a?0===x.length?a:x[x.length-1].targetKey:null;if(!e||!t||!t[e])return[];const r=t[e];if(!r.dimensions)return[];const n=[];return Object.keys(r.dimensions).forEach(t=>{const a=r.dimensions[t];Object.keys(a).forEach(r=>{const l=a[r];l.column&&n.push({key:`${e}_${t}.${r}`,value:l.title||r,dimensionKey:r,alias:t,dimension:l})})}),n},Y=()=>{g(!1),y(!1),b([]),v(""),S(""),T([]),D([]),$(null),j(null),I(""),F(null)},V=()=>{F(null),T([]),D([]),$(null),j(null),I("")},Z=e=>{const t=W.trim();""!==t?(c(e,t),_(null),N("")):J()},J=()=>{_(null),N("")},Q=async(e,t="")=>{P(!0);try{const r=f?.parameters||{base_currency:"EUR"},n={dimensions:[e],metrics:[],order_by:[{name:e}]};t&&""!==t.trim()&&(n.filter={and:[{[e]:{ilike:`${t.trim()}%`}}]});const l={provider:a,doc:{query:n},parameters:r};console.log("Fetching filter values with payload:",l);const o=await Ye.runAdHocReport({report:l});console.log("Filter values results:",o);const i=(Array.isArray(o)?o:o.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)}}),s=R.map(e=>({key:String(e),value:String(e)})),d=new Map;s.forEach(e=>{d.set(e.key,e)}),i.forEach(e=>{d.set(e.key,e)});const c=Array.from(d.values());console.log("Transformed distinct values:",i),console.log("Merged with selected values:",c),T(c)}catch(e){console.error("Error fetching filter values:",e),T([])}finally{P(!1)}},ee=e=>{let r=null;if(h&&w)r=w;else if(p&&E){const e=U().find(e=>e.key===E);if(e){const n=[];let l=a;x.forEach(e=>{const a=t[l];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&n.push(t)}l=e.targetKey});const o=[t[a].default_alias];n.forEach(e=>{o.push(e.alias)}),r=`${o.join("_")}.${e.dimensionKey}`}}else z&&(r=z);r&&Q(r,e)},te=e=>{I(e)},ae=e=>{const t=[a];return e.relationNames&&e.relationNames.length>0&&t.push(...e.relationNames),t.join(" → ")},re=Object.entries(r);return X.default.createElement("div",null,X.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-start",gap:2,mb:2}},!p&&!h&&X.default.createElement(X.default.Fragment,null,o.length>0&&X.default.createElement(m.Button,{variant:"contained",startIcon:X.default.createElement(Ie.default,null),onClick:()=>{y(!0),g(!1),S(""),T([]),D([]),$(null),j(null),F(null)},sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",textTransform:"none",backgroundColor:"rgb(70, 134, 128)",boxShadow:"none","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Add Filter"),X.default.createElement(m.Button,{variant:"outlined",startIcon:X.default.createElement(C.GridAddIcon,null),onClick:()=>{g(!0),y(!1),b([]),v(""),S(""),T([]),D([]),$(null),j(null),F(null)},sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",textTransform:"none",borderColor:"rgb(70, 134, 128)",color:"rgb(70, 134, 128)",boxShadow:"none","&:hover":{backgroundColor:"rgba(70, 134, 128, 0.04)",borderColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Add Advanced Filter"))),p&&X.default.createElement(m.Paper,{elevation:0,sx:{p:3,mb:3,border:"1px solid #e0e0e0",borderRadius:"12px",backgroundColor:"white",boxShadow:"0px 2px 4px rgba(0,0,0,0.02)",fontFamily:"system-ui"}},X.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Provider Path"),X.default.createElement(m.Box,{sx:{mb:3}},X.default.createElement(gt,{providersData:t,rootProvider:a,onSelectionChange:b,existingDimensions:o,existingMetrics:i,existingFilters:r})),X.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Dimension for Filter"),X.default.createElement(m.Box,{sx:{mb:3}},X.default.createElement(tt,{items:U(),value:E,label:"Choose Dimension",onChange:e=>{const r=e.target.value;if(v(r),D([]),$(null),j(null),r){const e=U().find(e=>e.key===r);if(e){if(!K(e.dimension)){const r=[];let n=a;x.forEach(e=>{const a=t[n];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&r.push(t)}n=e.targetKey});const l=[t[a].default_alias];r.forEach(e=>{l.push(e.alias)});const o=`${l.join("_")}.${e.dimensionKey}`;Q(o)}}}else T([])},sx:{width:"400px",fontFamily:"system-ui"}})),E&&(()=>{const e=U().find(e=>e.key===E),t=e&&K(e.dimension);return X.default.createElement(X.default.Fragment,null,X.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,mt:3,color:"rgb(37, 37, 37)"}},t?"Select Date Range":"Select Filter Values"),t?X.default.createElement(L.LocalizationProvider,{dateAdapter:H.AdapterDayjs},X.default.createElement(m.Box,{sx:{display:"flex",gap:2,width:"400px"}},X.default.createElement(G.DatePicker,{label:"From Date",value:q,onChange:e=>$(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}),X.default.createElement(G.DatePicker,{label:"To Date",value:A,onChange:e=>j(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}))):X.default.createElement(m.Box,{sx:{width:"400px"}},X.default.createElement(Qe,{items:k,selectedKeys:R,onChange:e=>D(e),inputValue:M,onInputChange:ee,onInputChangeImmediate:te,label:"Choose Values",placeholder:"Type to search...",loading:B,helperText:R.length>0?`${R.length} value(s) selected`:"Select at least one value",debounceMs:1e3})))})(),X.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-end",gap:2,mt:3}},X.default.createElement(m.Button,{variant:"outlined",onClick:Y,sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",borderColor:"#e0e0e0",color:"rgb(37, 37, 37)",textTransform:"none","&:hover":{backgroundColor:"#f5f5f5",borderColor:"#d0d0d0"}}},"Cancel"),X.default.createElement(m.Button,{variant:"contained",onClick:()=>{const e=U().find(e=>e.key===E);if(!e)return;const r=K(e.dimension);if(r){if(!q&&!A)return}else if(0===R.length)return;if(!E)return;const l=[],o=[a],i=[];let s=a;x.forEach(e=>{const a=t[s];if(a&&a.relations){const t=a.relations.find(t=>t.name===e.relationName);t&&(l.push(t),i.push(t.name))}o.push(e.targetKey),s=e.targetKey});const d=[t[a].default_alias];l.forEach(e=>{d.push(e.alias)});const c=`${d.join("_")}.${e.dimensionKey}`;let u;r?(u={},q&&(u.gte=q.format("YYYY-MM-DD")),A&&(u.lte=A.format("YYYY-MM-DD"))):u=R;const f={dimension:e.dimension,relations:l,providerPath:o,relationNames:i,dimensionKey:e.dimensionKey,dimensionTitle:e.value,fullPath:c,values:u};n(c,f),Y()},disabled:(()=>{if(!E)return!0;const e=U().find(e=>e.key===E);if(!e)return!0;return K(e.dimension)?!q&&!A:0===R.length})(),sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",textTransform:"none",backgroundColor:"rgb(70, 134, 128)","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Save Filter"))),h&&X.default.createElement(m.Paper,{elevation:0,sx:{p:3,mb:3,border:"1px solid #e0e0e0",borderRadius:"12px",backgroundColor:"white",boxShadow:"0px 2px 4px rgba(0,0,0,0.02)",fontFamily:"system-ui"}},X.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,color:"rgb(37, 37, 37)"}},"Select Dimension from Report"),X.default.createElement(m.Box,{sx:{mb:3}},X.default.createElement(tt,{items:o.map(e=>({key:e.fullPath,value:d[e.fullPath]||e.dimensionTitle})),value:w,label:"Choose Dimension",onChange:e=>{const t=e.target.value;if(S(t),D([]),$(null),j(null),I(""),t){const e=o.find(e=>e.fullPath===t);if(e){K(e.dimension)||Q(t)}}else T([])},sx:{width:"400px",fontFamily:"system-ui"}})),w&&(()=>{const e=o.find(e=>e.fullPath===w),t=e&&K(e.dimension);return X.default.createElement(X.default.Fragment,null,X.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1.5,mt:3,color:"rgb(37, 37, 37)"}},t?"Select Date Range":"Select Filter Values"),t?X.default.createElement(L.LocalizationProvider,{dateAdapter:H.AdapterDayjs},X.default.createElement(m.Box,{sx:{display:"flex",gap:2,width:"400px"}},X.default.createElement(G.DatePicker,{label:"From Date",value:q,onChange:e=>$(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}),X.default.createElement(G.DatePicker,{label:"To Date",value:A,onChange:e=>j(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}))):X.default.createElement(m.Box,{sx:{width:"400px"}},X.default.createElement(Qe,{items:k,selectedKeys:R,onChange:e=>D(e),inputValue:M,onInputChange:ee,onInputChangeImmediate:te,label:"Choose Values",placeholder:"Type to search...",loading:B,helperText:R.length>0?`${R.length} value(s) selected`:"Select at least one value",debounceMs:1e3})))})(),X.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"flex-end",gap:2,mt:3}},X.default.createElement(m.Button,{variant:"outlined",onClick:Y,sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",borderColor:"#e0e0e0",color:"rgb(37, 37, 37)",textTransform:"none","&:hover":{backgroundColor:"#f5f5f5",borderColor:"#d0d0d0"}}},"Cancel"),X.default.createElement(m.Button,{variant:"contained",onClick:()=>{if(!w)return;const e=o.find(e=>e.fullPath===w);if(!e)return;const t=K(e.dimension);if(t){if(!q&&!A)return}else if(0===R.length)return;let a;t?(a={},q&&(a.gte=q.format("YYYY-MM-DD")),A&&(a.lte=A.format("YYYY-MM-DD"))):a=R;const r={dimension:e.dimension,relations:e.relations,providerPath:e.providerPath,relationNames:e.relationNames,dimensionKey:e.dimensionKey,dimensionTitle:e.dimensionTitle,fullPath:e.fullPath,values:a};n(e.fullPath,r),Y()},disabled:(()=>{if(!w)return!0;const e=o.find(e=>e.fullPath===w);if(!e)return!0;return K(e.dimension)?!q&&!A:0===R.length})(),sx:{height:"40px",fontFamily:"system-ui",fontSize:"14px",fontWeight:500,borderRadius:"8px",boxShadow:"none",textTransform:"none",backgroundColor:"rgb(70, 134, 128)","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Save Filter"))),re.length>0&&X.default.createElement(m.Box,{sx:{marginTop:0}},X.default.createElement(m.Typography,{variant:"h6",sx:{fontSize:"16px",fontWeight:600,marginBottom:1,color:"rgb(37, 37, 37)"}},"Saved Filters"),X.default.createElement(m.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},re.map(([e,t])=>{const a=K(t.dimension),o=z===e,i=O===e;let c,f;a&&t.values&&"object"==typeof t.values&&!Array.isArray(t.values)?f=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":(c=t.values?.length||0,f=t.values?.join(", ")||"No values");const p=s[e]||d[e]||t.dimensionTitle,h=!!s[e];return X.default.createElement(m.Box,{key:e},X.default.createElement(m.Box,{sx:{display:"flex",alignItems:"center",width:"100%",gap:1,backgroundColor:"white",border:"1px solid #e0e0e0",borderRadius:2,padding:2,boxSizing:"border-box",transition:"box-shadow 0.2s ease","&:hover .hover-icons":{opacity:1}}},i?X.default.createElement(X.default.Fragment,null,X.default.createElement(m.TextField,{value:W,onChange:e=>N(e.target.value),onKeyDown:t=>((e,t)=>{"Enter"===e.key?Z(t):"Escape"===e.key&&J()})(t,e),size:"small",autoFocus:!0,placeholder:"Enter custom title",sx:{flex:1}}),X.default.createElement(m.Box,{sx:{display:"flex",gap:.5}},X.default.createElement(m.Tooltip,{title:"Save",arrow:!0},X.default.createElement(m.IconButton,{size:"small",onClick:()=>Z(e),color:"primary"},X.default.createElement(Pe.default,{fontSize:"small"}))),X.default.createElement(m.Tooltip,{title:"Cancel",arrow:!0},X.default.createElement(m.IconButton,{size:"small",onClick:J},X.default.createElement(ze.default,{fontSize:"small"}))),h&&X.default.createElement(m.Tooltip,{title:"Reset to default",arrow:!0},X.default.createElement(m.IconButton,{size:"small",onClick:()=>(e=>{u(e),_(null),N("")})(e),color:"warning"},X.default.createElement(Fe.default,{fontSize:"small"}))))):X.default.createElement(X.default.Fragment,null,X.default.createElement(m.Box,{sx:{display:"flex",alignItems:"center",gap:1,flex:1,minWidth:0}},X.default.createElement(m.Typography,{variant:"h6",sx:{fontWeight:h?600:500,fontStyle:h?"italic":"normal",color:"#1a1a1a",fontSize:"14px"}},p),X.default.createElement(m.Box,{className:"hover-icons",sx:{display:"flex",gap:.5,opacity:0,transition:"opacity 0.2s"}},X.default.createElement(m.Tooltip,{title:"Rename filter",arrow:!0},X.default.createElement(m.IconButton,{size:"small",onClick:()=>((e,t)=>{_(e),N(s[e]||t||"")})(e,d[e]||t.dimensionTitle),disabled:o},X.default.createElement(xe.default,{fontSize:"small"}))),X.default.createElement(m.Tooltip,{title:"Edit filter values",arrow:!0},X.default.createElement(m.IconButton,{size:"small",onClick:()=>(async(e,t)=>{g(!1),F(e),K(t.dimension)?t.values&&"object"==typeof t.values&&!Array.isArray(t.values)&&($(t.values.gte?$e.default(t.values.gte):null),j(t.values.lte?$e.default(t.values.lte):null)):(D(t.values||[]),await Q(e))})(e,t),disabled:o},X.default.createElement(Ie.default,{fontSize:"small"}))),X.default.createElement(m.Tooltip,{title:"Remove filter",arrow:!0},X.default.createElement(m.IconButton,{size:"small",onClick:()=>l(e),sx:{color:"#ef5350"}},X.default.createElement(C.GridDeleteIcon,{fontSize:"small"}))),X.default.createElement(m.Tooltip,{title:X.default.createElement("div",null,X.default.createElement("div",null,X.default.createElement("strong",null,"Path:")," ",ae(t)," → ",d[e]||t.dimensionTitle),X.default.createElement("div",null,X.default.createElement("strong",null,"Full Path:")," ",e),X.default.createElement("div",null,X.default.createElement("strong",null,a?"Date Range":`Values (${c})`,":")," ",f)),arrow:!0,placement:"right"},X.default.createElement(m.IconButton,{size:"small",disabled:o},X.default.createElement(qe.default,{fontSize:"small",sx:{color:"#757575"}}))))))),o&&X.default.createElement(m.Paper,{elevation:0,sx:{p:2,mt:1,ml:2,border:"1px solid #e0e0e0",borderRadius:"8px",backgroundColor:"#fafafa"}},X.default.createElement(m.Typography,{variant:"subtitle2",sx:{marginBottom:1.5,fontWeight:600}},"Edit ",a?"Date Range":"Values"," for: ",d[e]||t.dimensionTitle),a?X.default.createElement(L.LocalizationProvider,{dateAdapter:H.AdapterDayjs},X.default.createElement(m.Box,{sx:{display:"flex",gap:2,width:"400px",marginBottom:2}},X.default.createElement(G.DatePicker,{label:"From Date",value:q,onChange:e=>$(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}),X.default.createElement(G.DatePicker,{label:"To Date",value:A,onChange:e=>j(e),slotProps:{textField:{size:"small",fullWidth:!0},field:{clearable:!0}}}))):X.default.createElement(m.Box,{sx:{width:"400px",marginBottom:2}},X.default.createElement(Qe,{items:k,selectedKeys:R,onChange:e=>D(e),inputValue:M,onInputChange:ee,onInputChangeImmediate:te,label:"Choose Values",placeholder:"Type to search...",loading:B,helperText:R.length>0?`${R.length} value(s) selected`:"Select at least one value",debounceMs:1e3})),X.default.createElement(m.Box,{sx:{display:"flex",gap:1,justifyContent:"flex-end"}},X.default.createElement(m.Button,{variant:"outlined",size:"small",onClick:V,sx:{textTransform:"none",borderRadius:"6px"}},"Cancel"),X.default.createElement(m.Button,{variant:"contained",size:"small",onClick:()=>(e=>{const t=r[e];if(K(t.dimension)){if(!q&&!A)return;const a={};q&&(a.gte=q.format("YYYY-MM-DD")),A&&(a.lte=A.format("YYYY-MM-DD"));const r={...t,values:a};n(e,r)}else{if(0===R.length)return;const a={...t,values:R};n(e,a)}F(null),T([]),D([]),$(null),j(null)})(e),disabled:a?!q&&!A:0===R.length,sx:{textTransform:"none",borderRadius:"6px",backgroundColor:"rgb(70, 134, 128)",boxShadow:"none","&:hover":{backgroundColor:"rgb(50, 114, 108)",boxShadow:"none"}}},"Save Changes"))))}))))},vt=({reportData:t,dimensions:a,metrics:r,loading:n,onPageChange:l,totalRows:o=0,titleOverrides:i={dimensions:{},metrics:{}}})=>{const[s,d]=e.useState({page:0,pageSize:50}),c=X.default.useMemo(()=>{const e=[];return a.forEach(t=>{let a,r;if(t.relations&&t.relations.length>0){const e=t.fullPath.split("."),r=e[0],n=e[1],l=r.split("_");l.shift();const o=l.join("_");a=o?`${o}_${n}`:n}else a=t.fullPath.replace(".","_");r=i.dimensions[t.fullPath]||t.dimensionTitle||a,e.push({field:a,headerName:r,flex:1,minWidth:150})}),r.forEach(t=>{const a=t.metric;let r,n;if(t.relations&&t.relations.length>0){const e=t.fullPath.split("."),a=e[0],n=e[1],l=a.split("_");l.shift();const o=l.join("_");r=o?`${o}_${n}`:n}else r=t.metricName;n=i.metrics[t.fullPath]||t.metricTitle||r,e.push({field:r,headerName:n,flex:1,minWidth:150,type:"integer"===a?.type||"currency"===a?.type?"number":"string",valueFormatter:e=>{if(null==e)return"";if(a?.format){const t=te.default(e).format(a.format);return a?.prefix?`${a.prefix} ${t}`:t}return e}})}),e},[a,r,i]),u=X.default.useMemo(()=>t&&Array.isArray(t)?t.map((e,t)=>({id:t,...e})):[],[t]);return n?X.default.createElement(m.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},X.default.createElement(m.CircularProgress,null)):t&&0!==t.length?X.default.createElement(m.Box,{sx:{height:600,width:"100%"}},X.default.createElement(C.DataGrid,{rows:u,columns:c,paginationModel:s,onPaginationModelChange:e=>{d(e),l&&e.page!==s.page&&l(e.page,e.pageSize)},pageSizeOptions:[10,25,50,100],paginationMode:"server",rowCount:o||u.length,loading:n,disableRowSelectionOnClick:!0,sx:{"& .MuiDataGrid-cell":{padding:"8px"},"& .MuiDataGrid-columnHeader":{backgroundColor:"#f5f5f5",fontWeight:"bold"}}})):X.default.createElement(m.Box,{display:"flex",justifyContent:"center",alignItems:"center",minHeight:400},X.default.createElement(m.Typography,{variant:"body1",color:"textSecondary"},"No data available. Run a report to see results."))};function wt({children:e,value:t,index:a}){return X.default.createElement("div",{role:"tabpanel",hidden:t!==a,id:`report-tabpanel-${a}`,"aria-labelledby":`report-tab-${a}`},t===a&&X.default.createElement(m.Box,{sx:{py:3}},e))}const Ct=({reportDefinitionId:t,cloneData:a,autoRun:r,onBackToList:n})=>{const l=ft(),o=dt(),[i,s]=e.useState(null),[d,c]=e.useState(""),[u,f]=e.useState(""),[p,g]=e.useState({dimensions:[],metrics:[],filters:{}}),[h,y]=e.useState({dimensions:{},metrics:{},filters:{}}),[x,b]=e.useState(null),[E,v]=e.useState(!1),[w,C]=e.useState(0),[S,k]=e.useState(0),[T,R]=e.useState(50),[D,B]=e.useState(0),[P,z]=e.useState(!1),[F,M]=e.useState(!1);e.useEffect(()=>{(async()=>{const e=await Ye.getProviders();console.log({providers:e}),s(e)})()},[]),e.useEffect(()=>{t&&i&&$(t)},[t,i]),e.useEffect(()=>{a&&i&&A(a)},[a,i]),e.useEffect(()=>{r&&F&&d&&p.dimensions.length>0&&_()},[r,F]);const I=(e,t,a)=>{try{const[r,n]=e.split("."),l=r.split("_");let o=a;const i=[],s=[a],d=[];for(let e=1;e<l.length;e++){const a=l[e],r=t[o];if(!r||!r.relations)return console.warn(`Provider ${o} not found or has no relations`),null;const n=r.relations.find(e=>e.alias===a);if(!n)return console.warn(`Relation with alias ${a} not found in provider ${o}`),null;i.push(n),d.push(n.name),o=n.target,s.push(o)}const c=t[o];if(!c)return console.warn(`Final provider ${o} not found`),null;const u=c.default_alias;if(!c.dimensions||!c.dimensions[u])return console.warn(`Dimensions not found for alias ${u} in provider ${o}`),null;const f=c.dimensions[u][n];return f?{dimension:f,relations:i,providerPath:s,relationNames:d,dimensionKey:n,dimensionTitle:f.title||n,fullPath:e}:(console.warn(`Dimension ${n} not found in provider ${o}, alias ${u}`),null)}catch(t){return console.warn(`Error reconstructing dimension from path ${e}:`,t),null}},q=(e,t,a)=>{try{const[r,n]=e.split("."),l=r.split("_");let o=a;const i=[],s=[a],d=[];for(let e=1;e<l.length;e++){const a=l[e],r=t[o];if(!r||!r.relations)return console.warn(`Provider ${o} not found or has no relations`),null;const n=r.relations.find(e=>e.alias===a);if(!n)return console.warn(`Relation with alias ${a} not found in provider ${o}`),null;i.push(n),d.push(n.name),o=n.target,s.push(o)}const c=t[o];if(!c)return console.warn(`Final provider ${o} not found`),null;if(!c.metrics)return console.warn(`Metrics not found in provider ${o}`),null;const u=c.metrics.find(e=>e.name===n);return u?{metric:u,relations:i,providerPath:s,relationNames:d,metricName:n,metricTitle:u.title||n,fullPath:e}:(console.warn(`Metric ${n} not found in provider ${o}`),null)}catch(t){return console.warn(`Error reconstructing metric from path ${e}:`,t),null}},$=async e=>{try{console.log("Loading report definition:",e);const t=await Ye.getReportDefinition({id:e});console.log("Loaded report definition:",t),c(t.provider),f(t.title||"");const a=[],r={};if(t.definition?.doc?.query?.order_by)for(const e of t.definition.doc.query.order_by)!0===e.desc?r[e.name]="desc":r[e.name]="asc";if(t.definition?.doc?.query?.dimensions)for(const e of t.definition.doc.query.dimensions){const n=I(e,i,t.provider);n&&(n.sortOrder=r[e]||null,a.push(n))}const n=[];if(t.definition?.doc?.query?.metrics)for(const e of t.definition.doc.query.metrics){const a=q(e,i,t.provider);a&&n.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 o={};if(t.definition?.doc?.query?.filter){const e=t.definition.doc.query.filter;(e.and||e.or||[]).forEach(e=>{const[a,r]=Object.entries(e)[0],n=I(a,i,t.provider);n&&(o[a]={...n,values:r})})}g({dimensions:a,metrics:n,filters:o}),y(l),M(!0),console.log("Reconstructed report:",{dimensions:a,metrics:n,filters:o,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),c(e.provider),f(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 r of e.definition.doc.query.dimensions){const n=I(r,i,e.provider);n&&(n.sortOrder=a[r]||null,t.push(n))}const r=[];if(e.definition?.doc?.query?.metrics)for(const t of e.definition.doc.query.metrics){const a=q(t,i,e.provider);a&&r.push(a)}const n={dimensions:{},metrics:{},filters:{}};e.definition?.doc?.query?.titles&&(e.definition.doc.query.titles.dimensions&&(n.dimensions=e.definition.doc.query.titles.dimensions),e.definition.doc.query.titles.metrics&&(n.metrics=e.definition.doc.query.titles.metrics),e.definition.doc.query.titles.filters&&(n.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,r]=Object.entries(t)[0],n=I(a,i,e.provider);n&&(l[a]={...n,values:r})})}g({dimensions:t,metrics:r,filters:l}),y(n),console.log("Loaded cloned report:",{dimensions:t,metrics:r,filters:l,titleOverrides:n})}catch(e){console.error("Error loading cloned report:",e),l.error("Error loading cloned report: "+(e.message||"Unknown error"))}},j=(e=0,t=50)=>{const a=p.dimensions.map(e=>{const t={name:e.fullPath};return"desc"===e.sortOrder&&(t.desc=!0),t}),r=[];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&&r.push({[e]:t.values}):"object"==typeof t.values&&r.push({[e]:t.values}))});const n=r.length>0?{and:r}: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 i={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&&(i.titles=l),n&&(i.filter=n);return{provider:d,doc:{query:i},parameters:o?.parameters||{base_currency:"EUR"}}},O=async(e,t)=>{try{v(!0);const a=j(e,t);console.log("Running report with:",a);const r=await Ye.runAdHocReport({report:a});console.log("Report result:",r),b(r),r&&r.length<t?C(e*t+r.length):C((e+2)*t)}catch(e){console.error("Error running report:",e),l.error("Error running report: "+(e.message||"Unknown error")),b(null)}finally{v(!1)}},_=async()=>{k(0),await O(0,T),B(3)},W=d,N=d&&u.trim()&&(p.dimensions.length>0||p.metrics.length>0);return X.default.createElement(m.Box,{sx:{p:3,fontFamily:"system-ui"}},X.default.createElement(m.Box,{sx:{display:"flex",justifyContent:"space-between",alignItems:"center",mb:2,backgroundColor:"transparent",fontFamily:"system-ui"}},X.default.createElement("h1",null,t?"Edit Report":"Create New Report"),n&&X.default.createElement(m.Button,{variant:"outlined",startIcon:X.default.createElement(Ce.default,null),onClick:n},"Back to List")),X.default.createElement(m.Box,{sx:{mt:2,p:3,backgroundColor:"white",borderRadius:"12px",border:"1px solid #e0e0e0",fontFamily:"system-ui",display:"flex",flexDirection:"column",gap:3,boxShadow:"0px 2px 4px rgba(0,0,0,0.02)"}},X.default.createElement(m.Box,{sx:{display:"flex",gap:4,alignItems:"flex-start",flexWrap:"wrap"}},X.default.createElement("div",null,X.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1,color:"rgb(37, 37, 37)"}},"Report Title"),X.default.createElement(m.TextField,{value:u,onChange:e=>f(e.target.value),placeholder:"Enter report title",sx:{width:"400px",fontFamily:"system-ui","& .MuiOutlinedInput-root":{backgroundColor:"white",borderRadius:"8px"}},size:"small"})),X.default.createElement("div",null,X.default.createElement(m.Typography,{sx:{fontSize:"14px",fontWeight:600,mb:1,color:"rgb(37, 37, 37)"}},"Select Root Provider"),X.default.createElement(tt,{items:i?Object.keys(i).filter(e=>!0===i[e].base).map(e=>({key:e,value:i[e].name||e})):[],value:d,onChange:e=>{c(e.target.value),g({dimensions:[],metrics:[],filters:{}}),y({dimensions:{},metrics:{},filters:{}}),console.log("Selected root provider:",e.target.value)},sx:{width:"300px",fontFamily:"system-ui"},disabled:!!t}))),X.default.createElement(m.Box,{sx:{display:"flex",gap:2,alignItems:"center"}},X.default.createElement(m.Button,{variant:"contained",onClick:_,disabled:!W,startIcon:X.default.createElement(ve.default,null),sx:{height:"40px",fontFamily:"system-ui",borderRadius:"8px",boxShadow:"none",textTransform:"none",backgroundColor:"rgb(70, 134, 128)",fontWeight:500,padding:"0 20px","&:hover":{backgroundColor:"rgb(46, 102, 98)",boxShadow:"none"}}},"Run Report"),X.default.createElement(m.Button,{variant:"outlined",startIcon:X.default.createElement(ke.default,null),onClick:async()=>{try{v(!0);const e=j();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 Ye.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{v(!1)}},disabled:!W||E,sx:{height:"40px",fontFamily:"system-ui",borderRadius:"8px",boxShadow:"none",textTransform:"none",color:"#9c27b0",borderColor:"#e1bee7",fontWeight:500,padding:"0 20px","&:hover":{borderColor:"#9c27b0",backgroundColor:"rgba(156, 39, 176, 0.04)"}}},"Download CSV"),X.default.createElement(m.Button,{variant:"outlined",startIcon:X.default.createElement(Se.default,null),onClick:async()=>{if(d)if(u.trim())if(0!==p.dimensions.length||0!==p.metrics.length)try{z(!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 r={dimensions:p.dimensions.map(e=>e.fullPath),metrics:p.metrics.map(e=>e.fullPath),order_by:e};if(Object.keys(a).length>0&&(r.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&&(r.filter={and:e})}const o={query:r},i={provider:d,title:u.trim(),definition:{provider:d,doc:o,parameters:{base_currency:"EUR"}}};console.log("Saving report definition:",i),t?(await Ye.updateReportDefinition({id:t,reportDefinition:i}),l.success("Report definition updated successfully!")):(await Ye.createReportDefinition({reportDefinition:i}),l.success("Report definition created successfully!")),n&&n()}catch(e){console.error("Error saving report definition:",e),l.error("Error saving report definition: "+(e.message||"Unknown error"))}finally{z(!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:!N||P,sx:{height:"40px",fontFamily:"system-ui",borderRadius:"8px",boxShadow:"none",textTransform:"none",color:"#2e7d32",borderColor:"#a5d6a7",fontWeight:500,padding:"0 20px","&:hover":{borderColor:"#2e7d32",backgroundColor:"rgba(46, 125, 50, 0.04)"}}},P?"Saving...":t?"Update Report":"Save Report"))),d&&X.default.createElement(m.Box,{sx:{mt:2,fontFamily:"system-ui",backgroundColor:"white",px:3,py:2,borderRadius:"8px"}},X.default.createElement(m.Box,{sx:{borderBottom:1,borderColor:"rgba(70, 134, 127, 0.27)"}},X.default.createElement(m.Tabs,{value:D,onChange:(e,t)=>{B(t)},"aria-label":"report builder tabs",sx:{"& .MuiTabs-indicator":{display:"flex",justifyContent:"center",backgroundColor:"rgb(70, 134, 128)"},"& .MuiTabs-indicatorSpan":{backgroundColor:"rgb(70, 134, 128)"}}},X.default.createElement(m.Tab,{label:X.default.createElement(m.Badge,{badgeContent:p.dimensions.length,sx:{"& .MuiBadge-badge":{backgroundColor:"rgb(70, 134, 128)",color:"#fff"}}},X.default.createElement("span",{style:{marginRight:p.dimensions.length>0?"12px":"0"}},"Dimensions")),id:"report-tab-0","aria-controls":"report-tabpanel-0",sx:{height:"41px",fontFamily:"system-ui",borderRadius:"0.5rem",boxShadow:"none",textTransform:"none",color:"rgb(37, 37, 37)","&.Mui-selected":{color:"rgb(70, 134, 128)"}}}),X.default.createElement(m.Tab,{label:X.default.createElement(m.Badge,{badgeContent:p.metrics.length,sx:{"& .MuiBadge-badge":{backgroundColor:"rgb(70, 134, 128)",color:"#fff"}}},X.default.createElement("span",{style:{marginRight:p.metrics.length>0?"12px":"0"}},"Metrics")),id:"report-tab-1","aria-controls":"report-tabpanel-1",sx:{height:"41px",fontFamily:"system-ui",borderRadius:"0.5rem",boxShadow:"none",textTransform:"none",color:"rgb(37, 37, 37)","&.Mui-selected":{color:"rgb(70, 134, 128)"}}}),X.default.createElement(m.Tab,{label:X.default.createElement(m.Badge,{badgeContent:Object.keys(p.filters).length,sx:{"& .MuiBadge-badge":{backgroundColor:"rgb(70, 134, 128)",color:"#fff"}}},X.default.createElement("span",{style:{marginRight:Object.keys(p.filters).length>0?"12px":"0"}},"Filters")),id:"report-tab-2","aria-controls":"report-tabpanel-2",sx:{height:"41px",fontFamily:"system-ui",borderRadius:"0.5rem",boxShadow:"none",textTransform:"none",color:"rgb(37, 37, 37)","&.Mui-selected":{color:"rgb(70, 134, 128)"}}}),X.default.createElement(m.Tab,{label:x?"Results":"Results (Run report first)",id:"report-tab-3","aria-controls":"report-tabpanel-3",disabled:!x,sx:{height:"41px",fontFamily:"system-ui",borderRadius:"0.5rem",boxShadow:"none",textTransform:"none",color:"rgb(37, 37, 37)","&.Mui-selected":{color:"rgb(70, 134, 128)"}}}))),X.default.createElement(wt,{value:D,index:0},X.default.createElement(yt,{providersData:i,rootProvider:d,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})),X.default.createElement(wt,{value:D,index:1},X.default.createElement(bt,{providersData:i,rootProvider:d,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})),X.default.createElement(wt,{value:D,index:2},X.default.createElement(Et,{providersData:i,rootProvider:d,savedFilters:p.filters,existingDimensions:p.dimensions,existingMetrics:p.metrics,onSaveFilter:(e,t)=>{g(a=>{const r={...a,filters:{...a.filters,[e]:t}};return console.log("Filter saved:",{fullPath:e,filterData:t}),console.log("Complete report:",r),r})},onRemoveFilter:e=>{g(t=>{const a={...t.filters};return delete a[e],{...t,filters:a}})},titleOverrides:h.filters,dimensionTitleOverrides:h.dimensions,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}})}})),X.default.createElement(wt,{value:D,index:3},x&&X.default.createElement(vt,{reportData:x,dimensions:p.dimensions,metrics:p.metrics,loading:E,onPageChange:async(e,t)=>{k(e),t!==T&&R(t),await O(e,t)},totalRows:w,titleOverrides:h}))))},St=()=>{const[t,a]=e.useState("list"),[r,n]=e.useState(null),[l,o]=e.useState(null),[i,s]=e.useState(!1),[d,c]=e.useState(0),u=e=>{n(e),o(null),s(!1),a("builder")},f=()=>{n(null),o(null),s(!1),a("builder")},m=e=>{n(e),o(null),s(!0),a("builder")},p=e=>{n(null),o(e),s(!1),a("builder")};return"list"===t?X.default.createElement(pt,{onSelectReport:u,onAddNew:f,onCloneReport:p,onRunReport:m,refreshTrigger:d}):X.default.createElement(Ct,{reportDefinitionId:r,cloneData:l,autoRun:i,onBackToList:()=>{n(null),o(null),s(!1),a("list"),c(e=>e+1)}})};var kt={Chart:ot,Dashboard:function({id:t="sample_dashboard",api:a,params:r}){const n=dt(),l=a||n?.api||{},o=r||n?.parameters||{},[i,s]=X.default.useState(),[d]=X.default.useState(),[c,u]=X.default.useState([]),f=X.default.useRef({}),m=nt();lt(m),console.log({rows:c},{dashboard:i},{schema:d},{params:o}),e.useEffect(()=>{Ye.setBaseUrl(l.base_url),Ye.setToken(l.token)},[l]);const p=async e=>{const t=e?.doc?.rows||[],a=[];for(let e=0;e<t.length;e++){const r=t[e];r.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(r)}u(a)};return X.default.useEffect(()=>{t&&(async()=>{Ye.setBaseUrl(l.base_url),Ye.setToken(l.token),await Ye.loadDashboardMeta({dashboardId:t});const e=await Ye.getDashboard({id:t});f.current[e?.id]=e,s(e),await p(e)})().catch(e=>console.error(e.message))},[t]),X.default.createElement(he.default,{maxWidth:!1,disableGutters:!0},X.default.createElement(ge.default,{container:!0,spacing:3},c?.map((e,t)=>{const a=(e=>0===e?12:12/e)(e.columns.length);return X.default.createElement(X.default.Fragment,{key:t},1===t?X.default.createElement(ge.default,{item:!0,xs:12},X.default.createElement(ge.default,{container:!0,spacing:3},e.columns.map((e,t)=>X.default.createElement(ge.default,{key:t,item:!0,xs:12,md:a},X.default.createElement(ot,{api:l,cache:f.current,id:e.id,dashboard:i,schema:d,title:e.title,filter:e.filter,params:o}))))):e.columns.map((e,t)=>X.default.createElement(ge.default,{key:t,item:!0,xs:12,md:a},X.default.createElement(ot,{api:l,cache:f.current,id:e.id,dashboard:i,schema:d,title:e.title,filter:e.filter,params:o}))))})))},ReportApp:({params:t,api:a})=>(Ye._initialized||(Ye.setBaseUrl(a.base_url),Ye.setToken(a.token),Ye._initialized=!0),e.useEffect(()=>{Ye.setBaseUrl(a.base_url),Ye.setToken(a.token)},[a]),X.default.createElement(ut,null,X.default.createElement(st,{defaultParameters:t,defaultApi:a},X.default.createElement(Z.ThemeProvider,{theme:Z.createTheme({palette:{primary:{main:"rgb(70, 134, 128)"}},components:{MuiButton:{styleOverrides:{root:{borderRadius:8,textTransform:"none",boxShadow:"none","&:hover":{boxShadow:"none"}}}},MuiTooltip:{styleOverrides:{tooltip:{fontSize:"0.875rem",backgroundColor:"rgba(97, 97, 97, 0.95)",maxWidth:500},arrow:{color:"rgba(97, 97, 97, 0.95)"}},defaultProps:{arrow:!0,enterDelay:300,leaveDelay:200}},MuiPopper:{defaultProps:{style:{zIndex:1500}}}}})},X.default.createElement(St,null)))))};exports.default=kt;
|
|
@@ -44,6 +44,7 @@ import CloseIcon from '@mui/icons-material/Close';
|
|
|
44
44
|
import RestartAltIcon from '@mui/icons-material/RestartAlt';
|
|
45
45
|
import PlaylistAddIcon from '@mui/icons-material/PlaylistAdd';
|
|
46
46
|
import FilterAltIcon from '@mui/icons-material/FilterAlt';
|
|
47
|
+
import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';
|
|
47
48
|
import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
|
|
48
49
|
import { DatePicker } from '@mui/x-date-pickers/DatePicker';
|
|
49
50
|
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
|
|
@@ -605,6 +606,7 @@ function Internal(name, props) {
|
|
|
605
606
|
* - inputValue?: string (controlled input)
|
|
606
607
|
* - defaultInputValue?: string (uncontrolled input)
|
|
607
608
|
* - onInputChange?: (text: string) => void (debounced by debounceMs)
|
|
609
|
+
* - onInputChangeImmediate?: (text: string) => void (called immediately without debounce)
|
|
608
610
|
* - debounceMs?: number (default 300)
|
|
609
611
|
* - label?, placeholder?, loading?, disabled?, size? = 'small', error?, helperText?,
|
|
610
612
|
* limitTags? = 3, disableClearable?, id?, textFieldProps?
|
|
@@ -639,6 +641,7 @@ function CheckboxMultiAutocomplete({
|
|
|
639
641
|
inputValue,
|
|
640
642
|
defaultInputValue,
|
|
641
643
|
onInputChange,
|
|
644
|
+
onInputChangeImmediate,
|
|
642
645
|
debounceMs = 300,
|
|
643
646
|
label,
|
|
644
647
|
placeholder,
|
|
@@ -702,6 +705,14 @@ function CheckboxMultiAutocomplete({
|
|
|
702
705
|
},
|
|
703
706
|
onInputChange: (event, newInput, reason) => {
|
|
704
707
|
if (!isInputControlled) setInnerInput(newInput ?? "");
|
|
708
|
+
|
|
709
|
+
// Call immediate handler if provided
|
|
710
|
+
if (reason === "input" || reason === "clear") {
|
|
711
|
+
const text = reason === "clear" ? "" : newInput ?? "";
|
|
712
|
+
onInputChangeImmediate && onInputChangeImmediate(text);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
// Call debounced handler
|
|
705
716
|
if (reason === "input") {
|
|
706
717
|
debouncedInput(newInput ?? "");
|
|
707
718
|
} else if (reason === "clear") {
|
|
@@ -3558,17 +3569,21 @@ const Filters = ({
|
|
|
3558
3569
|
existingDimensions = [],
|
|
3559
3570
|
existingMetrics = [],
|
|
3560
3571
|
titleOverrides = {},
|
|
3572
|
+
dimensionTitleOverrides = {},
|
|
3561
3573
|
onUpdateTitle,
|
|
3562
3574
|
onResetTitle
|
|
3563
3575
|
}) => {
|
|
3564
3576
|
const reportingContext = useReportingContextOptional();
|
|
3565
3577
|
const [isAdding, setIsAdding] = useState(false);
|
|
3578
|
+
const [isAddingFromDimension, setIsAddingFromDimension] = useState(false); // New state for dimension filter mode
|
|
3566
3579
|
const [dimensionSelectionChain, setDimensionSelectionChain] = useState([]);
|
|
3567
3580
|
const [selectedDimension, setSelectedDimension] = useState('');
|
|
3581
|
+
const [selectedExistingDimension, setSelectedExistingDimension] = useState(''); // For dimension filter mode
|
|
3568
3582
|
const [availableFilterValues, setAvailableFilterValues] = useState([]);
|
|
3569
3583
|
const [selectedFilterValues, setSelectedFilterValues] = useState([]);
|
|
3570
3584
|
const [loadingFilterValues, setLoadingFilterValues] = useState(false);
|
|
3571
3585
|
const [editingFilterPath, setEditingFilterPath] = useState(null); // Track which filter is being edited
|
|
3586
|
+
const [filterSearchText, setFilterSearchText] = useState(''); // Track search text for server-side filtering
|
|
3572
3587
|
|
|
3573
3588
|
// Date range state for date/timestamp filters
|
|
3574
3589
|
const [dateRangeFrom, setDateRangeFrom] = useState(null);
|
|
@@ -3586,6 +3601,7 @@ const Filters = ({
|
|
|
3586
3601
|
setSelectedFilterValues([]);
|
|
3587
3602
|
setDateRangeFrom(null);
|
|
3588
3603
|
setDateRangeTo(null);
|
|
3604
|
+
setFilterSearchText('');
|
|
3589
3605
|
}, [dimensionSelectionChain]);
|
|
3590
3606
|
|
|
3591
3607
|
// Get the current provider based on selection chain
|
|
@@ -3595,20 +3611,6 @@ const Filters = ({
|
|
|
3595
3611
|
return dimensionSelectionChain[dimensionSelectionChain.length - 1].targetKey;
|
|
3596
3612
|
};
|
|
3597
3613
|
|
|
3598
|
-
// Check if a dimension is suitable for filtering (simple column, not expression-based)
|
|
3599
|
-
const isFilterableDimension = dimension => {
|
|
3600
|
-
if (!dimension.column) return false;
|
|
3601
|
-
|
|
3602
|
-
// Simple column names should only contain:
|
|
3603
|
-
// - letters (a-z, A-Z)
|
|
3604
|
-
// - underscores (_)
|
|
3605
|
-
// - dots (.) for table prefixes like "ft.currency"
|
|
3606
|
-
// - numbers (0-9)
|
|
3607
|
-
// If it contains anything else (spaces, parentheses, operators, etc.), it's an expression
|
|
3608
|
-
const simpleColumnPattern = /^[a-zA-Z0-9_.]+$/;
|
|
3609
|
-
return simpleColumnPattern.test(dimension.column);
|
|
3610
|
-
};
|
|
3611
|
-
|
|
3612
3614
|
// Check if a dimension is a date or timestamp type
|
|
3613
3615
|
const isDateDimension = dimension => {
|
|
3614
3616
|
return dimension && (dimension.type === 'date' || dimension.type === 'timestamp');
|
|
@@ -3630,8 +3632,8 @@ const Filters = ({
|
|
|
3630
3632
|
Object.keys(dimensionsForAlias).forEach(dimKey => {
|
|
3631
3633
|
const dimension = dimensionsForAlias[dimKey];
|
|
3632
3634
|
|
|
3633
|
-
//
|
|
3634
|
-
if (
|
|
3635
|
+
// Include all dimensions (API now supports filtering on calculated dimensions)
|
|
3636
|
+
if (dimension.column) {
|
|
3635
3637
|
items.push({
|
|
3636
3638
|
// Include provider name to ensure uniqueness across different providers
|
|
3637
3639
|
key: `${currentProvider}_${alias}.${dimKey}`,
|
|
@@ -3647,8 +3649,20 @@ const Filters = ({
|
|
|
3647
3649
|
};
|
|
3648
3650
|
const handleAddClick = () => {
|
|
3649
3651
|
setIsAdding(true);
|
|
3652
|
+
setIsAddingFromDimension(false);
|
|
3650
3653
|
setDimensionSelectionChain([]);
|
|
3651
3654
|
setSelectedDimension('');
|
|
3655
|
+
setSelectedExistingDimension('');
|
|
3656
|
+
setAvailableFilterValues([]);
|
|
3657
|
+
setSelectedFilterValues([]);
|
|
3658
|
+
setDateRangeFrom(null);
|
|
3659
|
+
setDateRangeTo(null);
|
|
3660
|
+
setEditingFilterPath(null); // Close any editing
|
|
3661
|
+
};
|
|
3662
|
+
const handleAddFromDimensionClick = () => {
|
|
3663
|
+
setIsAddingFromDimension(true);
|
|
3664
|
+
setIsAdding(false);
|
|
3665
|
+
setSelectedExistingDimension('');
|
|
3652
3666
|
setAvailableFilterValues([]);
|
|
3653
3667
|
setSelectedFilterValues([]);
|
|
3654
3668
|
setDateRangeFrom(null);
|
|
@@ -3657,12 +3671,15 @@ const Filters = ({
|
|
|
3657
3671
|
};
|
|
3658
3672
|
const handleCancel = () => {
|
|
3659
3673
|
setIsAdding(false);
|
|
3674
|
+
setIsAddingFromDimension(false);
|
|
3660
3675
|
setDimensionSelectionChain([]);
|
|
3661
3676
|
setSelectedDimension('');
|
|
3677
|
+
setSelectedExistingDimension('');
|
|
3662
3678
|
setAvailableFilterValues([]);
|
|
3663
3679
|
setSelectedFilterValues([]);
|
|
3664
3680
|
setDateRangeFrom(null);
|
|
3665
3681
|
setDateRangeTo(null);
|
|
3682
|
+
setFilterSearchText('');
|
|
3666
3683
|
setEditingFilterPath(null); // Close any editing
|
|
3667
3684
|
};
|
|
3668
3685
|
const handleEditFilter = async (fullPath, filter) => {
|
|
@@ -3740,6 +3757,7 @@ const Filters = ({
|
|
|
3740
3757
|
setSelectedFilterValues([]);
|
|
3741
3758
|
setDateRangeFrom(null);
|
|
3742
3759
|
setDateRangeTo(null);
|
|
3760
|
+
setFilterSearchText('');
|
|
3743
3761
|
};
|
|
3744
3762
|
|
|
3745
3763
|
// Title editing handlers
|
|
@@ -3776,7 +3794,7 @@ const Filters = ({
|
|
|
3776
3794
|
};
|
|
3777
3795
|
|
|
3778
3796
|
// Fetch distinct values for the selected dimension
|
|
3779
|
-
const fetchFilterValues = async fullPath => {
|
|
3797
|
+
const fetchFilterValues = async (fullPath, searchText = '') => {
|
|
3780
3798
|
setLoadingFilterValues(true);
|
|
3781
3799
|
try {
|
|
3782
3800
|
// Get parameters from context if available, otherwise use default
|
|
@@ -3784,17 +3802,31 @@ const Filters = ({
|
|
|
3784
3802
|
base_currency: "EUR"
|
|
3785
3803
|
};
|
|
3786
3804
|
|
|
3805
|
+
// Build query object
|
|
3806
|
+
const queryObj = {
|
|
3807
|
+
dimensions: [fullPath],
|
|
3808
|
+
metrics: [],
|
|
3809
|
+
order_by: [{
|
|
3810
|
+
"name": fullPath
|
|
3811
|
+
}]
|
|
3812
|
+
};
|
|
3813
|
+
|
|
3814
|
+
// Add filter if search text is provided
|
|
3815
|
+
if (searchText && searchText.trim() !== '') {
|
|
3816
|
+
queryObj.filter = {
|
|
3817
|
+
and: [{
|
|
3818
|
+
[fullPath]: {
|
|
3819
|
+
"ilike": `${searchText.trim()}%`
|
|
3820
|
+
}
|
|
3821
|
+
}]
|
|
3822
|
+
};
|
|
3823
|
+
}
|
|
3824
|
+
|
|
3787
3825
|
// Build a temporary report to fetch distinct values
|
|
3788
3826
|
const reportPayload = {
|
|
3789
3827
|
provider: rootProvider,
|
|
3790
3828
|
doc: {
|
|
3791
|
-
query:
|
|
3792
|
-
dimensions: [fullPath],
|
|
3793
|
-
metrics: [],
|
|
3794
|
-
order_by: [{
|
|
3795
|
-
"name": fullPath
|
|
3796
|
-
}]
|
|
3797
|
-
}
|
|
3829
|
+
query: queryObj
|
|
3798
3830
|
},
|
|
3799
3831
|
parameters
|
|
3800
3832
|
};
|
|
@@ -3831,8 +3863,31 @@ const Filters = ({
|
|
|
3831
3863
|
value: String(value)
|
|
3832
3864
|
};
|
|
3833
3865
|
});
|
|
3866
|
+
|
|
3867
|
+
// Merge with currently selected values to ensure they're always available
|
|
3868
|
+
// This is important when editing filters with search text - we don't want to lose
|
|
3869
|
+
// previously selected values that don't match the current search
|
|
3870
|
+
const selectedValueItems = selectedFilterValues.map(key => ({
|
|
3871
|
+
key: String(key),
|
|
3872
|
+
value: String(key)
|
|
3873
|
+
}));
|
|
3874
|
+
|
|
3875
|
+
// Create a map to avoid duplicates
|
|
3876
|
+
const valueMap = new Map();
|
|
3877
|
+
|
|
3878
|
+
// Add selected values first (they should appear at the top or be preserved)
|
|
3879
|
+
selectedValueItems.forEach(item => {
|
|
3880
|
+
valueMap.set(item.key, item);
|
|
3881
|
+
});
|
|
3882
|
+
|
|
3883
|
+
// Add fetched values
|
|
3884
|
+
distinctValues.forEach(item => {
|
|
3885
|
+
valueMap.set(item.key, item);
|
|
3886
|
+
});
|
|
3887
|
+
const mergedValues = Array.from(valueMap.values());
|
|
3834
3888
|
console.log('Transformed distinct values:', distinctValues);
|
|
3835
|
-
|
|
3889
|
+
console.log('Merged with selected values:', mergedValues);
|
|
3890
|
+
setAvailableFilterValues(mergedValues);
|
|
3836
3891
|
} catch (error) {
|
|
3837
3892
|
console.error('Error fetching filter values:', error);
|
|
3838
3893
|
setAvailableFilterValues([]);
|
|
@@ -3918,6 +3973,58 @@ const Filters = ({
|
|
|
3918
3973
|
onSaveFilter(fullPath, filterData);
|
|
3919
3974
|
handleCancel();
|
|
3920
3975
|
};
|
|
3976
|
+
const handleSaveFromDimension = () => {
|
|
3977
|
+
if (!selectedExistingDimension) return;
|
|
3978
|
+
|
|
3979
|
+
// Find the dimension data from existingDimensions
|
|
3980
|
+
const dimensionData = existingDimensions.find(dim => dim.fullPath === selectedExistingDimension);
|
|
3981
|
+
if (!dimensionData) return;
|
|
3982
|
+
|
|
3983
|
+
// Check if this is a date filter
|
|
3984
|
+
const isDate = isDateDimension(dimensionData.dimension);
|
|
3985
|
+
|
|
3986
|
+
// Validate based on filter type
|
|
3987
|
+
if (isDate) {
|
|
3988
|
+
if (!dateRangeFrom && !dateRangeTo) return; // At least one date must be provided
|
|
3989
|
+
} else {
|
|
3990
|
+
if (selectedFilterValues.length === 0) return; // Regular filters must have values
|
|
3991
|
+
}
|
|
3992
|
+
|
|
3993
|
+
// Prepare filter values based on type
|
|
3994
|
+
let filterValues;
|
|
3995
|
+
if (isDate) {
|
|
3996
|
+
// For date filters, store as {gte, lte} object (only include provided dates)
|
|
3997
|
+
filterValues = {};
|
|
3998
|
+
if (dateRangeFrom) {
|
|
3999
|
+
filterValues.gte = dateRangeFrom.format('YYYY-MM-DD');
|
|
4000
|
+
}
|
|
4001
|
+
if (dateRangeTo) {
|
|
4002
|
+
filterValues.lte = dateRangeTo.format('YYYY-MM-DD');
|
|
4003
|
+
}
|
|
4004
|
+
} else {
|
|
4005
|
+
// For regular filters, store as array
|
|
4006
|
+
filterValues = selectedFilterValues;
|
|
4007
|
+
}
|
|
4008
|
+
|
|
4009
|
+
// Create filter data using the existing dimension's metadata
|
|
4010
|
+
const filterData = {
|
|
4011
|
+
// Complete dimension object from the dimension
|
|
4012
|
+
dimension: dimensionData.dimension,
|
|
4013
|
+
// Array of complete relation objects
|
|
4014
|
+
relations: dimensionData.relations,
|
|
4015
|
+
// Metadata
|
|
4016
|
+
providerPath: dimensionData.providerPath,
|
|
4017
|
+
relationNames: dimensionData.relationNames,
|
|
4018
|
+
dimensionKey: dimensionData.dimensionKey,
|
|
4019
|
+
dimensionTitle: dimensionData.dimensionTitle,
|
|
4020
|
+
// The constructed path for server
|
|
4021
|
+
fullPath: dimensionData.fullPath,
|
|
4022
|
+
// Selected filter values (array for regular, object for date)
|
|
4023
|
+
values: filterValues
|
|
4024
|
+
};
|
|
4025
|
+
onSaveFilter(dimensionData.fullPath, filterData);
|
|
4026
|
+
handleCancel();
|
|
4027
|
+
};
|
|
3921
4028
|
const handleDimensionChange = event => {
|
|
3922
4029
|
const dimensionKey = event.target.value;
|
|
3923
4030
|
setSelectedDimension(dimensionKey);
|
|
@@ -3964,6 +4071,80 @@ const Filters = ({
|
|
|
3964
4071
|
setAvailableFilterValues([]);
|
|
3965
4072
|
}
|
|
3966
4073
|
};
|
|
4074
|
+
const handleExistingDimensionChange = event => {
|
|
4075
|
+
const fullPath = event.target.value;
|
|
4076
|
+
setSelectedExistingDimension(fullPath);
|
|
4077
|
+
setSelectedFilterValues([]);
|
|
4078
|
+
setDateRangeFrom(null);
|
|
4079
|
+
setDateRangeTo(null);
|
|
4080
|
+
setFilterSearchText(''); // Reset search text when changing dimension
|
|
4081
|
+
|
|
4082
|
+
if (fullPath) {
|
|
4083
|
+
// Find the dimension data from existingDimensions
|
|
4084
|
+
const dimensionData = existingDimensions.find(dim => dim.fullPath === fullPath);
|
|
4085
|
+
if (dimensionData) {
|
|
4086
|
+
// Check if this is a date dimension
|
|
4087
|
+
const isDate = isDateDimension(dimensionData.dimension);
|
|
4088
|
+
|
|
4089
|
+
// Only fetch values for non-date dimensions
|
|
4090
|
+
if (!isDate) {
|
|
4091
|
+
fetchFilterValues(fullPath);
|
|
4092
|
+
}
|
|
4093
|
+
}
|
|
4094
|
+
} else {
|
|
4095
|
+
setAvailableFilterValues([]);
|
|
4096
|
+
}
|
|
4097
|
+
};
|
|
4098
|
+
|
|
4099
|
+
// Handler for search text input in filter values dropdown (debounced - triggers API call)
|
|
4100
|
+
const handleFilterSearchChange = searchText => {
|
|
4101
|
+
// Determine the fullPath based on current mode
|
|
4102
|
+
let fullPath = null;
|
|
4103
|
+
if (isAddingFromDimension && selectedExistingDimension) {
|
|
4104
|
+
// Mode: Adding filter from existing dimension
|
|
4105
|
+
fullPath = selectedExistingDimension;
|
|
4106
|
+
} else if (isAdding && selectedDimension) {
|
|
4107
|
+
// Mode: Adding new filter with provider selection
|
|
4108
|
+
const dimensionItems = getDimensionItems();
|
|
4109
|
+
const selectedItem = dimensionItems.find(item => item.key === selectedDimension);
|
|
4110
|
+
if (selectedItem) {
|
|
4111
|
+
// Build the complete relation objects array
|
|
4112
|
+
const relations = [];
|
|
4113
|
+
let currentProviderKey = rootProvider;
|
|
4114
|
+
dimensionSelectionChain.forEach(selection => {
|
|
4115
|
+
const provider = providersData[currentProviderKey];
|
|
4116
|
+
if (provider && provider.relations) {
|
|
4117
|
+
const relationObj = provider.relations.find(rel => rel.name === selection.relationName);
|
|
4118
|
+
if (relationObj) {
|
|
4119
|
+
relations.push(relationObj);
|
|
4120
|
+
}
|
|
4121
|
+
}
|
|
4122
|
+
currentProviderKey = selection.targetKey;
|
|
4123
|
+
});
|
|
4124
|
+
|
|
4125
|
+
// Build the alias path
|
|
4126
|
+
const rootProviderData = providersData[rootProvider];
|
|
4127
|
+
const aliasPath = [rootProviderData.default_alias];
|
|
4128
|
+
relations.forEach(rel => {
|
|
4129
|
+
aliasPath.push(rel.alias);
|
|
4130
|
+
});
|
|
4131
|
+
fullPath = `${aliasPath.join('_')}.${selectedItem.dimensionKey}`;
|
|
4132
|
+
}
|
|
4133
|
+
} else if (editingFilterPath) {
|
|
4134
|
+
// Mode: Editing existing filter
|
|
4135
|
+
fullPath = editingFilterPath;
|
|
4136
|
+
}
|
|
4137
|
+
|
|
4138
|
+
// Fetch filter values with search text if we have a fullPath
|
|
4139
|
+
if (fullPath) {
|
|
4140
|
+
fetchFilterValues(fullPath, searchText);
|
|
4141
|
+
}
|
|
4142
|
+
};
|
|
4143
|
+
|
|
4144
|
+
// Immediate handler for input changes (not debounced - updates state immediately)
|
|
4145
|
+
const handleFilterSearchInputChange = searchText => {
|
|
4146
|
+
setFilterSearchText(searchText);
|
|
4147
|
+
};
|
|
3967
4148
|
const formatProviderPath = filter => {
|
|
3968
4149
|
// Build path using root provider + relation names
|
|
3969
4150
|
const pathParts = [rootProvider];
|
|
@@ -3979,12 +4160,13 @@ const Filters = ({
|
|
|
3979
4160
|
sx: {
|
|
3980
4161
|
display: "flex",
|
|
3981
4162
|
justifyContent: "flex-start",
|
|
4163
|
+
gap: 2,
|
|
3982
4164
|
mb: 2
|
|
3983
4165
|
}
|
|
3984
|
-
}, !isAdding && /*#__PURE__*/React__default.createElement(Button, {
|
|
4166
|
+
}, !isAdding && !isAddingFromDimension && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, existingDimensions.length > 0 && /*#__PURE__*/React__default.createElement(Button, {
|
|
3985
4167
|
variant: "contained",
|
|
3986
|
-
startIcon: /*#__PURE__*/React__default.createElement(
|
|
3987
|
-
onClick:
|
|
4168
|
+
startIcon: /*#__PURE__*/React__default.createElement(FilterAltIcon, null),
|
|
4169
|
+
onClick: handleAddFromDimensionClick,
|
|
3988
4170
|
sx: {
|
|
3989
4171
|
height: "40px",
|
|
3990
4172
|
fontFamily: "system-ui",
|
|
@@ -3999,7 +4181,27 @@ const Filters = ({
|
|
|
3999
4181
|
boxShadow: "none"
|
|
4000
4182
|
}
|
|
4001
4183
|
}
|
|
4002
|
-
}, "Add Filter")
|
|
4184
|
+
}, "Add Filter"), /*#__PURE__*/React__default.createElement(Button, {
|
|
4185
|
+
variant: "outlined",
|
|
4186
|
+
startIcon: /*#__PURE__*/React__default.createElement(GridAddIcon, null),
|
|
4187
|
+
onClick: handleAddClick,
|
|
4188
|
+
sx: {
|
|
4189
|
+
height: "40px",
|
|
4190
|
+
fontFamily: "system-ui",
|
|
4191
|
+
fontSize: "14px",
|
|
4192
|
+
fontWeight: 500,
|
|
4193
|
+
borderRadius: "8px",
|
|
4194
|
+
textTransform: "none",
|
|
4195
|
+
borderColor: "rgb(70, 134, 128)",
|
|
4196
|
+
color: "rgb(70, 134, 128)",
|
|
4197
|
+
boxShadow: "none",
|
|
4198
|
+
"&:hover": {
|
|
4199
|
+
backgroundColor: "rgba(70, 134, 128, 0.04)",
|
|
4200
|
+
borderColor: "rgb(50, 114, 108)",
|
|
4201
|
+
boxShadow: "none"
|
|
4202
|
+
}
|
|
4203
|
+
}
|
|
4204
|
+
}, "Add Advanced Filter"))), isAdding && /*#__PURE__*/React__default.createElement(Paper$1, {
|
|
4003
4205
|
elevation: 0,
|
|
4004
4206
|
sx: {
|
|
4005
4207
|
p: 3,
|
|
@@ -4102,10 +4304,14 @@ const Filters = ({
|
|
|
4102
4304
|
items: availableFilterValues,
|
|
4103
4305
|
selectedKeys: selectedFilterValues,
|
|
4104
4306
|
onChange: keys => setSelectedFilterValues(keys),
|
|
4307
|
+
inputValue: filterSearchText,
|
|
4308
|
+
onInputChange: handleFilterSearchChange,
|
|
4309
|
+
onInputChangeImmediate: handleFilterSearchInputChange,
|
|
4105
4310
|
label: "Choose Values",
|
|
4106
|
-
placeholder: "
|
|
4311
|
+
placeholder: "Type to search...",
|
|
4107
4312
|
loading: loadingFilterValues,
|
|
4108
|
-
helperText: selectedFilterValues.length > 0 ? `${selectedFilterValues.length} value(s) selected` : 'Select at least one value'
|
|
4313
|
+
helperText: selectedFilterValues.length > 0 ? `${selectedFilterValues.length} value(s) selected` : 'Select at least one value',
|
|
4314
|
+
debounceMs: 1000
|
|
4109
4315
|
})));
|
|
4110
4316
|
})(), /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4111
4317
|
sx: {
|
|
@@ -4157,6 +4363,151 @@ const Filters = ({
|
|
|
4157
4363
|
boxShadow: "none"
|
|
4158
4364
|
}
|
|
4159
4365
|
}
|
|
4366
|
+
}, "Save Filter"))), isAddingFromDimension && /*#__PURE__*/React__default.createElement(Paper$1, {
|
|
4367
|
+
elevation: 0,
|
|
4368
|
+
sx: {
|
|
4369
|
+
p: 3,
|
|
4370
|
+
mb: 3,
|
|
4371
|
+
border: "1px solid #e0e0e0",
|
|
4372
|
+
borderRadius: "12px",
|
|
4373
|
+
backgroundColor: "white",
|
|
4374
|
+
boxShadow: "0px 2px 4px rgba(0,0,0,0.02)",
|
|
4375
|
+
fontFamily: "system-ui"
|
|
4376
|
+
}
|
|
4377
|
+
}, /*#__PURE__*/React__default.createElement(Typography$1, {
|
|
4378
|
+
sx: {
|
|
4379
|
+
fontSize: "14px",
|
|
4380
|
+
fontWeight: 600,
|
|
4381
|
+
mb: 1.5,
|
|
4382
|
+
color: "rgb(37, 37, 37)"
|
|
4383
|
+
}
|
|
4384
|
+
}, "Select Dimension from Report"), /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4385
|
+
sx: {
|
|
4386
|
+
mb: 3
|
|
4387
|
+
}
|
|
4388
|
+
}, /*#__PURE__*/React__default.createElement(SingleSelect, {
|
|
4389
|
+
items: existingDimensions.map(dim => ({
|
|
4390
|
+
key: dim.fullPath,
|
|
4391
|
+
value: dimensionTitleOverrides[dim.fullPath] || dim.dimensionTitle
|
|
4392
|
+
})),
|
|
4393
|
+
value: selectedExistingDimension,
|
|
4394
|
+
label: "Choose Dimension",
|
|
4395
|
+
onChange: handleExistingDimensionChange,
|
|
4396
|
+
sx: {
|
|
4397
|
+
width: '400px',
|
|
4398
|
+
fontFamily: "system-ui"
|
|
4399
|
+
}
|
|
4400
|
+
})), selectedExistingDimension && (() => {
|
|
4401
|
+
const dimensionData = existingDimensions.find(dim => dim.fullPath === selectedExistingDimension);
|
|
4402
|
+
const isDate = dimensionData && isDateDimension(dimensionData.dimension);
|
|
4403
|
+
return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Typography$1, {
|
|
4404
|
+
sx: {
|
|
4405
|
+
fontSize: "14px",
|
|
4406
|
+
fontWeight: 600,
|
|
4407
|
+
mb: 1.5,
|
|
4408
|
+
mt: 3,
|
|
4409
|
+
color: "rgb(37, 37, 37)"
|
|
4410
|
+
}
|
|
4411
|
+
}, isDate ? 'Select Date Range' : 'Select Filter Values'), isDate ? /*#__PURE__*/React__default.createElement(LocalizationProvider, {
|
|
4412
|
+
dateAdapter: AdapterDayjs
|
|
4413
|
+
}, /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4414
|
+
sx: {
|
|
4415
|
+
display: 'flex',
|
|
4416
|
+
gap: 2,
|
|
4417
|
+
width: '400px'
|
|
4418
|
+
}
|
|
4419
|
+
}, /*#__PURE__*/React__default.createElement(DatePicker, {
|
|
4420
|
+
label: "From Date",
|
|
4421
|
+
value: dateRangeFrom,
|
|
4422
|
+
onChange: newValue => setDateRangeFrom(newValue),
|
|
4423
|
+
slotProps: {
|
|
4424
|
+
textField: {
|
|
4425
|
+
size: 'small',
|
|
4426
|
+
fullWidth: true
|
|
4427
|
+
},
|
|
4428
|
+
field: {
|
|
4429
|
+
clearable: true
|
|
4430
|
+
}
|
|
4431
|
+
}
|
|
4432
|
+
}), /*#__PURE__*/React__default.createElement(DatePicker, {
|
|
4433
|
+
label: "To Date",
|
|
4434
|
+
value: dateRangeTo,
|
|
4435
|
+
onChange: newValue => setDateRangeTo(newValue),
|
|
4436
|
+
slotProps: {
|
|
4437
|
+
textField: {
|
|
4438
|
+
size: 'small',
|
|
4439
|
+
fullWidth: true
|
|
4440
|
+
},
|
|
4441
|
+
field: {
|
|
4442
|
+
clearable: true
|
|
4443
|
+
}
|
|
4444
|
+
}
|
|
4445
|
+
}))) : /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4446
|
+
sx: {
|
|
4447
|
+
width: '400px'
|
|
4448
|
+
}
|
|
4449
|
+
}, /*#__PURE__*/React__default.createElement(CheckboxMultiAutocomplete, {
|
|
4450
|
+
items: availableFilterValues,
|
|
4451
|
+
selectedKeys: selectedFilterValues,
|
|
4452
|
+
onChange: keys => setSelectedFilterValues(keys),
|
|
4453
|
+
inputValue: filterSearchText,
|
|
4454
|
+
onInputChange: handleFilterSearchChange,
|
|
4455
|
+
onInputChangeImmediate: handleFilterSearchInputChange,
|
|
4456
|
+
label: "Choose Values",
|
|
4457
|
+
placeholder: "Type to search...",
|
|
4458
|
+
loading: loadingFilterValues,
|
|
4459
|
+
helperText: selectedFilterValues.length > 0 ? `${selectedFilterValues.length} value(s) selected` : 'Select at least one value',
|
|
4460
|
+
debounceMs: 1000
|
|
4461
|
+
})));
|
|
4462
|
+
})(), /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4463
|
+
sx: {
|
|
4464
|
+
display: "flex",
|
|
4465
|
+
justifyContent: "flex-end",
|
|
4466
|
+
gap: 2,
|
|
4467
|
+
mt: 3
|
|
4468
|
+
}
|
|
4469
|
+
}, /*#__PURE__*/React__default.createElement(Button, {
|
|
4470
|
+
variant: "outlined",
|
|
4471
|
+
onClick: handleCancel,
|
|
4472
|
+
sx: {
|
|
4473
|
+
height: "40px",
|
|
4474
|
+
fontFamily: "system-ui",
|
|
4475
|
+
fontSize: "14px",
|
|
4476
|
+
fontWeight: 500,
|
|
4477
|
+
borderRadius: "8px",
|
|
4478
|
+
boxShadow: "none",
|
|
4479
|
+
borderColor: "#e0e0e0",
|
|
4480
|
+
color: "rgb(37, 37, 37)",
|
|
4481
|
+
textTransform: "none",
|
|
4482
|
+
"&:hover": {
|
|
4483
|
+
backgroundColor: "#f5f5f5",
|
|
4484
|
+
borderColor: "#d0d0d0"
|
|
4485
|
+
}
|
|
4486
|
+
}
|
|
4487
|
+
}, "Cancel"), /*#__PURE__*/React__default.createElement(Button, {
|
|
4488
|
+
variant: "contained",
|
|
4489
|
+
onClick: handleSaveFromDimension,
|
|
4490
|
+
disabled: (() => {
|
|
4491
|
+
if (!selectedExistingDimension) return true;
|
|
4492
|
+
const dimensionData = existingDimensions.find(dim => dim.fullPath === selectedExistingDimension);
|
|
4493
|
+
if (!dimensionData) return true;
|
|
4494
|
+
const isDate = isDateDimension(dimensionData.dimension);
|
|
4495
|
+
return isDate ? !dateRangeFrom && !dateRangeTo : selectedFilterValues.length === 0;
|
|
4496
|
+
})(),
|
|
4497
|
+
sx: {
|
|
4498
|
+
height: "40px",
|
|
4499
|
+
fontFamily: "system-ui",
|
|
4500
|
+
fontSize: "14px",
|
|
4501
|
+
fontWeight: 500,
|
|
4502
|
+
borderRadius: "8px",
|
|
4503
|
+
boxShadow: "none",
|
|
4504
|
+
textTransform: "none",
|
|
4505
|
+
backgroundColor: "rgb(70, 134, 128)",
|
|
4506
|
+
"&:hover": {
|
|
4507
|
+
backgroundColor: "rgb(50, 114, 108)",
|
|
4508
|
+
boxShadow: "none"
|
|
4509
|
+
}
|
|
4510
|
+
}
|
|
4160
4511
|
}, "Save Filter"))), filterEntries.length > 0 && /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4161
4512
|
sx: {
|
|
4162
4513
|
marginTop: 0
|
|
@@ -4198,7 +4549,9 @@ const Filters = ({
|
|
|
4198
4549
|
valueCount = filter.values?.length || 0;
|
|
4199
4550
|
valuesList = filter.values?.join(', ') || 'No values';
|
|
4200
4551
|
}
|
|
4201
|
-
|
|
4552
|
+
|
|
4553
|
+
// Use filter title override if exists, otherwise use dimension title override, otherwise use default dimension title
|
|
4554
|
+
const displayLabel = titleOverrides[fullPath] || dimensionTitleOverrides[fullPath] || filter.dimensionTitle;
|
|
4202
4555
|
const hasCustomTitle = !!titleOverrides[fullPath];
|
|
4203
4556
|
return /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4204
4557
|
key: fullPath
|
|
@@ -4212,21 +4565,19 @@ const Filters = ({
|
|
|
4212
4565
|
border: "1px solid #e0e0e0",
|
|
4213
4566
|
borderRadius: 2,
|
|
4214
4567
|
padding: 2,
|
|
4568
|
+
boxSizing: "border-box",
|
|
4215
4569
|
transition: "box-shadow 0.2s ease",
|
|
4216
4570
|
"&:hover .hover-icons": {
|
|
4217
4571
|
opacity: 1
|
|
4218
4572
|
}
|
|
4219
4573
|
}
|
|
4220
4574
|
}, !isEditingTitle ? /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4221
|
-
sx: {
|
|
4222
|
-
flex: 1,
|
|
4223
|
-
minWidth: 0
|
|
4224
|
-
}
|
|
4225
|
-
}, /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4226
4575
|
sx: {
|
|
4227
4576
|
display: 'flex',
|
|
4228
4577
|
alignItems: 'center',
|
|
4229
|
-
gap: 1
|
|
4578
|
+
gap: 1,
|
|
4579
|
+
flex: 1,
|
|
4580
|
+
minWidth: 0
|
|
4230
4581
|
}
|
|
4231
4582
|
}, /*#__PURE__*/React__default.createElement(Typography$1, {
|
|
4232
4583
|
variant: "h6",
|
|
@@ -4236,21 +4587,7 @@ const Filters = ({
|
|
|
4236
4587
|
color: "#1a1a1a",
|
|
4237
4588
|
fontSize: "14px"
|
|
4238
4589
|
}
|
|
4239
|
-
}, displayLabel), /*#__PURE__*/React__default.createElement(
|
|
4240
|
-
title: /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("strong", null, "Path:"), " ", formatProviderPath(filter), " \u2192 ", filter.dimensionTitle), /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("strong", null, "Full Path:"), " ", fullPath), /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("strong", null, isDate ? 'Date Range' : `Values (${valueCount})`, ":"), " ", valuesList)),
|
|
4241
|
-
arrow: true,
|
|
4242
|
-
placement: "top"
|
|
4243
|
-
}, /*#__PURE__*/React__default.createElement(Chip, {
|
|
4244
|
-
size: "small",
|
|
4245
|
-
label: isDate ? valuesList : `${valueCount} values`,
|
|
4246
|
-
color: "default",
|
|
4247
|
-
variant: "outlined",
|
|
4248
|
-
sx: {
|
|
4249
|
-
marginLeft: 1,
|
|
4250
|
-
height: '20px',
|
|
4251
|
-
fontSize: '14px'
|
|
4252
|
-
}
|
|
4253
|
-
})))), /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4590
|
+
}, displayLabel), /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4254
4591
|
className: "hover-icons",
|
|
4255
4592
|
sx: {
|
|
4256
4593
|
display: "flex",
|
|
@@ -4263,7 +4600,7 @@ const Filters = ({
|
|
|
4263
4600
|
arrow: true
|
|
4264
4601
|
}, /*#__PURE__*/React__default.createElement(IconButton, {
|
|
4265
4602
|
size: "small",
|
|
4266
|
-
onClick: () => handleStartEditTitle(fullPath, filter.dimensionTitle),
|
|
4603
|
+
onClick: () => handleStartEditTitle(fullPath, dimensionTitleOverrides[fullPath] || filter.dimensionTitle),
|
|
4267
4604
|
disabled: isEditing
|
|
4268
4605
|
}, /*#__PURE__*/React__default.createElement(EditIcon, {
|
|
4269
4606
|
fontSize: "small"
|
|
@@ -4287,7 +4624,19 @@ const Filters = ({
|
|
|
4287
4624
|
}
|
|
4288
4625
|
}, /*#__PURE__*/React__default.createElement(GridDeleteIcon, {
|
|
4289
4626
|
fontSize: "small"
|
|
4290
|
-
})))
|
|
4627
|
+
}))), /*#__PURE__*/React__default.createElement(Tooltip, {
|
|
4628
|
+
title: /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("strong", null, "Path:"), " ", formatProviderPath(filter), " \u2192 ", dimensionTitleOverrides[fullPath] || filter.dimensionTitle), /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("strong", null, "Full Path:"), " ", fullPath), /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("strong", null, isDate ? 'Date Range' : `Values (${valueCount})`, ":"), " ", valuesList)),
|
|
4629
|
+
arrow: true,
|
|
4630
|
+
placement: "right"
|
|
4631
|
+
}, /*#__PURE__*/React__default.createElement(IconButton, {
|
|
4632
|
+
size: "small",
|
|
4633
|
+
disabled: isEditing
|
|
4634
|
+
}, /*#__PURE__*/React__default.createElement(InfoOutlinedIcon, {
|
|
4635
|
+
fontSize: "small",
|
|
4636
|
+
sx: {
|
|
4637
|
+
color: "#757575"
|
|
4638
|
+
}
|
|
4639
|
+
})))))) : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(TextField, {
|
|
4291
4640
|
value: editTitleValue,
|
|
4292
4641
|
onChange: e => setEditTitleValue(e.target.value),
|
|
4293
4642
|
onKeyDown: e => handleKeyDown(e, fullPath),
|
|
@@ -4344,7 +4693,7 @@ const Filters = ({
|
|
|
4344
4693
|
marginBottom: 1.5,
|
|
4345
4694
|
fontWeight: 600
|
|
4346
4695
|
}
|
|
4347
|
-
}, "Edit ", isDate ? 'Date Range' : 'Values', " for: ", filter.dimensionTitle), isDate ? /*#__PURE__*/React__default.createElement(LocalizationProvider, {
|
|
4696
|
+
}, "Edit ", isDate ? 'Date Range' : 'Values', " for: ", dimensionTitleOverrides[fullPath] || filter.dimensionTitle), isDate ? /*#__PURE__*/React__default.createElement(LocalizationProvider, {
|
|
4348
4697
|
dateAdapter: AdapterDayjs
|
|
4349
4698
|
}, /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4350
4699
|
sx: {
|
|
@@ -4388,10 +4737,14 @@ const Filters = ({
|
|
|
4388
4737
|
items: availableFilterValues,
|
|
4389
4738
|
selectedKeys: selectedFilterValues,
|
|
4390
4739
|
onChange: keys => setSelectedFilterValues(keys),
|
|
4740
|
+
inputValue: filterSearchText,
|
|
4741
|
+
onInputChange: handleFilterSearchChange,
|
|
4742
|
+
onInputChangeImmediate: handleFilterSearchInputChange,
|
|
4391
4743
|
label: "Choose Values",
|
|
4392
|
-
placeholder: "
|
|
4744
|
+
placeholder: "Type to search...",
|
|
4393
4745
|
loading: loadingFilterValues,
|
|
4394
|
-
helperText: selectedFilterValues.length > 0 ? `${selectedFilterValues.length} value(s) selected` : 'Select at least one value'
|
|
4746
|
+
helperText: selectedFilterValues.length > 0 ? `${selectedFilterValues.length} value(s) selected` : 'Select at least one value',
|
|
4747
|
+
debounceMs: 1000
|
|
4395
4748
|
})), /*#__PURE__*/React__default.createElement(Box$1, {
|
|
4396
4749
|
sx: {
|
|
4397
4750
|
display: 'flex',
|
|
@@ -5780,6 +6133,7 @@ const ReportBuilder = ({
|
|
|
5780
6133
|
onSaveFilter: handleSaveFilter,
|
|
5781
6134
|
onRemoveFilter: handleRemoveFilter,
|
|
5782
6135
|
titleOverrides: titleOverrides.filters,
|
|
6136
|
+
dimensionTitleOverrides: titleOverrides.dimensions,
|
|
5783
6137
|
onUpdateTitle: handleUpdateFilterTitle,
|
|
5784
6138
|
onResetTitle: handleResetFilterTitle
|
|
5785
6139
|
})), /*#__PURE__*/React__default.createElement(TabPanel, {
|