Add adjustable probe area for OpenSky test connection
Let the OpenSky health probe run over a chosen bounding box without touching the saved default, so its credit cost (which scales with area) can be checked cheaply. - Backend: the plugin health endpoint (panel Check) and the OpenSky health endpoint (Web App Test connection) accept an optional ?bbox=, validated with validBBox and applied to a transient probe instance; both BFF and API forward it. Saved config is untouched. - API panel: a "Probe area" picker beside each bbox-capable plugin's Check button — saved default, all countries (grouped by continent), or Custom. Adds a compact pv-input-sm style. - Web App: a "Test area" picker beside Test connection, using the full country list (new countryGroups() helper) plus Custom. This is where the probe is authenticated and the credit cost is shown. Builds pass across both Go modules and both frontends. Panel picker verified live (186 options, defaults to saved default). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
763cc67081
commit
15bff7f517
17 files changed
+233
-53
No files matched your search
@@ -0,0 +1 @@
|
||||
@import"https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Space+Mono:wght@400;700&display=swap";/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:"Space Grotesk", ui-sans-serif, system-ui, "Segoe UI", sans-serif;--font-mono:"Space Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;--spacing:.25rem;--container-sm:24rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-tight:1.25;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Space Grotesk", ui-sans-serif, system-ui, "Segoe UI", sans-serif;--default-mono-font-family:"Space Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;--font-display:"Space Grotesk", ui-sans-serif, system-ui, "Segoe UI", sans-serif;--radius-sm:6px;--radius-md:10px}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-fielLine truncated
|
||||
@@ -1,17 +0,0 @@
|
||||
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&s(l)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();/**
|
||||
* @vue/shared v3.5.39
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/function Ps(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const se={},jt=[],tt=()=>{},Fo=()=>!1,zn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Gn=e=>e.startsWith("onUpdate:"),Ae=Object.assign,Os=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Qi=Object.prototype.hasOwnProperty,Q=(e,t)=>Qi.call(e,t),j=Array.isArray,$t=e=>mn(e)==="[object Map]",Gt=e=>mn(e)==="[object Set]",eo=e=>mn(e)==="[object Date]",H=e=>typeof e=="function",ce=e=>typeof e=="string",nt=e=>typeof e=="symbol",te=e=>e!==null&&typeof e=="object",No=e=>(te(e)||H(e))&&H(e.then)&&H(e.catch),Lo=Object.prototype.toString,mn=e=>Lo.call(e),el=e=>mn(e).slice(8,-1),Do=e=>mn(e)==="[object Object]",Us=e=>ce(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,nn=Ps(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Wn=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},tl=/-\w/g,He=Wn(e=>e.replace(tl,t=>t.slice(1).toUpperCase())),nl=/\B([A-Z])/g,yt=Wn(e=>e.replace(nl,"-$1").toLowerCase()),jo=Wn(e=>e.charAt(0).toUpperCase()+e.slice(1)),is=Wn(e=>e?`on${jo(e)}`:""),et=(e,t)=>!Object.is(e,t),Rn=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},$o=(e,t,n,s=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Jn=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let to;const qn=()=>to||(to=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ms(e){if(j(e)){const t={};for(let n=0;n<e.length;n++){const s=e[n],o=ce(s)?ll(s):Ms(s);if(o)for(const i in o)t[i]=o[i]}return t}else if(ce(e)||te(e))return e}const sl=/;(?![^(]*\))/g,ol=/:([^]+)/,il=/\/\*[^]*?\*\//g;function ll(e){const t={};return e.replace(il,"").split(sl).forEach(n=>{if(n){const s=n.split(ol);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ie(e){let t="";if(ce(e))t=e;else if(j(e))for(let n=0;n<e.length;n++){const s=Ie(e[n]);s&&(t+=s+" ")}else if(te(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}const rl="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",al=Ps(rl);function Bo(e){return!!e||e===""}function cl(e,t){if(e.length!==t.length)return!1;let n=!0;for(let s=0;n&&s<e.length;s++)n=gt(e[s],t[s]);return n}function gt(e,t){if(e===t)return!0;let n=eo(e),s=eo(t);if(n||s)return n&&s?e.getTime()===t.getTime():!1;if(n=nt(e),s=nt(t),n||s)return e===t;if(n=j(e),s=j(t),n||s)return n&&s?cl(e,t):!1;if(n=te(e),s=te(t),n||s){if(!n||!s)return!1;const o=Object.keys(e).length,i=Object.keys(t).length;if(o!==i)return!1;for(const l in e){const r=e.hasOwnProperty(l),c=t.hasOwnProperty(l);if(r&&!c||!r&&c||!gt(e[l],t[l]))return!1}}return String(e)===String(t)}function Rs(e,t){return e.findIndex(n=>gt(n,t))}const Vo=e=>!!(e&&e.__v_isRef===!0),O=e=>ce(e)?e:e==null?"":j(e)||te(e)&&(e.toString===Lo||!H(e.toString))?Vo(e)?O(e.value):JSON.stringify(e,Ho,2):String(e),Ho=(e,t)=>Vo(t)?Ho(e,t.value):$t(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o],i)=>(n[ls(s,i)+" =>"]=o,n),{})}:Gt(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>ls(n))}:nt(t)?ls(t):te(t)&&!j(t)&&!Do(t)?String(t):t,ls=(e,t="")=>{var n;return nt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/**
|
||||
* @vue/reactivity v3.5.39
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/let ge;class ul{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&ge&&(ge.active?(this.parent=ge,this.index=(ge.scopes||(ge.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].pause();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].resume();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].resume()}}run(t){if(this._active){const n=ge;try{return ge=this,t()}finally{ge=n}}}on(){++this._on===1&&(this.prevScope=ge,ge=this)}off(){if(this._on>0&&--this._on===0){if(ge===this)ge=this.prevScope;else{let t=ge;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n<s;n++)this.effects[n].stop();for(this.effects.length=0,n=0,s=this.cleanups.length;n<s;n++)this.cleanups[n]();if(this.cleanups.length=0,this.scopes){for(n=0,s=this.scopes.length;n<s;n++)this.scopes[n].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const o=this.parent.scopes.pop();o&&o!==this&&(this.parent.scopes[this.index]=o,o.index=this.index)}this.parent=void 0}}}function dl(){return ge}let re;const rs=new WeakSet;class Ko{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,ge&&(ge.active?ge.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,rs.has(this)&&(rs.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Go(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,no(this),Wo(this);const t=re,n=Ke;re=this,Ke=!0;try{return this.fn()}finally{Jo(this),re=t,Ke=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)Ns(t);this.deps=this.depsTail=void 0,no(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?rs.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){gs(this)&&this.run()}get dirty(){return gs(this)}}let zo=0,sn,on;function Go(e,t=!1){if(e.flags|=8,t){e.next=on,on=e;return}e.next=sn,sn=e}function Is(){zo++}function Fs(){if(--zo>0)return;if(on){let t=on;for(on=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;sn;){let t=sn;for(sn=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Wo(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Jo(e){let t,n=e.depsTail,s=n;for(;s;){const o=s.prevDep;s.version===-1?(s===n&&(n=o),Ns(s),fl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=o}e.deps=t,e.depsTail=n}function gs(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(qo(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function qo(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===un)||(e.globalVersion=un,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!gs(e))))return;e.flags|=2;const t=e.dep,n=re,s=Ke;re=e,Ke=!0;try{Wo(e);const o=e.fn(e._value);(t.version===0||et(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{re=n,Ke=s,Jo(e),e.flags&=-3}}function Ns(e,t=!1){const{dep:n,prevSub:s,nextSub:o}=e;if(s&&(s.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Ns(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function fl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ke=!0;const Yo=[];function st(){Yo.push(Ke),Ke=!1}function ot(){const e=Yo.pop();Ke=e===void 0?!0:e}function no(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=re;re=void 0;try{t()}finally{re=n}}}let un=0;class pl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Ls{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!re||!Ke||re===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==re)n=this.activeLink=new pl(re,this),re.deps?(n.prevDep=re.depsTail,re.depsTail.nextDep=n,re.depsTail=n):re.deps=re.depsTail=n,Zo(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=re.depsTail,n.nextDep=void 0,re.depsTail.nextDep=n,re.depsTail=n,re.deps===n&&(re.deps=s)}return n}trigger(t){this.versiLine truncated
|
||||
* @vue/runtime-core v3.5.39
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/function gn(e,t,n,s){try{return s?e(...s):e()}catch(o){Zn(o,t,n)}}function Ge(e,t,n,s){if(H(e)){const o=gn(e,t,n,s);return o&&No(o)&&o.catch(i=>{Zn(i,t,n)}),o}if(j(e)){const o=[];for(let i=0;i<e.length;i++)o.push(Ge(e[i],t,n,s));return o}}function Zn(e,t,n,s=!0){const o=t?t.vnode:null,{errorHandler:i,throwUnhandledErrorInProduction:l}=t&&t.appContext.config||se;if(t){let r=t.parent;const c=t.proxy,m=`https://vuejs.org/error-reference/#runtime-${n}`;for(;r;){const h=r.ec;if(h){for(let x=0;x<h.length;x++)if(h[x](e,c,m)===!1)return}r=r.parent}if(i){st(),gn(i,null,10,[e,c,m]),ot();return}}Dl(e,n,o,s,l)}function Dl(e,t,n,s=!0,o=!1){if(o)throw e;console.error(e)}const Te=[];let Ze=-1;const Bt=[];let mt=null,Lt=0;const ii=Promise.resolve();let Dn=null;function li(e){const t=Dn||ii;return e?t.then(this?e.bind(this):e):t}function jl(e){let t=Ze+1,n=Te.length;for(;t<n;){const s=t+n>>>1,o=Te[s],i=fn(o);i<e||i===e&&o.flags&2?t=s+1:n=s}return t}function Vs(e){if(!(e.flags&1)){const t=fn(e),n=Te[Te.length-1];!n||!(e.flags&2)&&t>=fn(n)?Te.push(e):Te.splice(jl(t),0,e),e.flags|=1,ri()}}function ri(){Dn||(Dn=ii.then(ci))}function $l(e){j(e)?Bt.push(...e):mt&&e.id===-1?mt.splice(Lt+1,0,e):e.flags&1||(Bt.push(e),e.flags|=1),ri()}function oo(e,t,n=Ze+1){for(;n<Te.length;n++){const s=Te[n];if(s&&s.flags&2){if(e&&s.id!==e.uid)continue;Te.splice(n,1),n--,s.flags&4&&(s.flags&=-2),s(),s.flags&4||(s.flags&=-2)}}}function ai(e){if(Bt.length){const t=[...new Set(Bt)].sort((n,s)=>fn(n)-fn(s));if(Bt.length=0,mt){mt.push(...t);return}for(mt=t,Lt=0;Lt<mt.length;Lt++){const n=mt[Lt];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}mt=null,Lt=0}}const fn=e=>e.id==null?e.flags&2?-1:1/0:e.id;function ci(e){try{for(Ze=0;Ze<Te.length;Ze++){const t=Te[Ze];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),gn(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;Ze<Te.length;Ze++){const t=Te[Ze];t&&(t.flags&=-2)}Ze=-1,Te.length=0,ai(),Dn=null,(Te.length||Bt.length)&&ci()}}let $e=null,ui=null;function jn(e){const t=$e;return $e=e,ui=e&&e.type.__scopeId||null,t}function Bl(e,t=$e,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&mo(-1);const i=jn(t);let l;try{l=e(...o)}finally{jn(i),s._d&&mo(1)}return l};return s._n=!0,s._c=!0,s._d=!0,s}function le(e,t){if($e===null)return e;const n=ts($e),s=e.dirs||(e.dirs=[]);for(let o=0;o<t.length;o++){let[i,l,r,c=se]=t[o];i&&(H(i)&&(i={mounted:i,updated:i}),i.deep&&dt(l),s.push({dir:i,instance:n,value:l,oldValue:void 0,arg:r,modifiers:c}))}return e}function At(e,t,n,s){const o=e.dirs,i=t&&t.dirs;for(let l=0;l<o.length;l++){const r=o[l];i&&(r.oldValue=i[l].value);let c=r.dir[s];c&&(st(),Ge(c,n,8,[e.el,r,e,t]),ot())}}function Vl(e,t){if(Pe){let n=Pe.provides;const s=Pe.parent&&Pe.parent.provides;s===n&&(n=Pe.provides=Object.create(s)),n[e]=t}}function In(e,t,n=!1){const s=Br();if(s||Vt){let o=Vt?Vt._context.provides:s?s.parent==null||s.ce?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides:void 0;if(o&&e in o)return o[e];if(arguments.length>1)return n&&H(t)?t.call(s&&s.proxy):t}}const Hl=Symbol.for("v-scx"),Kl=()=>In(Hl);function us(e,t,n){return di(e,t,n)}function di(e,t,n=se){const{immediate:s,deep:o,flush:i,once:l}=n,r=Ae({},n),c=t&&s||!t&&i!=="post";let m;if(hn){if(i==="sync"){const R=Kl();m=R.__watcherHandles||(R.__watcherHandles=[])}else if(!c){const R=()=>{};return R.stop=tt,R.resume=tt,R.pause=tt,R}}const h=Pe;r.call=(R,J,I)=>Ge(R,h,J,I);let x=!1;i==="post"?r.scheduler=R=>{Ue(R,h&&h.suspense)}:i!=="sync"&&(x=!0,r.scheduler=(R,J)=>{J?R():Vs(R)}),r.augmentJob=R=>{t&&(R.flags|=4),x&&(R.flags|=2,h&&(R.id=h.uid,R.i=h))};const U=Ll(e,t,r);return hn&&(m?m.push(U):c&&U()),U}function zl(e,t,n){const s=this.proxy,o=ce(e)?e.includes(".")?fi(s,e):()=>s[e]:e.bind(s,s);let i;H(t)?i=t:(i=t.handler,n=t);const l=vn(this),r=di(o,i.bind(s),n);return l(),r}function fi(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o<n.length&&s;o++)s=s[n[o]];return s}}const Gl=Symbol("_vte"),Wl=e=>e.__isTeleport,ds=Symbol("_leaveCb");function Hs(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Hs(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function pi(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function io(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}const $n=new WeakMap;function ln(e,t,n,s,o=!1){if(j(e)){e.forEach((I,G)=>ln(I,t&&(j(t)?t[G]:t),n,s,o));return}if(rn(s)&&!o){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&ln(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?ts(s.component):s.el,l=o?null:i,{i:r,r:c}=e,m=t&&t.r,h=r.refs===se?r.refs={}:r.refs,x=r.setupState,U=X(x),R=x===se?Fo:I=>io(h,I)?!1:Q(U,I),J=(I,G)=>!(G&&io(h,G));if(m!=null&&m!==c){if(lo(t),ce(m))h[m]=null,R(m)&&(x[m]=null);else if(Se(m)){const I=t;J(m,I.k)&&(m.value=null),I.k&&(h[I.k]=null)}}if(H(c)){st();try{gn(c,r,12,[l,h])}finally{ot()}}else{const I=ce(c),G=Se(c);if(I||G){const Y=()=>{if(e.f
Line truncated
|
||||
* @vue/runtime-dom v3.5.39
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/let Ts;const xo=typeof window<"u"&&window.trustedTypes;if(xo)try{Ts=xo.createPolicy("vue",{createHTML:e=>e})}catch{}const ji=Ts?e=>Ts.createHTML(e):e=>e,Jr="http://www.w3.org/2000/svg",qr="http://www.w3.org/1998/Math/MathML",at=typeof document<"u"?document:null,yo=at&&at.createElement("template"),Yr={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?at.createElementNS(Jr,e):t==="mathml"?at.createElementNS(qr,e):n?at.createElement(e,{is:n}):at.createElement(e);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>at.createTextNode(e),createComment:e=>at.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>at.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,i){const l=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{yo.innerHTML=ji(s==="svg"?`<svg>${e}</svg>`:s==="mathml"?`<math>${e}</math>`:e);const r=yo.content;if(s==="svg"||s==="mathml"){const c=r.firstChild;for(;c.firstChild;)r.appendChild(c.firstChild);r.removeChild(c)}t.insertBefore(r,n)}return[l?l.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Zr=Symbol("_vtc");function Xr(e,t,n){const s=e[Zr];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Kn=Symbol("_vod"),$i=Symbol("_vsh"),Zt={name:"show",beforeMount(e,{value:t},{transition:n}){e[Kn]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Xt(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),Xt(e,!0),s.enter(e)):s.leave(e,()=>{Xt(e,!1)}):Xt(e,t))},beforeUnmount(e,{value:t}){Xt(e,t)}};function Xt(e,t){e.style.display=t?e[Kn]:"none",e[$i]=!t}const Qr=Symbol(""),ea=/(?:^|;)\s*display\s*:/;function ta(e,t,n){const s=e.style,o=ce(n);let i=!1;if(n&&!o){if(t)if(ce(t))for(const l of t.split(";")){const r=l.slice(0,l.indexOf(":")).trim();n[r]==null&&tn(s,r,"")}else for(const l in t)n[l]==null&&tn(s,l,"");for(const l in n){l==="display"&&(i=!0);const r=n[l];r!=null?sa(e,l,!ce(t)&&t?t[l]:void 0,r)||tn(s,l,r):tn(s,l,"")}}else if(o){if(t!==n){const l=s[Qr];l&&(n+=";"+l),s.cssText=n,i=ea.test(n)}}else t&&e.removeAttribute("style");Kn in e&&(e[Kn]=i?s.display:"",e[$i]&&(s.display="none"))}const _o=/\s*!important$/;function tn(e,t,n){if(j(n))n.forEach(s=>tn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=na(e,t);_o.test(n)?e.setProperty(yt(s),n.replace(_o,""),"important"):e[s]=n}}const wo=["Webkit","Moz","ms"],hs={};function na(e,t){const n=hs[t];if(n)return n;let s=He(t);if(s!=="filter"&&s in e)return hs[t]=s;s=jo(s);for(let o=0;o<wo.length;o++){const i=wo[o]+s;if(i in e)return hs[t]=i}return t}function sa(e,t,n,s){return e.tagName==="TEXTAREA"&&(t==="width"||t==="height")&&ce(s)&&n===s}const So="http://www.w3.org/1999/xlink";function Ao(e,t,n,s,o,i=al(t)){s&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(So,t.slice(6,t.length)):e.setAttributeNS(So,t,n):n==null||i&&!Bo(n)?e.removeAttribute(t):e.setAttribute(t,i?"":nt(n)?String(n):n)}function Co(e,t,n,s,o){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?ji(n):n);return}const i=e.tagName;if(t==="value"&&i!=="PROGRESS"&&!i.includes("-")){const r=i==="OPTION"?e.getAttribute("value")||"":e.value,c=n==null?e.type==="checkbox"?"on":"":String(n);(r!==c||!("_value"in e))&&(e.value=c),n==null&&e.removeAttribute(t),e._value=n;return}let l=!1;if(n===""||n==null){const r=typeof e[t];r==="boolean"?n=Bo(n):n==null&&r==="string"?(n="",l=!0):r==="number"&&(n=0,l=!0)}try{e[t]=n}catch{}l&&e.removeAttribute(o||t)}function ft(e,t,n,s){e.addEventListener(t,n,s)}function oa(e,t,n,s){e.removeEventListener(t,n,s)}const Eo=Symbol("_vei");function ia(e,t,n,s,o=null){const i=e[Eo]||(e[Eo]={}),l=i[t];if(s&&l)l.value=s;else{const[r,c]=aa(t);if(s){const m=i[t]=da(s,o);ft(e,r,m,c)}else l&&(oa(e,r,l,c),i[t]=void 0)}}const la=/(Once|Passive|Capture)$/,ra=/^on:?(?:Once|Passive|Capture)$/;function aa(e){let t,n;for(;(n=e.match(la))&&!ra.test(e);)t||(t={}),e=e.slice(0,e.length-n[1].length),t[n[1].toLowerCase()]=!0;return[e[2]===":"?e.slice(3):yt(e.slice(2)),t]}let bs=0;const ca=Promise.resolve(),ua=()=>bs||(ca.then(()=>bs=0),bs=Date.now());function da(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;const o=n.value;if(j(o)){const i=s.stopImmediatePropagation;s.stopImmediatePropagation=()=>{i.call(s),s._stopped=!0};const l=o.slice(),r=[s];for(let c=0;c<l.length&&!s._stopped;c++){const m=l[c];m&&Ge(m,t,5,r)}}else Ge(o,t,5,[s])};return n.value=e,n.attached=ua(),n}const ko=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,fa=(e,t,n,s,o
Line truncated
|
||||
@@ -1 +0,0 @@
|
||||
@import"https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Space+Mono:wght@400;700&display=swap";/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:"Space Grotesk", ui-sans-serif, system-ui, "Segoe UI", sans-serif;--font-mono:"Space Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;--spacing:.25rem;--container-sm:24rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-tight:1.25;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Space Grotesk", ui-sans-serif, system-ui, "Segoe UI", sans-serif;--default-mono-font-family:"Space Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;--font-display:"Space Grotesk", ui-sans-serif, system-ui, "Segoe UI", sans-serif;--radius-sm:6px;--radius-md:10px}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-fielLine truncated
|
||||
@@ -0,0 +1,17 @@
|
||||
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&s(l)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();/**
|
||||
* @vue/shared v3.5.39
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/function Is(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const oe={},Gt=[],rt=()=>{},Bo=()=>!1,Yn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Zn=e=>e.startsWith("onUpdate:"),Se=Object.assign,Rs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},il=Object.prototype.hasOwnProperty,ee=(e,t)=>il.call(e,t),B=Array.isArray,Wt=e=>_n(e)==="[object Map]",Qt=e=>_n(e)==="[object Set]",oo=e=>_n(e)==="[object Date]",V=e=>typeof e=="function",ae=e=>typeof e=="string",at=e=>typeof e=="symbol",se=e=>e!==null&&typeof e=="object",$o=e=>(se(e)||V(e))&&V(e.then)&&V(e.catch),jo=Object.prototype.toString,_n=e=>jo.call(e),ll=e=>_n(e).slice(8,-1),Vo=e=>_n(e)==="[object Object]",Fs=e=>ae(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,an=Is(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Xn=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},rl=/-\w/g,Je=Xn(e=>e.replace(rl,t=>t.slice(1).toUpperCase())),al=/\B([A-Z])/g,At=Xn(e=>e.replace(al,"-$1").toLowerCase()),Ho=Xn(e=>e.charAt(0).toUpperCase()+e.slice(1)),cs=Xn(e=>e?`on${Ho(e)}`:""),lt=(e,t)=>!Object.is(e,t),Dn=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},Ko=(e,t,n,s=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Qn=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let io;const es=()=>io||(io=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ns(e){if(B(e)){const t={};for(let n=0;n<e.length;n++){const s=e[n],o=ae(s)?fl(s):Ns(s);if(o)for(const i in o)t[i]=o[i]}return t}else if(ae(e)||se(e))return e}const cl=/;(?![^(]*\))/g,ul=/:([^]+)/,dl=/\/\*[^]*?\*\//g;function fl(e){const t={};return e.replace(dl,"").split(cl).forEach(n=>{if(n){const s=n.split(ul);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Fe(e){let t="";if(ae(e))t=e;else if(B(e))for(let n=0;n<e.length;n++){const s=Fe(e[n]);s&&(t+=s+" ")}else if(se(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}const pl="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",hl=Is(pl);function zo(e){return!!e||e===""}function bl(e,t){if(e.length!==t.length)return!1;let n=!0;for(let s=0;n&&s<e.length;s++)n=_t(e[s],t[s]);return n}function _t(e,t){if(e===t)return!0;let n=oo(e),s=oo(t);if(n||s)return n&&s?e.getTime()===t.getTime():!1;if(n=at(e),s=at(t),n||s)return e===t;if(n=B(e),s=B(t),n||s)return n&&s?bl(e,t):!1;if(n=se(e),s=se(t),n||s){if(!n||!s)return!1;const o=Object.keys(e).length,i=Object.keys(t).length;if(o!==i)return!1;for(const l in e){const r=e.hasOwnProperty(l),u=t.hasOwnProperty(l);if(r&&!u||!r&&u||!_t(e[l],t[l]))return!1}}return String(e)===String(t)}function Ls(e,t){return e.findIndex(n=>_t(n,t))}const Go=e=>!!(e&&e.__v_isRef===!0),O=e=>ae(e)?e:e==null?"":B(e)||se(e)&&(e.toString===jo||!V(e.toString))?Go(e)?O(e.value):JSON.stringify(e,Wo,2):String(e),Wo=(e,t)=>Go(t)?Wo(e,t.value):Wt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,o],i)=>(n[us(s,i)+" =>"]=o,n),{})}:Qt(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>us(n))}:at(t)?us(t):se(t)&&!B(t)&&!Vo(t)?String(t):t,us=(e,t="")=>{var n;return at(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/**
|
||||
* @vue/reactivity v3.5.39
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/let ge;class ml{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&ge&&(ge.active?(this.parent=ge,this.index=(ge.scopes||(ge.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].pause();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].resume();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].resume()}}run(t){if(this._active){const n=ge;try{return ge=this,t()}finally{ge=n}}}on(){++this._on===1&&(this.prevScope=ge,ge=this)}off(){if(this._on>0&&--this._on===0){if(ge===this)ge=this.prevScope;else{let t=ge;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n<s;n++)this.effects[n].stop();for(this.effects.length=0,n=0,s=this.cleanups.length;n<s;n++)this.cleanups[n]();if(this.cleanups.length=0,this.scopes){for(n=0,s=this.scopes.length;n<s;n++)this.scopes[n].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const o=this.parent.scopes.pop();o&&o!==this&&(this.parent.scopes[this.index]=o,o.index=this.index)}this.parent=void 0}}}function gl(){return ge}let le;const ds=new WeakSet;class Jo{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,ge&&(ge.active?ge.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,ds.has(this)&&(ds.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Yo(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,lo(this),Zo(this);const t=le,n=qe;le=this,qe=!0;try{return this.fn()}finally{Xo(this),le=t,qe=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)$s(t);this.deps=this.depsTail=void 0,lo(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?ds.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){_s(this)&&this.run()}get dirty(){return _s(this)}}let qo=0,cn,un;function Yo(e,t=!1){if(e.flags|=8,t){e.next=un,un=e;return}e.next=cn,cn=e}function Ds(){qo++}function Bs(){if(--qo>0)return;if(un){let t=un;for(un=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;cn;){let t=cn;for(cn=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Zo(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Xo(e){let t,n=e.depsTail,s=n;for(;s;){const o=s.prevDep;s.version===-1?(s===n&&(n=o),$s(s),vl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=o}e.deps=t,e.depsTail=n}function _s(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Qo(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Qo(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===bn)||(e.globalVersion=bn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!_s(e))))return;e.flags|=2;const t=e.dep,n=le,s=qe;le=e,qe=!0;try{Zo(e);const o=e.fn(e._value);(t.version===0||lt(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{le=n,qe=s,Xo(e),e.flags&=-3}}function $s(e,t=!1){const{dep:n,prevSub:s,nextSub:o}=e;if(s&&(s.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)$s(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function vl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let qe=!0;const ei=[];function ct(){ei.push(qe),qe=!1}function ut(){const e=ei.pop();qe=e===void 0?!0:e}function lo(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=le;le=void 0;try{t()}finally{le=n}}}let bn=0;class xl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class js{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!le||!qe||le===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==le)n=this.activeLink=new xl(le,this),le.deps?(n.prevDep=le.depsTail,le.depsTail.nextDep=n,le.depsTail=n):le.deps=le.depsTail=n,ti(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=le.depsTail,n.nextDep=void 0,le.depsTail.nextDep=n,le.depsTail=n,le.deps===n&&(le.deps=s)}return n}trigger(t){this.versiLine truncated
|
||||
* @vue/runtime-core v3.5.39
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/function wn(e,t,n,s){try{return s?e(...s):e()}catch(o){ns(o,t,n)}}function Ze(e,t,n,s){if(V(e)){const o=wn(e,t,n,s);return o&&$o(o)&&o.catch(i=>{ns(i,t,n)}),o}if(B(e)){const o=[];for(let i=0;i<e.length;i++)o.push(Ze(e[i],t,n,s));return o}}function ns(e,t,n,s=!0){const o=t?t.vnode:null,{errorHandler:i,throwUnhandledErrorInProduction:l}=t&&t.appContext.config||oe;if(t){let r=t.parent;const u=t.proxy,m=`https://vuejs.org/error-reference/#runtime-${n}`;for(;r;){const h=r.ec;if(h){for(let y=0;y<h.length;y++)if(h[y](e,u,m)===!1)return}r=r.parent}if(i){ct(),wn(i,null,10,[e,u,m]),ut();return}}Kl(e,n,o,s,l)}function Kl(e,t,n,s=!0,o=!1){if(o)throw e;console.error(e)}const ke=[];let st=-1;const Jt=[];let yt=null,Kt=0;const ci=Promise.resolve();let Hn=null;function ui(e){const t=Hn||ci;return e?t.then(this?e.bind(this):e):t}function zl(e){let t=st+1,n=ke.length;for(;t<n;){const s=t+n>>>1,o=ke[s],i=gn(o);i<e||i===e&&o.flags&2?t=s+1:n=s}return t}function Gs(e){if(!(e.flags&1)){const t=gn(e),n=ke[ke.length-1];!n||!(e.flags&2)&&t>=gn(n)?ke.push(e):ke.splice(zl(t),0,e),e.flags|=1,di()}}function di(){Hn||(Hn=ci.then(pi))}function Gl(e){B(e)?Jt.push(...e):yt&&e.id===-1?yt.splice(Kt+1,0,e):e.flags&1||(Jt.push(e),e.flags|=1),di()}function ao(e,t,n=st+1){for(;n<ke.length;n++){const s=ke[n];if(s&&s.flags&2){if(e&&s.id!==e.uid)continue;ke.splice(n,1),n--,s.flags&4&&(s.flags&=-2),s(),s.flags&4||(s.flags&=-2)}}}function fi(e){if(Jt.length){const t=[...new Set(Jt)].sort((n,s)=>gn(n)-gn(s));if(Jt.length=0,yt){yt.push(...t);return}for(yt=t,Kt=0;Kt<yt.length;Kt++){const n=yt[Kt];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}yt=null,Kt=0}}const gn=e=>e.id==null?e.flags&2?-1:1/0:e.id;function pi(e){try{for(st=0;st<ke.length;st++){const t=ke[st];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),wn(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;st<ke.length;st++){const t=ke[st];t&&(t.flags&=-2)}st=-1,ke.length=0,fi(),Hn=null,(ke.length||Jt.length)&&pi()}}let Ke=null,hi=null;function Kn(e){const t=Ke;return Ke=e,hi=e&&e.type.__scopeId||null,t}function Wl(e,t=Ke,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&yo(-1);const i=Kn(t);let l;try{l=e(...o)}finally{Kn(i),s._d&&yo(1)}return l};return s._n=!0,s._c=!0,s._d=!0,s}function ie(e,t){if(Ke===null)return e;const n=ls(Ke),s=e.dirs||(e.dirs=[]);for(let o=0;o<t.length;o++){let[i,l,r,u=oe]=t[o];i&&(V(i)&&(i={mounted:i,updated:i}),i.deep&&mt(l),s.push({dir:i,instance:n,value:l,oldValue:void 0,arg:r,modifiers:u}))}return e}function Ot(e,t,n,s){const o=e.dirs,i=t&&t.dirs;for(let l=0;l<o.length;l++){const r=o[l];i&&(r.oldValue=i[l].value);let u=r.dir[s];u&&(ct(),Ze(u,n,8,[e.el,r,e,t]),ut())}}function Jl(e,t){if(Te){let n=Te.provides;const s=Te.parent&&Te.parent.provides;s===n&&(n=Te.provides=Object.create(s)),n[e]=t}}function Bn(e,t,n=!1){const s=Wr();if(s||qt){let o=qt?qt._context.provides:s?s.parent==null||s.ce?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides:void 0;if(o&&e in o)return o[e];if(arguments.length>1)return n&&V(t)?t.call(s&&s.proxy):t}}const ql=Symbol.for("v-scx"),Yl=()=>Bn(ql);function hs(e,t,n){return bi(e,t,n)}function bi(e,t,n=oe){const{immediate:s,deep:o,flush:i,once:l}=n,r=Se({},n),u=t&&s||!t&&i!=="post";let m;if(xn){if(i==="sync"){const M=Yl();m=M.__watcherHandles||(M.__watcherHandles=[])}else if(!u){const M=()=>{};return M.stop=rt,M.resume=rt,M.pause=rt,M}}const h=Te;r.call=(M,J,I)=>Ze(M,h,J,I);let y=!1;i==="post"?r.scheduler=M=>{Oe(M,h&&h.suspense)}:i!=="sync"&&(y=!0,r.scheduler=(M,J)=>{J?M():Gs(M)}),r.augmentJob=M=>{t&&(M.flags|=4),y&&(M.flags|=2,h&&(M.id=h.uid,M.i=h))};const U=Hl(e,t,r);return xn&&(m?m.push(U):u&&U()),U}function Zl(e,t,n){const s=this.proxy,o=ae(e)?e.includes(".")?mi(s,e):()=>s[e]:e.bind(s,s);let i;V(t)?i=t:(i=t.handler,n=t);const l=Sn(this),r=bi(o,i.bind(s),n);return l(),r}function mi(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o<n.length&&s;o++)s=s[n[o]];return s}}const Xl=Symbol("_vte"),Ql=e=>e.__isTeleport,bs=Symbol("_leaveCb");function Ws(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Ws(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function gi(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function co(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}const zn=new WeakMap;function dn(e,t,n,s,o=!1){if(B(e)){e.forEach((I,z)=>dn(I,t&&(B(t)?t[z]:t),n,s,o));return}if(fn(s)&&!o){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&dn(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?ls(s.component):s.el,l=o?null:i,{i:r,r:u}=e,m=t&&t.r,h=r.refs===oe?r.refs={}:r.refs,y=r.setupState,U=Q(y),M=y===oe?Bo:I=>co(h,I)?!1:ee(U,I),J=(I,z)=>!(z&&co(h,z));if(m!=null&&m!==u){if(uo(t),ae(m))h[m]=null,M(m)&&(y[m]=null);else if(we(m)){const I=t;J(m,I.k)&&(m.value=null),I.k&&(h[I.k]=null)}}if(V(u)){ct();try{wn(u,r,12,[l,h])}finally{ut()}}else{const I=ae(u),z=we(u);if(I||z){const Y=()=>{if(e.
Line truncated
|
||||
* @vue/runtime-dom v3.5.39
|
||||
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
||||
* @license MIT
|
||||
**/let Ms;const So=typeof window<"u"&&window.trustedTypes;if(So)try{Ms=So.createPolicy("vue",{createHTML:e=>e})}catch{}const Hi=Ms?e=>Ms.createHTML(e):e=>e,ea="http://www.w3.org/2000/svg",ta="http://www.w3.org/1998/Math/MathML",pt=typeof document<"u"?document:null,Ao=pt&&pt.createElement("template"),na={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const o=t==="svg"?pt.createElementNS(ea,e):t==="mathml"?pt.createElementNS(ta,e):n?pt.createElement(e,{is:n}):pt.createElement(e);return e==="select"&&s&&s.multiple!=null&&o.setAttribute("multiple",s.multiple),o},createText:e=>pt.createTextNode(e),createComment:e=>pt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>pt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,o,i){const l=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===i||!(o=o.nextSibling)););else{Ao.innerHTML=Hi(s==="svg"?`<svg>${e}</svg>`:s==="mathml"?`<math>${e}</math>`:e);const r=Ao.content;if(s==="svg"||s==="mathml"){const u=r.firstChild;for(;u.firstChild;)r.appendChild(u.firstChild);r.removeChild(u)}t.insertBefore(r,n)}return[l?l.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},sa=Symbol("_vtc");function oa(e,t,n){const s=e[sa];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const qn=Symbol("_vod"),Ki=Symbol("_vsh"),nn={name:"show",beforeMount(e,{value:t},{transition:n}){e[qn]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):sn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),sn(e,!0),s.enter(e)):s.leave(e,()=>{sn(e,!1)}):sn(e,t))},beforeUnmount(e,{value:t}){sn(e,t)}};function sn(e,t){e.style.display=t?e[qn]:"none",e[Ki]=!t}const ia=Symbol(""),la=/(?:^|;)\s*display\s*:/;function ra(e,t,n){const s=e.style,o=ae(n);let i=!1;if(n&&!o){if(t)if(ae(t))for(const l of t.split(";")){const r=l.slice(0,l.indexOf(":")).trim();n[r]==null&&rn(s,r,"")}else for(const l in t)n[l]==null&&rn(s,l,"");for(const l in n){l==="display"&&(i=!0);const r=n[l];r!=null?ca(e,l,!ae(t)&&t?t[l]:void 0,r)||rn(s,l,r):rn(s,l,"")}}else if(o){if(t!==n){const l=s[ia];l&&(n+=";"+l),s.cssText=n,i=la.test(n)}}else t&&e.removeAttribute("style");qn in e&&(e[qn]=i?s.display:"",e[Ki]&&(s.display="none"))}const Co=/\s*!important$/;function rn(e,t,n){if(B(n))n.forEach(s=>rn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=aa(e,t);Co.test(n)?e.setProperty(At(s),n.replace(Co,""),"important"):e[s]=n}}const Eo=["Webkit","Moz","ms"],vs={};function aa(e,t){const n=vs[t];if(n)return n;let s=Je(t);if(s!=="filter"&&s in e)return vs[t]=s;s=Ho(s);for(let o=0;o<Eo.length;o++){const i=Eo[o]+s;if(i in e)return vs[t]=i}return t}function ca(e,t,n,s){return e.tagName==="TEXTAREA"&&(t==="width"||t==="height")&&ae(s)&&n===s}const ko="http://www.w3.org/1999/xlink";function To(e,t,n,s,o,i=hl(t)){s&&t.startsWith("xlink:")?n==null?e.removeAttributeNS(ko,t.slice(6,t.length)):e.setAttributeNS(ko,t,n):n==null||i&&!zo(n)?e.removeAttribute(t):e.setAttribute(t,i?"":at(n)?String(n):n)}function Po(e,t,n,s,o){if(t==="innerHTML"||t==="textContent"){n!=null&&(e[t]=t==="innerHTML"?Hi(n):n);return}const i=e.tagName;if(t==="value"&&i!=="PROGRESS"&&!i.includes("-")){const r=i==="OPTION"?e.getAttribute("value")||"":e.value,u=n==null?e.type==="checkbox"?"on":"":String(n);(r!==u||!("_value"in e))&&(e.value=u),n==null&&e.removeAttribute(t),e._value=n;return}let l=!1;if(n===""||n==null){const r=typeof e[t];r==="boolean"?n=zo(n):n==null&&r==="string"?(n="",l=!0):r==="number"&&(n=0,l=!0)}try{e[t]=n}catch{}l&&e.removeAttribute(o||t)}function gt(e,t,n,s){e.addEventListener(t,n,s)}function ua(e,t,n,s){e.removeEventListener(t,n,s)}const Oo=Symbol("_vei");function da(e,t,n,s,o=null){const i=e[Oo]||(e[Oo]={}),l=i[t];if(s&&l)l.value=s;else{const[r,u]=ha(t);if(s){const m=i[t]=ga(s,o);gt(e,r,m,u)}else l&&(ua(e,r,l,u),i[t]=void 0)}}const fa=/(Once|Passive|Capture)$/,pa=/^on:?(?:Once|Passive|Capture)$/;function ha(e){let t,n;for(;(n=e.match(fa))&&!pa.test(e);)t||(t={}),e=e.slice(0,e.length-n[1].length),t[n[1].toLowerCase()]=!0;return[e[2]===":"?e.slice(3):At(e.slice(2)),t]}let xs=0;const ba=Promise.resolve(),ma=()=>xs||(ba.then(()=>xs=0),xs=Date.now());function ga(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;const o=n.value;if(B(o)){const i=s.stopImmediatePropagation;s.stopImmediatePropagation=()=>{i.call(s),s._stopped=!0};const l=o.slice(),r=[s];for(let u=0;u<l.length&&!s._stopped;u++){const m=l[u];m&&Ze(m,t,5,r)}}else Ze(o,t,5,[s])};return n.value=e,n.attached=ma(),n}const Uo=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,va=(e,t,n,s,o
Line truncated
|
||||
+2
-2
@@ -6,8 +6,8 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="theme-color" content="#0F1E3D" />
|
||||
<title>PilotVault · API Server</title>
|
||||
<script type="module" crossorigin src="/assets/index-B8Dqe_UO.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-CVh8EDzq.css">
|
||||
<script type="module" crossorigin src="/assets/index-Dh-j3HLZ.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-4CKxSIBg.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
|
||||
@@ -536,11 +536,17 @@ func (s *Server) handleOpenSkyHealth(w http.ResponseWriter, r *http.Request) {
|
||||
"status": "down", "detail": "OpenSky is disabled for your organization"}})
|
||||
return
|
||||
}
|
||||
// A ?bbox= override lets the Settings "Test connection" probe a specific area
|
||||
// (to check its credit cost) without changing the saved default.
|
||||
bbox := res.eff.Bbox
|
||||
if q := strings.TrimSpace(r.URL.Query().Get("bbox")); q != "" && validBBox(q) {
|
||||
bbox = q
|
||||
}
|
||||
cfg := map[string]string{
|
||||
"clientId": res.eff.ClientID,
|
||||
"clientSecret": res.eff.ClientSecret,
|
||||
"plan": res.eff.Plan,
|
||||
"bbox": res.eff.Bbox,
|
||||
"bbox": bbox,
|
||||
"allowAnonymous": boolStr(res.allowAnon),
|
||||
}
|
||||
h, err := s.plugins.HealthCheckWith(r.Context(), openSkyPlugin, cfg)
|
||||
|
||||
@@ -93,9 +93,41 @@ func (s *Server) handleDeletePlugin(w http.ResponseWriter, r *http.Request) {
|
||||
writeJSON(w, http.StatusOK, map[string]any{"ok": true})
|
||||
}
|
||||
|
||||
// POST /api/admin/plugins/{name}/health — run a health check now.
|
||||
// POST /api/admin/plugins/{name}/health — run a health check now. An optional
|
||||
// ?bbox= overrides the plugin's stored bounding box for this probe only (used by
|
||||
// the panel to test-probe OpenSky over a smaller, cheaper area without changing
|
||||
// the saved default). Ignored by plugins that don't use a bbox.
|
||||
func (s *Server) handlePluginHealth(w http.ResponseWriter, r *http.Request) {
|
||||
h, err := s.plugins.HealthCheck(r.Context(), r.PathValue("name"))
|
||||
name := r.PathValue("name")
|
||||
|
||||
if bbox := strings.TrimSpace(r.URL.Query().Get("bbox")); bbox != "" {
|
||||
if !validBBox(bbox) {
|
||||
writeError(w, http.StatusBadRequest, "invalid bbox")
|
||||
return
|
||||
}
|
||||
cfg, _, ok := s.plugins.RawConfig(name)
|
||||
if !ok {
|
||||
writeError(w, http.StatusNotFound, "unknown plugin")
|
||||
return
|
||||
}
|
||||
if cfg == nil {
|
||||
cfg = map[string]string{}
|
||||
}
|
||||
cfg["bbox"] = bbox
|
||||
h, err := s.plugins.HealthCheckWith(r.Context(), name, cfg)
|
||||
if err != nil {
|
||||
if plugins.IsUnknown(err) {
|
||||
writeError(w, http.StatusNotFound, "unknown plugin")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusBadGateway, map[string]any{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, map[string]any{"health": h})
|
||||
return
|
||||
}
|
||||
|
||||
h, err := s.plugins.HealthCheck(r.Context(), name)
|
||||
if err != nil {
|
||||
if plugins.IsUnknown(err) {
|
||||
writeError(w, http.StatusNotFound, "unknown plugin")
|
||||
|
||||
@@ -217,6 +217,41 @@ function setBboxSelect(key, v) {
|
||||
bboxCustom.value = { ...bboxCustom.value, [key]: false };
|
||||
editConfig.value[key] = v;
|
||||
}
|
||||
|
||||
// ---- Probe bounding box (Check-only override) ----------------------------
|
||||
// A plugin can be test-probed over a specific area without touching its saved
|
||||
// config, so OpenSky's credit cost (which scales with box size) can be checked
|
||||
// cheaply. State is per plugin name; empty value = "saved default" (no override).
|
||||
const probeBbox = ref({}); // name -> bbox string ("" = saved default)
|
||||
const probeBboxCustom = ref({}); // name -> in "Custom…" mode
|
||||
function pluginHasBbox(p) {
|
||||
return !!(p.configFields && p.configFields.some((f) => f.type === "bbox"));
|
||||
}
|
||||
function probeBboxSelectValue(name) {
|
||||
if (probeBboxCustom.value[name]) return "__custom__";
|
||||
const v = probeBbox.value[name];
|
||||
if (!v) return "__default__";
|
||||
const norm = normBbox(v);
|
||||
const match = norm && BBOX_FLAT.find((o) => normBbox(o.value) === norm);
|
||||
return match ? match.value : "__custom__";
|
||||
}
|
||||
function setProbeBbox(name, v) {
|
||||
if (v === "__default__") {
|
||||
probeBboxCustom.value = { ...probeBboxCustom.value, [name]: false };
|
||||
probeBbox.value = { ...probeBbox.value, [name]: "" };
|
||||
return;
|
||||
}
|
||||
if (v === "__custom__") {
|
||||
probeBboxCustom.value = { ...probeBboxCustom.value, [name]: true };
|
||||
return;
|
||||
}
|
||||
probeBboxCustom.value = { ...probeBboxCustom.value, [name]: false };
|
||||
probeBbox.value = { ...probeBbox.value, [name]: v };
|
||||
}
|
||||
function setProbeBboxCustom(name, v) {
|
||||
probeBbox.value = { ...probeBbox.value, [name]: v };
|
||||
}
|
||||
|
||||
const newExt = ref({ name: "", baseURL: "", provider: "" });
|
||||
const newExtErr = ref("");
|
||||
const newExtBusy = ref(false);
|
||||
@@ -348,7 +383,10 @@ async function checkPlugin(p) {
|
||||
busyPlugin.value = p.name;
|
||||
pluginsMsg.value = "";
|
||||
try {
|
||||
const r = await fetch(`/api/admin/plugins/${encodeURIComponent(p.name)}/health`, {
|
||||
// A probe area (if chosen) overrides the saved bbox for this check only.
|
||||
const area = (probeBbox.value[p.name] || "").trim();
|
||||
const qs = area ? `?bbox=${encodeURIComponent(area)}` : "";
|
||||
const r = await fetch(`/api/admin/plugins/${encodeURIComponent(p.name)}/health${qs}`, {
|
||||
method: "POST",
|
||||
headers: authHeaders(),
|
||||
});
|
||||
@@ -1303,6 +1341,27 @@ const deviceApi = [
|
||||
{{ p.enabled ? "Enabled" : "Disabled" }}
|
||||
</button>
|
||||
<button v-if="p.configFields && p.configFields.length" class="pv-btn-sec pv-btn-sm" @click="startPluginEdit(p)">Configure</button>
|
||||
<template v-if="pluginHasBbox(p)">
|
||||
<select
|
||||
:value="probeBboxSelectValue(p.name)"
|
||||
class="pv-input pv-input-sm max-w-[11rem]"
|
||||
title="Bounding box used for this Check — smaller areas cost fewer OpenSky credits"
|
||||
@change="setProbeBbox(p.name, $event.target.value)"
|
||||
>
|
||||
<option value="__default__">Probe: saved default</option>
|
||||
<optgroup v-for="g in BBOX_GROUPS" :key="g.label" :label="g.label">
|
||||
<option v-for="o in g.options" :key="o.value" :value="o.value">{{ o.label }}</option>
|
||||
</optgroup>
|
||||
<option value="__custom__">Custom…</option>
|
||||
</select>
|
||||
<input
|
||||
v-if="probeBboxSelectValue(p.name) === '__custom__'"
|
||||
:value="probeBbox[p.name] || ''"
|
||||
class="pv-input pv-input-sm w-40 font-mono"
|
||||
placeholder="lamin,lomin,lamax,lomax"
|
||||
@input="setProbeBboxCustom(p.name, $event.target.value)"
|
||||
/>
|
||||
</template>
|
||||
<button class="pv-btn-sec pv-btn-sm" :disabled="busyPlugin === p.name" @click="checkPlugin(p)">Check</button>
|
||||
<button v-if="p.kind === 'external'" class="pv-btn-sec pv-btn-sm !text-danger" :disabled="busyPlugin === p.name" @click="removePlugin(p)">Remove</button>
|
||||
</div>
|
||||
|
||||
@@ -210,6 +210,15 @@ h1, h2, h3 {
|
||||
border-radius: var(--radius-sm);
|
||||
}
|
||||
|
||||
/* Compact input to sit inline with pv-btn-sm (auto width, not full-width) */
|
||||
@utility pv-input-sm {
|
||||
width: auto;
|
||||
height: 32px;
|
||||
padding: 0 8px;
|
||||
font-size: 0.75rem;
|
||||
border-radius: var(--radius-sm);
|
||||
}
|
||||
|
||||
/* Primary button */
|
||||
@utility pv-btn {
|
||||
display: inline-flex;
|
||||
|
||||
Reference in new issue
Block a user