PageSourceSearch

https://acd.net/assets/page-DeVGIc_Y.js

js acd.net collected 2026-09-24 21:09:06 UTC 10,647 bytes, 11 lines download raw bytes

1import{h as C,a as T,j as e,C as N,S as v,r as u,t as U,v as D}from"./index-DH5xu1Ry.js";import{S as I}from"./shield-off-BW5K4K4r.js";import{D as z}from"./database-TzLhx5RV.js";import{R as B}from"./refresh-cw-BSyhBQ-m.js";import{C as M}from"./circle-check-m-DwAMPH.js";import{T as P}from"./trash-2-DIX6WGCm.js";/**
2 * @license lucide-react v0.468.0 - ISC
3 *
4 * This source code is licensed under the ISC license.
5 * See the LICENSE file in the root directory of this source tree.
6 */const F=C("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/**
7 * @license lucide-react v0.468.0 - ISC
8 *
9 * This source code is licensed under the ISC license.
10 * See the LICENSE file in the root directory of this source tree.
11 */const q=C("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]),O=({children:a})=>{var o;const{data:i,status:t}=T();return t==="loading"?e.jsx("main",{className:"public-content-page map-admin map-admin--centered",children:e.jsx(N,{children:e.jsx(v,{title:"Checking permissions",children:"Loading your map management access."})})}):(Array.isArray((o=i==null?void 0:i.user)==null?void 0:o.roles)?i.user.roles.map(String):[]).includes("map.manager")?e.jsx(e.Fragment,{children:a}):e.jsx("main",{className:"public-content-page map-admin map-admin--centered",children:e.jsx(N,{children:e.jsx(v,{tone:"error",title:"Map management access is restricted",children:e.jsxs("span",{className:"map-admin__inline",children:[e.jsx(I,{size:18,"aria-hidden":"true"}),"Ask an administrator for the map.manager role."]})})})})},E=async a=>{const i=await a.json().catch(()=>null);return(i==null?void 0:i.message)??(i==null?void 0:i.error)??`Request failed with status ${a.status}.`},H=async()=>{const a=await fetch("/api/v1/admin/map-assets",{cache:"no-store",credentials:"include"});if(!a.ok)throw new Error(await E(a));return a.json()},G=(a,i,t)=>new Promise((c,o)=>{const s=new XMLHttpRequest;s.open("POST",`/api/v1/admin/map-assets/${encodeURIComponent(a)}/revisions`),s.withCredentials=!0,s.setRequestHeader("Content-Type","application/vnd.pmtiles"),s.setRequestHeader("X-ACD-Filename",encodeURIComponent(i.name)),s.upload.addEventListener("progress",r=>{r.lengthComputable&&r.total>0&&t(Math.round(r.loaded/r.total*100))}),s.addEventListener("load",()=>{let r=null;try{r=JSON.parse(s.responseText)}catch{r=null}if(s.status>=200&&s.status<300&&r){c(r);return}o(new Error((r==null?void 0:r.message)??(r==null?void 0:r.error)??`Upload failed with status ${s.status}.`))}),s.addEventListener("error",()=>o(new Error("The upload could not reach the server."))),s.addEventListener("abort",()=>o(new Error("The upload was cancelled."))),s.send(i)}),R=async(a,i)=>{const t=await fetch(a,{method:i,credentials:"include"});if(!t.ok)throw new Error(await E(t));return t.json()},X=(a,i)=>R(`/api/v1/admin/map-assets/${encodeURIComponent(a)}/revisions/${encodeURIComponent(i)}/activate`,"POST"),J=(a,i)=>R(`/api/v1/admin/map-assets/${encodeURIComponent(a)}/revisions/${encodeURIComponent(i)}`,"DELETE"),w=(a=0)=>{if(a===0)return"0 bytes";const i=["bytes","KB","MB","GB","TB"],t=Math.min(Math.floor(Math.log(a)/Math.log(1024)),i.length-1);return`${(a/1024**t).toLocaleString(void 0,{maximumFractionDigits:t===0?0:1})} ${i[t]}`},A=a=>a?new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"short"}).format(new Date(a)):"Not uploaded",K=({asset:a,revision:i,busy:t,onActivate:c,onDelete:o})=>e.jsxs("li",{className:`map-admin__revision${i.active?" map-admin__revision--active":""}`,children:[e.jsxs("div",{className:"map-admin__revision-copy",children:[e.jsxs("div",{className:"map-admin__revision-title",children:[e.jsx("strong",{children:i.fileName}),i.active&&e.jsxs("span",{children:[e.jsx(M,{size:15,"aria-hidden":"true"}),"Active"]})]}),e.jsxs("small",{children:[w(i.sizeBytes)," · ",A(i.createdAt),i.uploadedBy?` · ${i.uploadedBy}`:""]}),e.jsx("code",{title:i.id,children:i.id})]}),e.jsxs("div",{className:"map-admin__revision-actions",children:[e.jsxs("button",{type:"button",className:"public-button public-button--secondary",disabled:t||i.active,onClick:c,"aria-label":`Activate ${i.fileName} for ${a.label}`,children:[e.jsx(F,{size:16,"aria-hidden":"true"}),"Activate"]}),e.jsxs("button",{type:"button",className:"map-admin__delete-button",disabled:t||i.active,onClick:o,"aria-label":`Delete ${i.fileName} revision for ${a.label}`,children:[e.jsx(P,{size:16,"aria-hidden":"true"}),"Delete"]})]})]}),W=({asset:a,maxUploadBytes:i,selected:t,busy:c,uploading:o,progress:s,onSelect:r,onUpload:b,onActivate:f,onDelete:m})=>{var p;const j=`map-asset-${a.layer}`;return e.jsxs(N,{as:"section",className:"map-admin__asset","aria-labelledby":j,children:[e.jsxs("div",{className:"map-admin__asset-heading",children:[e.jsxs("div",{children:[e.jsx("p",{className:"mk-kicker",children:a.usedBy.join(" · ")}),e.jsx("h2",{id:j,children:a.label})]}),e.jsxs("span",{className:`map-admin__availability map-admin__availability--${a.available?"ready":"missing"}`,children:[a.available&&e.jsx(M,{size:16,"aria-hidden":"true"}),a.available?"Live":"Missing"]})]}),e.jsxs("dl",{className:"map-admin__metadata",children:[e.jsxs("div",{children:[e.jsx("dt",{children:"Live object"}),e.jsx("dd",{children:a.fileName})]}),a.sourceLayer&&e.jsxs("div",{children:[e.jsx("dt",{children:"Source layer"}),e.jsx("dd",{children:a.sourceLayer})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Live size"}),e.jsx("dd",{children:a.available?w(a.sizeBytes):"—"})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Activated"}),e.jsx("dd",{children:A(a.lastModified)})]})]}),a.available&&!a.activeRevisionId&&e.jsx(v,{tone:"warning",title:"Existing live object",children:"It will be saved as a rollback revision automatically when you activate the first managed revision."}),e.jsxs("div",{className:"map-admin__upload",children:[e.jsx("h3",{children:"Upload a new revision"}),e.jsx("p",{children:"Uploading does not change the live maps. Activate the revision after it has been reviewed."}),e.jsx("label",{htmlFor:`file-${a.layer}`,children:"Choose a PMTiles v3 archive"}),e.jsx("input",{id:`file-${a.layer}`,type:"file",accept:".pmtiles,application/vnd.pmtiles,application/octet-stream",disabled:c,onChange:h=>{var y;return r((y=h.target.files)==null?void 0:y[0])}},`${a.layer}-${((p=a.revisions[0])==null?void 0:p.id)??"empty"}`),t&&e.jsxs("p",{className:"map-admin__selection",children:[e.jsx("strong",{children:t.name}),e.jsx("span",{children:w(t.size)})]}),o&&e.jsxs("progress",{value:s,max:"100","aria-label":`Uploading ${a.label} revision`,children:[s,"%"]}),e.jsxs("button",{type:"button",className:"public-button public-button--primary",disabled:!t||t.size>i||c,onClick:b,children:[e.jsx(q,{size:17,"aria-hidden":"true"}),o?`Uploading ${s}%`:"Upload revision"]}),t&&t.size>i&&e.jsxs(v,{tone:"error",children:["This file exceeds the ",w(i)," upload limit."]})]}),e.jsxs("div",{className:"map-admin__revisions",children:[e.jsxs("div",{className:"map-admin__revisions-heading",children:[e.jsx("h3",{children:"Revision history"}),e.jsx("span",{children:a.revisions.length})]}),a.revisions.length===0?e.jsx("p",{className:"map-admin__empty",children:"No managed revisions have been uploaded."}):e.jsx("ul",{children:a.revisions.map(h=>e.jsx(K,{asset:a,revision:h,busy:c,onActivate:()=>f(h),onDelete:()=>m(h)},h.id))})]})]})},ie=()=>{const[a,i]=u.useState(null),[t,c]=u.useState({}),[o,s]=u.useState(null),[r,b]=u.useState(0),[f,m]=u.useState(null),[j,p]=u.useState(null),[h,y]=u.useState(!0),$=u.useCallback(async()=>{y(!0),m(null);try{i(await H())}catch(n){m(n instanceof Error?n.message:"Map assets could not be loaded.")}finally{y(!1)}},[]);u.useEffect(()=>{$()},[$]);const _=n=>{i(l=>l&&{...l,assets:l.assets.map(d=>d.layer===n.layer?n:d)})},S=async n=>{const l=t[n.layer];if(!(!l||!a)){if(!l.name.toLowerCase().endsWith(".pmtiles")){m("Choose a file with the .pmtiles extension.");return}s(`upload:${n.layer}`),b(0),m(null),p(null);try{const d=await G(n.layer,l,b);i(x=>x&&{...x,assets:x.assets.map(g=>g.layer===n.layer?{...g,revisions:[d,...g.revisions]}:g)}),c(x=>({...x,[n.layer]:void 0})),p(`${n.label} revision ${d.fileName} was uploaded. It is not live until you activate it.`)}catch(d){m(d instanceof Error?d.message:"The map revision upload failed.")}finally{s(null)}}},k=async(n,l)=>{if(window.confirm(`Activate ${l.fileName} for ${n.label}? New map requests will use this revision.`)){s(`activate:${n.layer}:${l.id}`),m(null),p(null);try{_(await X(n.layer,l.id)),p(`${l.fileName} is now the active ${n.label} revision.`)}catch(d){m(d instanceof Error?d.message:"The revision could not be activated.")}finally{s(null)}}},L=async(n,l)=>{if(window.confirm(`Permanently delete the inactive revision ${l.fileName}? This cannot be undone.`)){s(`delete:${n.layer}:${l.id}`),m(null),p(null);try{_(await J(n.layer,l.id)),p(`${l.fileName} was deleted from the ${n.label} revision history.`)}catch(d){m(d instanceof Error?d.message:"The revision could not be deleted.")}finally{s(null)}}};return e.jsx(O,{children:e.jsxs("main",{className:"public-content-page map-admin",children:[e.jsx(U,{eyebrow:"Map management",title:"PMTiles revisions",introduction:"Upload revisions without changing the live maps, activate a reviewed revision, and retain earlier versions for fast rollback."}),e.jsxs(D,{children:[e.jsxs("div",{className:"map-admin__toolbar",children:[e.jsxs("div",{children:[e.jsxs("h2",{children:[e.jsx(z,{size:25,"aria-hidden":"true"}),"Map data"]}),e.jsx("p",{children:"Fiber Map and Agent Map read the active revision. Only inactive revisions can be permanently deleted."})]}),e.jsxs("button",{type:"button",className:"public-button public-button--secondary",onClick:()=>void $(),disabled:h||o!==null,children:[e.jsx(B,{size:17,"aria-hidden":"true"}),"Refresh catalog"]})]}),h&&e.jsx(v,{live:!0,title:"Loading map assets",children:"Reading active pointers and revision history from MinIO."}),f&&e.jsx(v,{live:!0,tone:"error",title:"Map asset action failed",children:f}),j&&e.jsx(v,{live:!0,tone:"success",title:"Map revision updated",children:j}),a&&e.jsx("div",{className:"map-admin__grid",children:a.assets.map(n=>e.jsx(W,{asset:n,maxUploadBytes:a.maxUploadBytes,selected:t[n.layer],busy:o!==null,uploading:o===`upload:${n.layer}`,progress:o===`upload:${n.layer}`?r:0,onSelect:l=>{m(null),p(null),c(d=>({...d,[n.layer]:l}))},onUpload:()=>void S(n),onActivate:l=>void k(n,l),onDelete:l=>void L(n,l)},n.layer))})]})]})})};export{ie 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.