Files
tcad-bodeplot/static/build/app.js
T

4 lines
172 KiB
JavaScript
Raw Normal View History

2026-05-26 15:34:24 +08:00
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function e(e){let t=Object.create(null);for(let n of e.split(`,`))t[n]=1;return e=>e in t}var t={},n=[],r=()=>{},i=()=>!1,a=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),o=e=>e.startsWith(`onUpdate:`),s=Object.assign,c=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},l=Object.prototype.hasOwnProperty,u=(e,t)=>l.call(e,t),d=Array.isArray,f=e=>x(e)===`[object Map]`,p=e=>x(e)===`[object Set]`,m=e=>x(e)===`[object Date]`,h=e=>typeof e==`function`,g=e=>typeof e==`string`,_=e=>typeof e==`symbol`,v=e=>typeof e==`object`&&!!e,y=e=>(v(e)||h(e))&&h(e.then)&&h(e.catch),b=Object.prototype.toString,x=e=>b.call(e),S=e=>x(e).slice(8,-1),C=e=>x(e)===`[object Object]`,w=e=>g(e)&&e!==`NaN`&&e[0]!==`-`&&``+parseInt(e,10)===e,ee=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),te=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ne=/-\w/g,T=te(e=>e.replace(ne,e=>e.slice(1).toUpperCase())),re=/\B([A-Z])/g,E=te(e=>e.replace(re,`-$1`).toLowerCase()),ie=te(e=>e.charAt(0).toUpperCase()+e.slice(1)),ae=te(e=>e?`on${ie(e)}`:``),D=(e,t)=>!Object.is(e,t),oe=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},O=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},se=e=>{let t=parseFloat(e);return isNaN(t)?e:t},ce,le=()=>ce||=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{};function ue(e){if(d(e)){let t={};for(let n=0;n<e.length;n++){let r=e[n],i=g(r)?me(r):ue(r);if(i)for(let e in i)t[e]=i[e]}return t}else if(g(e)||v(e))return e}var de=/;(?![^(]*\))/g,fe=/:([^]+)/,pe=/\/\*[^]*?\*\//g;function me(e){let t={};return e.replace(pe,``).split(de).forEach(e=>{if(e){let n=e.split(fe);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function k(e){let t=``;if(g(e))t=e;else if(d(e))for(let n=0;n<e.length;n++){let r=k(e[n]);r&&(t+=r+` `)}else if(v(e))for(let n in e)e[n]&&(t+=n+` `);return t.trim()}var he=`itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`,ge=e(he);he+``;function _e(e){return!!e||e===``}function ve(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=ye(e[r],t[r]);return n}function ye(e,t){if(e===t)return!0;let n=m(e),r=m(t);if(n||r)return n&&r?e.getTime()===t.getTime():!1;if(n=_(e),r=_(t),n||r)return e===t;if(n=d(e),r=d(t),n||r)return n&&r?ve(e,t):!1;if(n=v(e),r=v(t),n||r){if(!n||!r||Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e){let r=e.hasOwnProperty(n),i=t.hasOwnProperty(n);if(r&&!i||!r&&i||!ye(e[n],t[n]))return!1}}return String(e)===String(t)}function be(e,t){return e.findIndex(e=>ye(e,t))}var xe=e=>!!(e&&e.__v_isRef===!0),A=e=>g(e)?e:e==null?``:d(e)||v(e)&&(e.toString===b||!h(e.toString))?xe(e)?A(e.value):JSON.stringify(e,Se,2):String(e),Se=(e,t)=>xe(t)?Se(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[Ce(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>Ce(e))}:_(t)?Ce(t):v(t)&&!d(t)&&!C(t)?String(t):t,Ce=(e,t=``)=>_(e)?`Symbol(${e.description??t})`:e,j,we=class{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&j&&(j.active?(this.parent=j,this.index=(j.scopes||=[]).push(this)-1):(this._active=!1,this._w
`||n===`\r`)&&!a?(n===`\r`&&o===`
2026-05-26 15:34:24 +08:00
`&&t++,s()):i+=n}if(a)throw Error(`CSV 引號未正確結束`);return s(),{rows:n,totalRows:o}},resetCsvState(){this.csvFile=null,this.csvFileId=null,this.csvColumns=[],this.csvPreview=[],this.csvInfo=null,this.csvParseError=null,this.csvUploading=!1,this.isCsvPreviewExpanded=!0,this.selectedColumn=0,this.filterDone=!1,this.timePlotData=null,this.zoomStartIdx=null,this.zoomEndIdx=null,this.timePlotUnit=null,this.timePlotMultiplier=null},handleFileUpload(e){let t=e.target.files[0];if(this.resetCsvState(),!t)return;if(!(t.name||``).toLowerCase().endsWith(`.csv`)){this.csvParseError=`請選擇 .csv 檔案`,e.target.value=``;return}if(t.size>314572800){this.csvParseError=`CSV 檔案不可超過 300MB`,e.target.value=``;return}let n=Math.min(t.size,1024*1024),r=new FileReader;r.onload=async r=>{try{let e=String(r.target.result||``).replace(/^\uFEFF/,``),{rows:i,totalRows:a}=this.parseCsvText(e,6);if(a<2||i.length<2)throw Error(`CSV 需包含標題列與至少一筆資料`);let o=i[0].map((e,t)=>e.trim()||`Column ${t+1}`);if(o.length===0)throw Error(`CSV 標題列不可為空`);if(this.csvFile=t,this.csvColumns=o,this.csvPreview=i.slice(1,6).map(e=>{let t=e.slice(0,o.length);for(;t.length<o.length;)t.push(``);return t.map(e=>e.trim())}),this.csvInfo={rows:Math.max(a-1,0),rowsLabel:t.size>n?`預覽 ${Math.max(i.length-1,0)}+`:`${Math.max(a-1,0)}`,columns:o.length,size:t.size},this.selectedColumn=0,o.length>1){let e=o[0].toLowerCase();[`time`,`t`,`sec`,`x`,`index`,`unnamed`].some(t=>e.includes(t))&&(this.selectedColumn=1)}this.csvUploading=!0;let s=new FormData;s.append(`file`,t);let c=await fetch(`/api/csv/upload`,{method:`POST`,body:s});if(!c.ok){let e=await c.text(),t=e||`背景上傳失敗`;try{t=JSON.parse(e).detail||t}catch{}throw Error(t)}let l=await c.json();this.csvFileId=l.file_id}catch(t){this.csvParseError=t.message||`CSV 解析失敗`,this.csvColumns=[],this.csvPreview=[],this.csvInfo=null,this.csvFileId=null,e.target.value=``}finally{this.csvUploading=!1}},r.onerror=()=>{this.csvParseError=`CSV 讀取失敗`,this.csvUploading=!1,e.target.value=``},r.readAsText(t.slice(0,n))},debouncedProcessFilter(){!this.filterDone||!this.csvFileId||(this._filterTimeout&&clearTimeout(this._filterTimeout),this._filterTimeout=setTimeout(()=>{this.processFilter()},500))},async processFilter(){if(this.csvUploading){this.globalError=`CSV 還在上傳中請稍候...`;return}if(!this.csvFileId){this.csvFile&&(this.globalError=`檔案還在上傳中請稍候...`);return}this.zoomStartIdx===null&&this.zoomEndIdx===null&&(this.timePlotUnit=null,this.timePlotMultiplier=null),this.loadingFilter=!0,this.globalError=null;let e=new FormData;e.append(`file_id`,this.csvFileId),e.append(`b`,this.b_str),e.append(`a`,this.a_str),e.append(`col_idx`,this.selectedColumn),e.append(`b_int`,this.b_int_str),e.append(`a_int`,this.a_int_str),e.append(`shift_in`,this.shiftBitsIn),e.append(`shift_out`,this.shiftBitsOut),e.append(`shift_b`,this.shiftBitsB),e.append(`shift_a`,this.shiftBitsA),e.append(`use_round`,this.useRound),e.append(`stages`,JSON.stringify(this.getCascadeFilterPayload())),this.zoomStartIdx!==null&&this.zoomEndIdx!==null&&(e.append(`start_idx`,this.zoomStartIdx),e.append(`end_idx`,this.zoomEndIdx));try{let t=await fetch(`/api/filter`,{method:`POST`,body:e});if(!t.ok){let e=await t.json();throw Error(e.detail||`濾波處理失敗`)}let n=await t.json();this.timePlotData=n,this.filterDone=!0,this.isCsvPreviewExpanded=!1,this.$nextTick(()=>{this.drawTimePlot(n)})}catch(e){this.globalError=e.message}finally{this.loadingFilter=!1}},drawTimePlot(e){let t=this.isDarkMode,n=window.innerWidth<768,r=t?`rgba(200,206,224,0.14)`:`rgba(86,96,117,0.09)`,i=t?`rgba(200,206,224,0.24)`:`rgba(82,86,99,0.20)`,a=t?`#b4b4bd`:`#525663`,o=t?`#090a0d`:`#ffffff`;if(!this.timePlotUnit){let t=(e.total_points||(e.index.length>0?Math.max(...e.index):0))/this.fs;t>0&&t<.001?(this.timePlotMultiplier=1e6,this.timePlotUnit=`μs`):t>0&&t<1?(this.timePlotMultiplier=1e3,this.timePlotUnit=`ms`):(this.timePlotMultiplier=1,this.timePlotUnit=`s`)}let s=this.timePlotMultiplier||
`))}finally{n.releaseLock()}this.mcuStatus=`已送出 ${e}`}catch(e){this.globalError=e.message,this.mcuStatus=`寫入失敗: ${e.message}`}finally{this.writingMCU=!1}}}},So=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},Co={id:`app`,class:`flex flex-col h-screen overflow-hidden`},wo={class:`bg-white dark:bg-dark border-b border-slate-200 dark:border-gray-800 p-4 shadow-md flex justify-between items-center z-10`},To={class:`flex items-center gap-4`},Eo={key:0,class:`w-5 h-5 role-theme-icon`,fill:`currentColor`,viewBox:`0 0 20 20`},Do={key:1,class:`w-5 h-5 text-slate-800`,fill:`currentColor`,viewBox:`0 0 20 20`},Oo={class:`lg:hidden flex border-b border-slate-200 dark:border-gray-800 bg-white dark:bg-dark z-10 flex-shrink-0`},ko={key:0,class:`w-2 h-2 rounded-full role-dot-primary animate-ping`},Ao={class:`flex flex-col lg:flex-row flex-1 overflow-hidden`},jo={class:`text-sm font-semibold text-slate-600 dark:text-gray-400 uppercase tracking-wider mb-3 flex items-center justify-between`},Mo={class:`flex items-center gap-2`},No=[`disabled`],Po={class:`mb-3 space-y-2`},Fo={key:0,class:`flex items-center gap-2`},Io={key:1,class:`text-xs text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 rounded-lg px-3 py-2`},Lo={key:2,class:`text-xs text-slate-600 dark:text-gray-400`},Ro={class:`mb-3 p-3 rounded-lg border border-slate-200 dark:border-gray-800 bg-slate-50 dark:bg-gray-900/50 space-y-2`},zo={class:`flex items-center justify-between gap-2`},Bo={class:`flex flex-wrap gap-2`},Vo=[`onClick`],Ho={class:`flex items-center gap-2 text-xs text-slate-600 dark:text-gray-400`},Uo=[`disabled`],Wo=[`value`],Go={key:0,class:`space-y-3 bg-slate-100 dark:bg-gray-900 p-4 rounded-lg border border-slate-200 dark:border-gray-800 shadow-inner`},Ko={key:0},qo={class:`text-sm text-slate-600 dark:text-gray-400 flex justify-between mb-1`},Jo={class:`role-text-primary`},Yo=[`max`],Xo={class:`selector-button-group flex gap-2`},Zo=[`onClick`],Qo={key:1},$o={class:`text-sm text-slate-600 dark:text-gray-400 flex justify-between mb-1`},es={class:`role-text-primary`},ts={class:`text-sm text-slate-600 dark:text-gray-400 flex justify-between mb-1`},ns={class:`role-text-primary`},rs={class:`selector-button-group flex gap-2`},is=[`onClick`],as={key:2,class:`space-y-3`},os={key:3,class:`space-y-3`},ss={key:4,class:`space-y-3`},cs={key:5,class:`space-y-3`},ls={key:6,class:`space-y-3`},us={class:`text-sm font-medium text-slate-600 dark:text-gray-400 mb-1 block`},ds=[`onUpdate:modelValue`],fs={key:7,class:`space-y-3`},ps={class:`space-y-3`},ms={class:`text-sm text-slate-600 dark:text-gray-400 flex justify-between mb-1`},hs={class:`role-text-primary`},gs={class:`text-sm text-slate-600 dark:text-gray-400 flex justify-between mb-1`},_s={class:`role-text-primary`},vs={class:`coeff-section`},ys={class:`text-sm font-semibold text-slate-600 dark:text-gray-400 uppercase tracking-wider mb-3 flex justify-between items-center`},bs={class:`flex items-center gap-2`},xs={class:`mb-3`},Ss={class:`flex flex-wrap gap-1 mb-2`},Cs={class:`text-[9px] text-white dark:text-gray-900 font-bold`},ws={class:`text-[10px] font-mono text-white dark:text-gray-900 font-bold`},Ts=[`open`],Es={class:`px-3 pb-3`},Ds={class:`selector-button-group flex items-center gap-2 mb-2 mt-1`},Os=[`onClick`],ks={key:0},As={class:`text-xs text-slate-500 dark:text-gray-500 flex justify-between mt-1`},js={key:0,class:`role-text-warning font-bold animate-pulse`},Ms=[`onUpdate:modelValue`,`min`,`max`,`step`],Ns={class:`mb-3`},Ps={class:`flex flex-wrap gap-1 mb-2`},Fs={class:`text-[9px] text-white dark:text-gray-900 font-bold`},Is={class:`text-[10px] font-mono text-white dark:text-gray-900 font-bold`},Ls=[`open`],Rs={class:`px-3 pb-3`},zs={class:`selector-button-group flex items-center gap-2 mb-2 mt-1`},Bs=[`onClick`],Vs={key:0},Hs={class:`text-xs text-slate-500 dark:text-gray-500 flex justify-between mt-1`},Us={key:0,class:`role-text-warning font-bold animate-pulse`},Ws=[`onUpdate:modelValue`,`min`,`max`,`step`],Gs=[`open`],Ks={class:`px-3