openalgo-charts
Version:
From-scratch, dependency-free canvas charting engine for OpenAlgo: professional-grade interactive rendering, advanced on-chart trading, and a one-call widget tier that adds the toolbar, drawing rail, dialogs and shortcuts.
3 lines (2 loc) • 3.42 kB
JavaScript
import{t as e,m as t,widgetText as o,n,renderForm as a,o as r,u as l,e as s,p as i,v as c}from"./openalgo-charts.widget.mjs";import"./openalgo-charts.mjs";import"./openalgo-charts.draw.mjs";let d=0;function m(m,u,p){const f=m.chart,y=e(f),b=f.indicators().map(e=>({id:e.id,name:y.get(e.id),hidden:!e.visible()})),v=f.getVisibleLogicalRange(),h=f.primaryBars().filter(e=>{const t=f.dataLayer.timeToIndex(e.time);return Number.isFinite(e.time)&&void 0!==t&&t>=v.from&&t<=v.to}),g=h.length?{from:h[0].time,to:h[h.length-1].time}:null,k=f.timezone(),w=e=>{const t=c(e,k,!0);return`${t.date}T${t.time}`};let C=!1,x=null,E=()=>{};const _=t(m.document,{translate:m.translate,title:o(m,"Download chart data (CSV)"),className:"oac-csv",onClose:L}),S=n(m.document,"p","oac-csv__hint",o(m,"Only loaded rows are exported. Blank bounds include all loaded times.")),T=n(m.document,"div","oac-csv__ranges"),O=n(m.document,"div"),$=n(m.document,"p","oac-csv__error");$.setAttribute("role","alert");const j=n(m.document,"p","oac-csv__hint",o(m,"Times are on the chart clock, {zone}.",{zone:k}));_.body.append(S,j,T,O,$);const D=[{key:"from",kind:"text",label:o(m,"From")},{key:"to",kind:"text",label:o(m,"To")},{key:"alignment",kind:"select",label:o(m,"Study alignment"),options:[{value:"source",label:o(m,"Source rows")},{value:"display",label:o(m,"Displayed rows")}]},...b.map((e,t)=>({key:`study-${t}`,kind:"boolean",group:o(m,"Studies"),label:e.hidden?o(m,"{name}, hidden",{name:e.name}):e.name}))],z=a(O,D,{idPrefix:"oac-csv-"+ ++d,translate:m.translate,openOverlay:m.openOverlay,values:{from:"",to:"",alignment:"source",...Object.fromEntries(b.map((e,t)=>[`study-${t}`,!0]))},onChange:e=>{z.setError(e,null),$.textContent=""}});for(const e of["from","to"]){const t=O.querySelector(`[data-key="${e}"] input`);null!==t&&(t.type="datetime-local",t.step="1")}const F=(e,t)=>{z.setError("from",null),z.setError("to",null),$.textContent="",z.sync({from:e,to:t})},V=r(m.document,{label:o(m,"Use captured visible range"),onClick:()=>{g&&F(w(g.from),w(g.to))}});V.dataset.action="csv-visible",V.disabled=null===g;const q=r(m.document,{label:o(m,"All loaded rows"),onClick:()=>F("","")});q.dataset.action="csv-all",T.append(V,q);const A=r(m.document,{label:o(m,"Cancel"),onClick:L}),B=r(m.document,{label:o(m,"Download CSV"),variant:"primary",onClick:function(){if(C)return;const e=z.values(),t={};try{for(const n of["from","to"]){z.setError(n,null);const a=String(e[n]??"").trim();if(""===a)continue;const[r="",s=""]=a.split("T"),i=l(r,s,k,"to"===n?{end:!0}:{});if(null===i){const e=o(m,"Enter a date and a time on the chart clock");throw z.setError(n,e),new Error(e)}t[n]=i}if(void 0!==t.from&&void 0!==t.to&&t.from>t.to){const e=o(m,"The From bound must be before or equal to the To bound");throw z.setError("to",e),new Error(e)}p({indicators:b.filter((t,o)=>!0===e[`study-${o}`]).map(e=>e.id),range:t,alignment:"display"===e.alignment?"display":"source"}),L()}catch(e){const t=s(m,e);$.textContent=t,m.status(o(m,"Data export failed: {error}",{error:t}),"error")}}});function L(){C||(C=!0,E(),z.destroy(),x?.close())}return B.dataset.action="download-csv",_.actions.append(A,B),E=f.on("destroy",L),x=i(m,_.el,{anchor:u,modal:!0,placement:"center"},L),C&&x.close(),{el:_.el,close:L,isOpen:()=>!C&&x.isOpen()}}export{m as openChartDataExportDialog};
//# sourceMappingURL=openalgo-charts.widget.chart-data-export-dialog-CX6h5-cp.mjs.map