SCGR's picture
debug
52c6e82
raw
history blame
16.8 kB
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/jszip.min-DHOAM-1s.js","assets/index-oPRJTRcN.js","assets/index-DkIjYZRi.css"])))=>i.map(i=>d[i]);
import{v as Se,w as Te,r as m,x as Ie,j as t,N as Ee,_ as ie,L as be,z as Z,n as D,D as Ce,B as $e}from"./index-oPRJTRcN.js";import{u as Pe}from"./useAdmin-DytkUHQc.js";import{F as Fe,E as De}from"./ExportModal-CrJtybXx.js";const ke="_tabSelector_o9y1f_1",Le="_metadataTags_o9y1f_8",Oe="_metadataTag_o9y1f_8",Me="_metadataTagSource_o9y1f_32",Re="_metadataTagType_o9y1f_43",Je="_mapItem_o9y1f_54",We="_mapItemImage_o9y1f_72",ze="_mapItemContent_o9y1f_92",Ue="_mapItemTitle_o9y1f_97",Ae="_mapItemMetadata_o9y1f_105",Be="_fullSizeModalOverlay_o9y1f_134",He="_fullSizeModalContent_o9y1f_148",Ve="_ratingWarningContent_o9y1f_159",Ge="_ratingWarningTitle_o9y1f_165",Ze="_ratingWarningText_o9y1f_172",qe="_ratingWarningButtons_o9y1f_179",g={tabSelector:ke,metadataTags:Le,metadataTag:Oe,metadataTagSource:Me,metadataTagType:Re,mapItem:Je,mapItemImage:We,mapItemContent:ze,mapItemTitle:Ue,mapItemMetadata:Ae,fullSizeModalOverlay:Be,fullSizeModalContent:He,ratingWarningContent:Ve,ratingWarningTitle:Ge,ratingWarningText:Ze,ratingWarningButtons:qe};function Ye(){const k=Se(),q=Te(),{isAuthenticated:ne}=Pe(),[K,oe]=m.useState("explore"),[_,L]=m.useState([]),{search:y,srcFilter:E,catFilter:b,regionFilter:C,countryFilter:$,imageTypeFilter:P,uploadTypeFilter:F,showReferenceExamples:j,setShowReferenceExamples:le}=Ie(),[J,re]=m.useState([]),[W,ce]=m.useState([]),[Q,me]=m.useState([]),[ge,de]=m.useState([]),[X,pe]=m.useState([]),[ue,Y]=m.useState(!0),[z,ee]=m.useState(!0),[fe,U]=m.useState(!1),[he,A]=m.useState(!1),[_e,B]=m.useState(!1),[xe,O]=m.useState(!1),[M,te]=m.useState(""),[H,ae]=m.useState(!1),ye=[{key:"explore",label:"List"},{key:"mapDetails",label:"Carousel"}],se=()=>{ee(!0),fetch("/api/images/grouped").then(e=>e.ok?e.json():(console.error("ExplorePage: Grouped endpoint failed, trying legacy endpoint"),fetch("/api/captions/legacy").then(s=>s.ok?s.json():(console.error("ExplorePage: Legacy endpoint failed, trying regular images endpoint"),fetch("/api/images").then(o=>{if(!o.ok)throw new Error(`HTTP ${o.status}: ${o.statusText}`);return o.json()}))))).then(e=>{if(console.log("ExplorePage: API response data:",e),Array.isArray(e)){const s=e.filter(o=>{const f=o.generated&&o.model,u=o.image_id&&o.image_id!=="undefined"&&o.image_id!=="null";return u||console.error("ExplorePage: Item missing valid image_id:",o),f&&u});console.log("ExplorePage: Filtered images with captions:",s.length),L(s)}else console.error("ExplorePage: API response is not an array:",e),L([])}).catch(()=>{L([])}).finally(()=>{ee(!1)})};m.useEffect(()=>{se()},[]),m.useEffect(()=>{const e=()=>{document.hidden||se()};return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)}},[]),m.useEffect(()=>{new URLSearchParams(q.search).get("export")==="true"&&(U(!0),k("/explore",{replace:!0}))},[q.search,k,y,E,b,C,$,P,j]),m.useEffect(()=>{Y(!0),Promise.all([fetch("/api/sources").then(e=>{if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);return e.json()}),fetch("/api/types").then(e=>{if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);return e.json()}),fetch("/api/regions").then(e=>{if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);return e.json()}),fetch("/api/countries").then(e=>{if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);return e.json()}),fetch("/api/image-types").then(e=>{if(!e.ok)throw new Error(`HTTP ${e.status}: ${e.statusText}`);return e.json()})]).then(([e,s,o,f,u])=>{re(e),ce(s),me(o),de(f),pe(u)}).catch(()=>{}).finally(()=>{Y(!1)})},[]);const v=m.useMemo(()=>_.filter(e=>{const s=!y||e.title?.toLowerCase().includes(y.toLowerCase())||e.generated?.toLowerCase().includes(y.toLowerCase())||e.source?.toLowerCase().includes(y.toLowerCase())||e.event_type?.toLowerCase().includes(y.toLowerCase()),o=!E||e.source&&e.source.split(", ").some(x=>x.trim()===E),f=!b||e.event_type&&e.event_type.split(", ").some(x=>x.trim()===b),u=!C||e.countries.some(x=>x.r_code===C),N=!$||e.countries.some(x=>x.c_code===$),V=!P||e.image_type===P,R=!F||F==="single"&&(!e.image_count||e.image_count<=1)||F==="multiple"&&e.image_count&&e.image_count>1,w=!j||e.starred===!0;return s&&o&&f&&u&&N&&V&&R&&w}),[_,y,E,b,C,$,P,F,j]),je=async(e,s="fine-tuning")=>{if(e.length===0){alert("No images to export");return}A(!0),B(!1);try{const o=(await $e(async()=>{const{default:i}=await import("./jszip.min-DHOAM-1s.js").then(S=>S.j);return{default:i}},__vite__mapDeps([0,1,2]))).default,f=new o,u=e.filter(i=>i.image_type==="crisis_map"),N=e.filter(i=>i.image_type==="drone_image");if(u.length>0){const i=f.folder("crisis_maps_dataset"),S=i?.folder("images");if(S){let T=1;for(const a of u)try{const h=a.image_count&&a.image_count>1?a.all_image_ids||[a.image_id]:[a.image_id],G=h.map(async(n,p)=>{try{const l=await fetch(`/api/images/${n}/file`);if(!l.ok)throw new Error(`Failed to fetch image ${n}`);const r=await l.blob(),c=a.file_key.split(".").pop()||"jpg",d=`${String(T).padStart(4,"0")}_${String(p+1).padStart(2,"0")}.${c}`;return S.file(d,r),{success:!0,fileName:d,imageId:n}}catch(l){return console.error(`Failed to process image ${n}:`,l),{success:!1,fileName:"",imageId:n}}}),I=(await Promise.all(G)).filter(n=>n.success);if(I.length>0){if(s==="fine-tuning"){const n=I.map(r=>`images/${r.fileName}`),p=Math.random(),l={image:n.length===1?n[0]:n,caption:a.edited||a.generated||"",metadata:{image_id:h,title:a.title,source:a.source,event_type:a.event_type,image_type:a.image_type,countries:a.countries,starred:a.starred,image_count:a.image_count||1}};if(!i)continue;if(p<.8){const r=i.file("train.jsonl");if(r){const c=await r.async("string").then(d=>JSON.parse(d||"[]")).catch(()=>[]);c.push(l),i.file("train.jsonl",JSON.stringify(c,null,2))}else i.file("train.jsonl",JSON.stringify([l],null,2))}else if(p<.9){const r=i.file("test.jsonl");if(r){const c=await r.async("string").then(d=>JSON.parse(d||"[]")).catch(()=>[]);c.push(l),i.file("test.jsonl",JSON.stringify(c,null,2))}else i.file("test.jsonl",JSON.stringify([l],null,2))}else{const r=i.file("val.jsonl");if(r){const c=await r.async("string").then(d=>JSON.parse(d||"[]")).catch(()=>[]);c.push(l),i.file("val.jsonl",JSON.stringify(c,null,2))}else i.file("val.jsonl",JSON.stringify([l],null,2))}}else{const n=I.map(l=>`images/${l.fileName}`),p={image:n.length===1?n[0]:n,caption:a.edited||a.generated||"",metadata:{image_id:h,title:a.title,source:a.source,event_type:a.event_type,image_type:a.image_type,countries:a.countries,starred:a.starred,image_count:a.image_count||1}};i&&i.file(`${String(T).padStart(4,"0")}.json`,JSON.stringify(p,null,2))}T++}}catch(h){console.error(`Failed to process caption ${a.image_id}:`,h)}}}if(N.length>0){const i=f.folder("drone_images_dataset"),S=i?.folder("images");if(S){let T=1;for(const a of N)try{const h=a.image_count&&a.image_count>1?a.all_image_ids||[a.image_id]:[a.image_id],G=h.map(async(n,p)=>{try{const l=await fetch(`/api/images/${n}/file`);if(!l.ok)throw new Error(`Failed to fetch image ${n}`);const r=await l.blob(),c=a.file_key.split(".").pop()||"jpg",d=`${String(T).padStart(4,"0")}_${String(p+1).padStart(2,"0")}.${c}`;return S.file(d,r),{success:!0,fileName:d,imageId:n}}catch(l){return console.error(`Failed to process image ${n}:`,l),{success:!1,fileName:"",imageId:n}}}),I=(await Promise.all(G)).filter(n=>n.success);if(I.length>0){if(s==="fine-tuning"){const n=I.map(r=>`images/${r.fileName}`),p=Math.random(),l={image:n.length===1?n[0]:n,caption:a.edited||a.generated||"",metadata:{image_id:h,title:a.title,source:a.source,event_type:a.event_type,image_type:a.image_type,countries:a.countries,starred:a.starred,image_count:a.image_count||1}};if(!i)continue;if(p<.8){const r=i.file("train.jsonl");if(r){const c=await r.async("string").then(d=>JSON.parse(d||"[]")).catch(()=>[]);c.push(l),i.file("train.jsonl",JSON.stringify(c,null,2))}else i.file("train.jsonl",JSON.stringify([l],null,2))}else if(p<.9){const r=i.file("test.jsonl");if(r){const c=await r.async("string").then(d=>JSON.parse(d||"[]")).catch(()=>[]);c.push(l),i.file("test.jsonl",JSON.stringify(c,null,2))}else i.file("test.jsonl",JSON.stringify([l],null,2))}else{const r=i.file("val.jsonl");if(r){const c=await r.async("string").then(d=>JSON.parse(d||"[]")).catch(()=>[]);c.push(l),i.file("val.jsonl",JSON.stringify(c,null,2))}else i.file("val.jsonl",JSON.stringify([l],null,2))}}else{const n=I.map(l=>`images/${l.fileName}`),p={image:n.length===1?n[0]:n,caption:a.edited||a.generated||"",metadata:{image_id:h,title:a.title,source:a.source,event_type:a.event_type,image_type:a.image_type,countries:a.countries,starred:a.starred,image_count:a.image_count||1}};i&&i.file(`${String(T).padStart(4,"0")}.json`,JSON.stringify(p,null,2))}T++}}catch(h){console.error(`Failed to process caption ${a.image_id}:`,h)}}}const V=await f.generateAsync({type:"blob"}),R=URL.createObjectURL(V),w=document.createElement("a");w.href=R,w.download=`datasets_${s}_${new Date().toISOString().split("T")[0]}.zip`,document.body.appendChild(w),w.click(),document.body.removeChild(w),URL.revokeObjectURL(R);const x=(u.length||0)+(N.length||0);console.log(`Exported ${s} datasets with ${x} total images:`),u.length>0&&console.log(`- Crisis maps: ${u.length} images`),N.length>0&&console.log(`- Drone images: ${N.length} images`),B(!0)}catch(o){console.error("Export failed:",o),alert("Failed to export dataset. Please try again.")}finally{A(!1)}},ve=e=>{te(e),O(!0)},Ne=async()=>{if(M){ae(!0);try{console.log("Deleting image with ID:",M),(await fetch(`/api/images/${M}`,{method:"DELETE"})).ok?(L(s=>s.filter(o=>o.image_id!==M)),O(!1),te("")):(console.error("Delete failed"),alert("Failed to delete image. Please try again."))}catch(e){console.error("Delete failed:",e),alert("Failed to delete image. Please try again.")}finally{ae(!1)}}};return t.jsxs(Ee,{children:[z?t.jsx("div",{className:"flex flex-col items-center justify-center min-h-[60vh]",children:t.jsxs("div",{className:"flex flex-col items-center gap-4",children:[t.jsx(ie,{className:"text-ifrcRed"}),t.jsx("div",{children:"Loading examples..."})]})}):t.jsxs("div",{className:"max-w-7xl mx-auto",children:[t.jsxs("div",{className:g.tabSelector,children:[t.jsx(be,{name:"explore-view",value:K,onChange:e=>{(e==="explore"||e==="mapDetails")&&(oe(e),e==="mapDetails"&&_.length>0&&(_[0]?.image_id&&_[0].image_id!=="undefined"&&_[0].image_id!=="null"?k(`/map/${_[0].image_id}`):console.error("Invalid image_id for navigation:",_[0]?.image_id)))},options:ye,keySelector:e=>e.key,labelSelector:e=>e.label}),t.jsxs("div",{className:"flex items-center gap-2 ml-auto",children:[t.jsx(Z,{withInternalPadding:!0,className:"bg-white/20 backdrop-blur-sm rounded-md p-2",children:t.jsxs(D,{name:"reference-examples",variant:j?"primary":"secondary",onClick:()=>le(!j),className:"whitespace-nowrap",children:[t.jsx("span",{className:"mr-2",children:j?t.jsx("span",{className:"text-yellow-400",children:"★"}):t.jsx("span",{className:"text-yellow-400",children:"☆"})}),"Reference Examples"]})}),t.jsx(D,{name:"export-dataset",variant:"secondary",onClick:()=>U(!0),children:"Export"})]})]}),K==="explore"?t.jsxs("div",{className:"space-y-6",children:[t.jsx("div",{className:"mb-6 space-y-4",children:t.jsx("div",{className:"flex flex-wrap items-center gap-4",children:t.jsx(Z,{withInternalPadding:!0,className:"bg-white/20 backdrop-blur-sm rounded-md p-2 flex-1 min-w-[300px]",children:t.jsx(Fe,{sources:J,types:W,regions:Q,countries:ge,imageTypes:X,isLoadingFilters:ue})})})}),t.jsxs("div",{className:"space-y-4",children:[t.jsx("div",{className:"flex justify-between items-center",children:t.jsxs("p",{className:"text-sm text-gray-600",children:[v.length," of ",_.length," examples"]})}),z&&t.jsx("div",{className:"text-center py-12",children:t.jsxs("div",{className:"flex flex-col items-center gap-4",children:[t.jsx(ie,{className:"text-ifrcRed"}),t.jsx("div",{children:"Loading examples..."})]})}),!z&&t.jsxs("div",{className:"space-y-4",children:[v.map(e=>t.jsxs("div",{className:"flex items-center gap-4",children:[t.jsxs("div",{className:`${g.mapItem} flex-1`,onClick:()=>{console.log("ExplorePage: Clicking on image with ID:",e.image_id),console.log("ExplorePage: Image data:",e),e.image_id&&e.image_id!=="undefined"&&e.image_id!=="null"?(console.log("ExplorePage: Navigating to:",`/map/${e.image_id}`),console.log("ExplorePage: Full navigation URL:",`/#/map/${e.image_id}`),k(`/map/${e.image_id}`)):(console.error("Invalid image_id for navigation:",e.image_id),console.error("Full item data:",JSON.stringify(e,null,2)),alert(`Cannot navigate: Invalid image ID (${e.image_id})`))},children:[t.jsx("div",{className:g.mapItemImage,style:{width:"120px",height:"80px"},children:e.image_url?t.jsxs(t.Fragment,{children:[console.log("ExplorePage: Rendering image with URL:",e.image_url),t.jsx("img",{src:e.image_url,alt:e.file_key,onError:s=>{console.error("ExplorePage: Image failed to load:",e.image_url);const o=s.target;o.style.display="none",o.parentElement.innerHTML="Img"},onLoad:()=>console.log("ExplorePage: Image loaded successfully:",e.image_url)})]}):t.jsxs(t.Fragment,{children:[console.log("ExplorePage: No image_url provided for item:",e),"'Img'"]})}),t.jsxs("div",{className:g.mapItemContent,children:[t.jsx("h3",{className:g.mapItemTitle,children:t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{children:e.title||"Untitled"}),e.starred&&t.jsx("span",{className:"text-red-500 text-lg",title:"Starred image",children:"★"})]})}),t.jsx("div",{className:g.mapItemMetadata,children:t.jsxs("div",{className:g.metadataTags,children:[e.image_type!=="drone_image"&&t.jsx("span",{className:g.metadataTagSource,children:e.source&&e.source.includes(", ")?e.source.split(", ").map(s=>J.find(o=>o.s_code===s.trim())?.label||s.trim()).join(", "):J.find(s=>s.s_code===e.source)?.label||e.source}),t.jsx("span",{className:g.metadataTagType,children:e.event_type&&e.event_type.includes(", ")?e.event_type.split(", ").map(s=>W.find(o=>o.t_code===s.trim())?.label||s.trim()).join(", "):W.find(s=>s.t_code===e.event_type)?.label||e.event_type}),t.jsx("span",{className:g.metadataTag,children:X.find(s=>s.image_type===e.image_type)?.label||e.image_type}),e.image_count&&e.image_count>1&&t.jsxs("span",{className:g.metadataTag,title:`Multi-upload with ${e.image_count} images`,children:["📷 ",e.image_count]}),(!e.image_count||e.image_count<=1)&&t.jsx("span",{className:g.metadataTag,title:"Single Upload",children:"Single"}),e.countries&&e.countries.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:g.metadataTag,children:Q.find(s=>s.r_code===e.countries[0].r_code)?.label||"Unknown Region"}),t.jsx("span",{className:g.metadataTag,children:e.countries.map(s=>s.label).join(", ")})]})]})})]})]}),ne&&t.jsx(Z,{withInternalPadding:!0,className:"bg-white/20 backdrop-blur-sm rounded-md p-2",children:t.jsx(D,{name:`delete-${e.image_id}`,variant:"tertiary",size:1,className:"bg-red-50 hover:bg-red-100 text-red-700 border border-red-200 hover:border-red-300",onClick:()=>ve(e.image_id),title:"Delete","aria-label":"Delete saved image",children:t.jsx(Ce,{className:"w-4 h-4"})})})]},e.image_id)),!v.length&&t.jsx("div",{className:"text-center py-12",children:t.jsx("p",{className:"text-gray-500",children:"No examples found."})})]})]})]}):t.jsx("div",{className:"space-y-6",children:t.jsxs("div",{className:"text-center py-12",children:[t.jsx("p",{className:"text-gray-500",children:"Map Details view coming soon..."}),t.jsx("p",{className:"text-sm text-gray-400 mt-2",children:"This will show detailed information about individual maps"})]})})]}),xe&&t.jsx("div",{className:g.fullSizeModalOverlay,onClick:()=>O(!1),children:t.jsx("div",{className:g.fullSizeModalContent,onClick:e=>e.stopPropagation(),children:t.jsxs("div",{className:g.ratingWarningContent,children:[t.jsx("h3",{className:g.ratingWarningTitle,children:"Delete Image?"}),t.jsx("p",{className:g.ratingWarningText,children:"This action cannot be undone. Are you sure you want to delete this saved image and all related data?"}),t.jsxs("div",{className:g.ratingWarningButtons,children:[t.jsx(D,{name:"confirm-delete",variant:"secondary",onClick:Ne,disabled:H,children:H?"Deleting...":"Delete"}),t.jsx(D,{name:"cancel-delete",variant:"tertiary",onClick:()=>O(!1),disabled:H,children:"Cancel"})]})]})})}),t.jsx(De,{isOpen:fe,onClose:()=>{U(!1),B(!1),A(!1)},onExport:(e,s)=>{const o=v.filter(f=>s.includes(f.image_type));je(o,e)},filteredCount:v.length,totalCount:_.length,hasFilters:!!(y||E||b||C||$||P||F||j),crisisMapsCount:v.filter(e=>e.image_type==="crisis_map").length,droneImagesCount:v.filter(e=>e.image_type==="drone_image").length,isLoading:he,exportSuccess:_e})]})}export{Ye as default};