1import{q as L,r as b,b as k,w as H,b5 as f,b6 as o,b7 as n,b9 as t,b8 as u,bb as p,ac as F,bx as h,bw as _,a6 as M,ba as v,bd as x,bc as s,bA as Q,bB as C,c6 as Z,bC as K,B as W,G as X,f as R,e as Y,g as ee,aN as A}from"./index-CqTW0gwL.js";import{Q as te}from"./QFile-CVVMBD0S.js";import{Q as J}from"./QChip-Bt5HE8Pr.js";import{Q as ae}from"./QMarkupTable-DUBLwfXu.js";import{Q as le}from"./QLinearProgress-BZebGzyV.js";import{Q as se}from"./QBanner-DaqGlO9v.js";import{Q as re}from"./QPage-D-M_E9XA.js";import{_ as oe}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./format-DyQxkAtJ.js";const ne={class:"q-mb-lg"},ie={class:"text-body2 q-mb-md"},ue={key:0},de={class:"q-mb-md"},me={class:"row q-gutter-sm"},ce={key:0,class:"q-mb-md"},pe={class:"row q-gutter-sm"},ve={key:1,class:"text-body2 q-mb-md"},be={key:2,class:"q-mb-md"},fe=L({__name:"ImportMarketDaysPage",setup(ye){const w=b(null),r=b([]),m=b(!1),q=b(0),S=b(""),D=b("skip"),d=b(null),I=k(()=>r.value.length),T=k(()=>{if(r.value.length===0)return null;const a=r.value.map(e=>e.date).sort();return{start:a[0],end:a[a.length-1]}}),j=k(()=>{const a={};return r.value.forEach(e=>{a[e.dayType]=(a[e.dayType]??0)+1}),a});function N(a){return{normal:"Normal",normal_variation:"Normal Var",trend:"Trend",non_trend:"Non-Trend",neutral:"Neutral",double_distribution:"Double Dist"}[a]??a}function z(a){return{normal:"blue",normal_variation:"cyan",trend:"green",non_trend:"purple",neutral:"grey",double_distribution:"orange"}[a]??"grey"}function B(a){return a?{p_shape:"P-Shape",b_shape:"b-Shape"}[a]??a:"-"}const O=k(()=>{const a={};return r.value.forEach(e=>{e.profilePattern&&(a[e.profilePattern]=(a[e.profilePattern]??0)+1)}),a});H(w,async a=>{if(!a){r.value=[],d.value=null;return}try{const e=await a.text(),l=JSON.parse(e);if(!Array.isArray(l))throw new Error("JSON must be an array of market day objects");if(l.length>0){const i=l[0];if(!i.id||!i.date||!i.dayType)throw new Error("Invalid market day format. Expected id, date, dayType fields.")}r.value=l,d.value=null}catch(e){console.error("Error parsing JSON:",e),r.value=[],alert(`Error parsing JSON file: ${e instanceof Error?e.message:"Unknown error"}`)}});async function U(){if(r.value.length===0)return;m.value=!0,q.value=0,d.value=null;const a=400,e=r.value.length;let l=0,i=0,P=0;const $=W(R,"marketDays");try{for(let c=0;c<e;c+=a){const y=r.value.slice(c,c+a),V=X(R);for(const g of y){const E=Y($,g.id);if(D.value==="skip")try{if((await ee(E)).exists()){i++;continue}}catch{}const G={...g,createdAt:A.now(),updatedAt:A.now()};V.set(E,G),l++}try{await V.commit()}catch(g){console.error("Batch commit error:",g),P+=y.length,l-=y.length}q.value=Math.min(1,(c+y.length)/e),S.value=`Processing ${Math.min(c+a,e)} of ${e}...`}}catch(c){console.error("Import error:",c),P++}m.value=!1,d.value={imported:l,skipped:i,errors:P},S.value="Import complete!"}return(a,e)=>(o(),f(re,{class:"import-page q-pa-md"},{default:n(()=>[t("div",ne,[u(F,{flat:"",dense:"",icon:"arrow_back",label:"Back to Admin",to:{name:"admin"},class:"q-mb-sm"}),e[2]||(e[2]=t("h4",{class:"text-h4 q-mt-none q-mb-sm"},"Import Market Days",-1)),e[3]||(e[3]=t("p",{class:"text-body2 te-text-secondary"}," Import historical market day data from processed JSON files. ",-1))]),u(h,{class:"te-card q-mb-md"},{default:n(()=>[u(_,null,{default:n(()=>[e[4]||(e[4]=t("div",{class:"text-h6 q-mb-md"},"Step 1: Select JSON File",-1)),u(te,{modelValue:w.value,"onUpdate:modelValue":e[0]||(e[0]=l=>w.value=l),label:"Select market_days_nq.json",accept:".json",outlined:"",disable:m.value},{prepend:n(()=>[u(M,{name:"attach_file"})]),_:1},8,["modelValue","disable"])]),_:1})]),_:1}),r.value.length>0?(o(),f(h,{key:0,class:"te-card q-mb-md"},{default:n(()=>[u(_,null,{default:n(()=>[e[9]||(e[9]=t("div",{class:"text-h6 q-mb-md"},"Step 2: Preview Data",-1)),t("div",ie,[t("strong",null,s(I.value),1),e[5]||(e[5]=x(" market days loaded ",-1)),T.value?(o(),v("span",ue," ("+s(T.value.start)+" to "+s(T.value.end)+")",1)):p("",!0)]),t("div",de,[e[6]||(e[6]=t("div",{class:"text-subtitle2 q-mb-sm"},"Day Type Distribution (6 Official Types):",-1)),t("div",me,[(o(!0),v(Q,null,C(j.value,(l,i
1)=>(o(),f(J,{key:i,color:z(i),"text-color":"white",size:"sm"},{default:n(()=>[x(s(N(i))+": "+s(l)+" ("+s((l/I.value*100).toFixed(1))+"%) ",1)]),_:2},1032,["color"]))),128))])]),Object.keys(O.value).length>0?(o(),v("div",ce,[e[7]||(e[7]=t("div",{class:"text-subtitle2 q-mb-sm"},"Profile Patterns (Secondary Indicators):",-1)),t("div",pe,[(o(!0),v(Q,null,C(O.value,(l,i)=>(o(),f(J,{key:i,color:i==="p_shape"?"red":"teal","text-color":"white",size:"sm"},{default:n(()=>[x(s(B(i))+": "+s(l)+" ("+s((l/I.value*100).toFixed(1))+"%) ",1)]),_:2},1032,["color"]))),128))])])):p("",!0),e[10]||(e[10]=t("div",{class:"text-subtitle2 q-mb-sm"},"Sample Records:",-1)),u(ae,{dense:"",flat:"",bordered:"",class:"bg-dark"},{default:n(()=>[e[8]||(e[8]=t("thead",null,[t("tr",null,[t("th",null,"Date"),t("th",null,"Symbol"),t("th",null,"IB Range"),t("th",null,"Day Type"),t("th",null,"Pattern"),t("th",null,"Confidence")])],-1)),t("tbody",null,[(o(!0),v(Q,null,C(r.value.slice(0,10),l=>(o(),v("tr",{key:l.id},[t("td",null,s(l.date),1),t("td",null,s(l.symbol),1),t("td",null,s(l.ibRange?.toFixed(2))+" pts",1),t("td",null,s(N(l.dayType)),1),t("td",null,s(B(l.profilePattern)),1),t("td",null,s(l.dayTypeConfidence)+"%",1)]))),128))])]),_:1})]),_:1})]),_:1})):p("",!0),r.value.length>0?(o(),f(h,{key:1,class:"te-card q-mb-md"},{default:n(()=>[u(_,null,{default:n(()=>[e[11]||(e[11]=t("div",{class:"text-h6 q-mb-md"},"Step 3: Import Options",-1)),u(Z,{modelValue:D.value,"onUpdate:modelValue":e[1]||(e[1]=l=>D.value=l),options:[{label:"Skip existing documents (recommended)",value:"skip"},{label:"Overwrite existing documents",value:"overwrite"}],disable:m.value},null,8,["modelValue","disable"])]),_:1})]),_:1})):p("",!0),r.value.length>0?(o(),f(h,{key:2,class:"te-card"},{default:n(()=>[u(_,null,{default:n(()=>[e[12]||(e[12]=t("div",{class:"text-h6 q-mb-md"},"Step 4: Import to Firestore",-1)),m.value?(o(),f(le,{key:0,value:q.value,color:"primary",class:"q-mb-md"},null,8,["value"])):p("",!0),m.value?(o(),v("div",ve,s(S.value),1)):p("",!0),d.value?(o(),v("div",be,[u(se,{class:K(d.value.errors>0?"bg-warning":"bg-positive"),rounded:""},{avatar:n(()=>[u(M,{name:d.value.errors>0?"warning":"check_circle"},null,8,["name"])]),default:n(()=>[x(" Import complete: "+s(d.value.imported)+" imported, "+s(d.value.skipped)+" skipped, "+s(d.value.errors)+" errors ",1)]),_:1},8,["class"])])):p("",!0),u(F,{color:"primary",icon:"cloud_upload",label:"Import to Firestore",loading:m.value,disable:m.value||r.value.length===0,onClick:U},null,8,["loading","disable"])]),_:1})]),_:1})):p("",!0)]),_:1}))}}),Te=oe(fe,[["__scopeId","data-v-abe604d8"]]);export{Te as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.