Wake-on-LAN frontend

This commit is contained in:
aceberg 2025-09-05 02:40:00 +07:00
parent 6781adb430
commit dee79fc74f
5 changed files with 12 additions and 5 deletions

View file

@ -1,6 +1,13 @@
# Change Log
All notable changes to this project will be documented in this file.
## [v2.1.4] - 2025-09
### Added
- Wake-on-LAN [#135](https://github.com/aceberg/WatchYourLAN/issues/135), [#196](https://github.com/aceberg/WatchYourLAN/issues/196)
### Fixed
- Names not fully saved while editing with GUI
## [v2.1.3] - 2025-07-26
### Fixed
- Memory leak bug [#149](https://github.com/aceberg/WatchYourLAN/issues/149)

View file

@ -1,7 +1,7 @@
{
"name": "watchyourlan",
"private": true,
"version": "2.1.3",
"version": "2.1.4",
"type": "module",
"scripts": {
"dev": "vite",

View file

@ -1 +1 @@
import{t as u,i as l,j as I,b as p,s as O,u as K,v as L,w as it,h as N,c as _,e as y,F as nt,x as rt,o as z,k as at,y as st,z as dt,A as ct}from"./index.js";import{M as ot}from"./MacHistory.js";var $t=u('<div class="card border-primary"><div class=card-header>Host</div><div class="card-body table-responsive"><table class="table table-striped table-hover"><tbody><tr><td>ID</td><td></td></tr><tr><td>Name</td><td><input type=text class=form-control></td></tr><tr><td>DNS name</td><td></td></tr><tr><td>Iface</td><td></td></tr><tr><td>IP</td><td><a target=_blank></a></td></tr><tr><td>MAC</td><td></td></tr><tr><td>Hardware</td><td></td></tr><tr><td>Date</td><td></td></tr><tr><td>Known</td><td><div class="form-check form-switch"><input class=form-check-input type=checkbox></div></td></tr><tr><td>Online</td><td></td></tr></tbody></table><button type=button class="btn btn-outline-danger">Delete host'),ut=u('<i class="bi bi-check-circle-fill"style=color:var(--bs-success);>'),bt=u('<i class="bi bi-circle-fill"style=color:var(--bs-gray-500);>');function ht(t){let e="";const i=async o=>{e=o,await K(t.host.ID,e,""),L()},n=async()=>{e==""&&(e=t.host.Name),await K(t.host.ID,e,"toggle"),L()},a=async()=>{await it(t.host.ID),window.location.href="/"};return(()=>{var o=$t(),f=o.firstChild,m=f.nextSibling,b=m.firstChild,v=b.firstChild,$=v.firstChild,P=$.firstChild,s=P.nextSibling,d=$.nextSibling,g=d.firstChild,c=g.nextSibling,S=c.firstChild,x=d.nextSibling,k=x.firstChild,w=k.nextSibling,r=x.nextSibling,h=r.firstChild,H=h.nextSibling,C=r.nextSibling,B=C.firstChild,G=B.nextSibling,M=G.firstChild,A=C.nextSibling,R=A.firstChild,q=R.nextSibling,E=A.nextSibling,J=E.firstChild,Q=J.nextSibling,F=E.nextSibling,U=F.firstChild,V=U.nextSibling,T=F.nextSibling,W=T.firstChild,X=W.nextSibling,Y=X.firstChild,j=Y.firstChild,Z=T.nextSibling,tt=Z.firstChild,et=tt.nextSibling,lt=b.nextSibling;return l(s,()=>t.host.ID),S.$$input=D=>i(D.target.value),l(w,()=>t.host.DNS),l(H,()=>t.host.Iface),l(M,()=>t.host.IP),l(q,()=>t.host.Mac),l(Q,()=>t.host.Hw),l(V,()=>t.host.Date),j.$$click=n,l(et,(()=>{var D=I(()=>t.host.Now==1);return()=>D()?ut():bt()})()),lt.$$click=a,p(()=>O(M,"href","http://"+t.host.IP)),p(()=>S.value=t.host.Name),p(()=>j.checked=t.host.Known==1),o})()}N(["input","click"]);var ft=u('<div class="card border-primary"><div class=card-header>Port Scan</div><div class=card-body><form class=input-group><input type=text class=form-control placeholder=1><input type=text class=form-control placeholder=65535><button type=button class="btn btn-primary">Scan</button></form><div class=mt-2>'),gt=u('<div class="d-flex justify-content-between mt-2"><button type=button class="btn btn-warning">Stop/Continue</button><div>Scanning port: '),_t=u("<a class=me-4 target=_blank>");function mt(t){let e=!1;const[i,n]=_(""),[a,o]=_(""),[f,m]=_(""),[b,v]=_([]),$=async()=>{e=!1;let s=Number(i());(Number.isNaN(s)||s<1||s>65535)&&(s=1);let d=Number(a());(Number.isNaN(d)||d<1||d>65535)&&(d=65535);let g;for(let c=s;c<=d&&!e;c++)m(c.toString()),g=await rt(t.IP,c),g&&v([...b(),c])},P=()=>{e?(n(f()),$()):e=!0};return(()=>{var s=ft(),d=s.firstChild,g=d.nextSibling,c=g.firstChild,S=c.firstChild,x=S.nextSibling,k=x.nextSibling,w=c.nextSibling;return S.$$input=r=>n(r.target.value),x.$$input=r=>o(r.target.value),k.$$click=$,l(g,(()=>{var r=I(()=>f()!="");return()=>r()?(()=>{var h=gt(),H=h.firstChild,C=H.nextSibling;return C.firstChild,H.$$click=P,l(C,f,null),h})():[]})(),w),l(w,y(nt,{get each(){return b()},children:r=>(()=>{var h=_t();return l(h,r),p(()=>O(h,"href","http://"+t.IP+":"+r)),h})()})),s})()}N(["input","click"]);var vt=u('<div class="card border-primary"><div class=card-header><div class=input-group style=width:fit-content;><span class=input-group-text>Host History for</span><input type=date class=form-control></div></div><div class=card-body>');function St(t){const[e,i]=_("");z(()=>{at(15e3),i(new Date().toLocaleDateString("en-CA"))});const n=a=>{i(""),i(a)};return(()=>{var a=vt(),o=a.firstChild,f=o.firstChild,m=f.firstChild,b=m.nextSibling,v=o.nextSibling;return b.$$input=$=>n($.currentTarget.value),l(v,(()=>{var $=I(()=>t.mac!==""&&e()!=="");return()=>$()?y(ot,{get mac(){return t.mac},get date(){return e()}}):"Loading..."})()),p(()=>b.value=e()),a})()}N(["input"]);var xt=u("<div class=row><div class=col-md></div><div class=col-md>"),Ct=u('<div class="row mt-4"><div class=col-md>');function wt(){const[t,e]=_(st);return z(async()=>{const i=dt(),n=await ct(i.id);e(n)}),[(()=>{var i=xt(),n=i.firstChild,a=n.nextSibling;return l(n,y(ht,{get host(){return t()}})),l(a,y(mt,{get IP(){return t().IP}})),i})(),(()=>{var i=Ct(),n=i.firstChild;return l(n,y(St,{get mac(){return t().Mac}})),i})()]}export{wt as default};
import{u as at,t as o,i as e,j as I,b as C,s as K,v as j,w as B,x as st,y as dt,h as N,c as m,e as p,F as ct,z as ot,o as z,k as $t,A as ut,B as bt,C as ht}from"./index.js";import{M as ft}from"./MacHistory.js";var gt=o('<div class="card border-primary"><div class=card-header>Host</div><div class="card-body table-responsive"><table class="table table-striped table-hover"><tbody><tr><td>ID</td><td></td></tr><tr><td>Name</td><td><input type=text class=form-control></td></tr><tr><td>DNS name</td><td></td></tr><tr><td>Iface</td><td></td></tr><tr><td>IP</td><td><a target=_blank></a></td></tr><tr><td>MAC</td><td></td></tr><tr><td>Hardware</td><td></td></tr><tr><td>Date</td><td></td></tr><tr><td>Known</td><td><div class="form-check form-switch"><input class=form-check-input type=checkbox></div></td></tr><tr><td>Online</td><td></td></tr></tbody></table><button type=button class="btn btn-outline-danger">Delete host'),_t=o('<i class="bi bi-check-circle-fill"style=color:var(--bs-success);>'),mt=o('<i class="bi bi-circle-fill"style=color:var(--bs-gray-500);>'),vt=o('<button type=button class="btn btn-outline-success">Wake-on-LAN');function St(t){let l="";const i=at(r=>{j(t.host.ID,r,""),B()},300),n=async r=>{l=r,i(r)},d=async()=>{l==""&&(l=t.host.Name),await j(t.host.ID,l,"toggle"),B()},_=async()=>{await dt(t.host.ID),window.location.href="/"},h=async()=>{await st(t.host.Mac)};return(()=>{var r=gt(),f=r.firstChild,v=f.nextSibling,$=v.firstChild,P=$.firstChild,a=P.firstChild,u=a.firstChild,g=u.nextSibling,s=a.nextSibling,y=s.firstChild,w=y.nextSibling,k=w.firstChild,S=s.nextSibling,c=S.firstChild,b=c.nextSibling,x=S.nextSibling,H=x.firstChild,G=H.nextSibling,M=x.nextSibling,R=M.firstChild,q=R.nextSibling,A=q.firstChild,L=M.nextSibling,J=L.firstChild,Q=J.nextSibling,E=L.nextSibling,U=E.firstChild,V=U.nextSibling,O=E.nextSibling,X=O.firstChild,Y=X.nextSibling,F=O.nextSibling,Z=F.firstChild,tt=Z.nextSibling,et=tt.firstChild,T=et.firstChild,lt=F.nextSibling,it=lt.firstChild,nt=it.nextSibling,rt=$.nextSibling;return e(g,()=>t.host.ID),k.$$input=D=>n(D.target.value),e(b,()=>t.host.DNS),e(G,()=>t.host.Iface),e(A,()=>t.host.IP),e(Q,()=>t.host.Mac),e(V,()=>t.host.Hw),e(Y,()=>t.host.Date),T.$$click=d,e(nt,(()=>{var D=I(()=>t.host.Now==1);return()=>D()?_t():[mt(),"   ",(()=>{var W=vt();return W.$$click=h,W})()]})()),rt.$$click=_,C(()=>K(A,"href","http://"+t.host.IP)),C(()=>k.value=t.host.Name),C(()=>T.checked=t.host.Known==1),r})()}N(["input","click"]);var xt=o('<div class="card border-primary"><div class=card-header>Port Scan</div><div class=card-body><form class=input-group><input type=text class=form-control placeholder=1><input type=text class=form-control placeholder=65535><button type=button class="btn btn-primary">Scan</button></form><div class=mt-2>'),Ct=o('<div class="d-flex justify-content-between mt-2"><button type=button class="btn btn-warning">Stop/Continue</button><div>Scanning port: '),pt=o("<a class=me-4 target=_blank>");function yt(t){let l=!1;const[i,n]=m(""),[d,_]=m(""),[h,r]=m(""),[f,v]=m([]),$=async()=>{l=!1;let a=Number(i());(Number.isNaN(a)||a<1||a>65535)&&(a=1);let u=Number(d());(Number.isNaN(u)||u<1||u>65535)&&(u=65535);let g;for(let s=a;s<=u&&!l;s++)r(s.toString()),g=await ot(t.IP,s),g&&v([...f(),s])},P=()=>{l?(n(h()),$()):l=!0};return(()=>{var a=xt(),u=a.firstChild,g=u.nextSibling,s=g.firstChild,y=s.firstChild,w=y.nextSibling,k=w.nextSibling,S=s.nextSibling;return y.$$input=c=>n(c.target.value),w.$$input=c=>_(c.target.value),k.$$click=$,e(g,(()=>{var c=I(()=>h()!="");return()=>c()?(()=>{var b=Ct(),x=b.firstChild,H=x.nextSibling;return H.firstChild,x.$$click=P,e(H,h,null),b})():[]})(),S),e(S,p(ct,{get each(){return f()},children:c=>(()=>{var b=pt();return e(b,c),C(()=>K(b,"href","http://"+t.IP+":"+c)),b})()})),a})()}N(["input","click"]);var wt=o('<div class="card border-primary"><div class=card-header><div class=input-group style=width:fit-content;><span class=input-group-text>Host History for</span><input type=date class=form-control></div></div><div class=card-body>');function kt(t){const[l,i]=m("");z(()=>{$t(15e3),i(new Date().toLocaleDateString("en-CA"))});const n=d=>{i(""),i(d)};return(()=>{var d=wt(),_=d.firstChild,h=_.firstChild,r=h.firstChild,f=r.nextSibling,v=_.nextSibling;return f.$$input=$=>n($.currentTarget.value),e(v,(()=>{var $=I(()=>t.mac!==""&&l()!=="");return()=>$()?p(ft,{get mac(){return t.mac},get date(){return l()}}):"Loading..."})()),C(()=>f.value=l()),d})()}N(["input"]);var Ht=o("<div class=row><div class=col-md></div><div class=col-md>"),Pt=o('<div class="row mt-4"><div class=col-md>');function Nt(){const[t,l]=m(ut);return z(async()=>{const i=bt(),n=await ht(i.id);l(n)}),[(()=>{var i=Ht(),n=i.firstChild,d=n.nextSibling;return e(n,p(St,{get host(){return t()}})),e(d,p(yt,{get IP(){return t().IP}})),i})(),(()=>{var i=Pt(),n=i.firstChild;return e(n,p(kt,{get mac(){return t().Mac}})),i})()]}export{Nt as default};

View file

@ -1,4 +1,4 @@
import{B as y,C as f,D as v,o as m,E as H,e as u,S as d,t as D,b as I,s as b,G as h,l as M,F as g}from"./index.js";async function w(a,r){let e=[];return r===""?e=await y(a):e=await f(a,r),e!=null?(e.sort((s,t)=>s.Date<t.Date?1:-1),e):[]}var x=D("<i>");function F(a){const[r,e]=v([]);let s;return m(async()=>{const t=await w(a.mac,a.date);e(t),s=setInterval(async()=>{const o=await w(a.mac,a.date);e(o)},6e4)}),H(()=>{clearInterval(s)}),u(g,{each:r,children:(t,o)=>u(d,{get when(){return o()<M()},get children(){var i=x();return I(n=>{var c="Date:"+t.Date+`
import{D as y,E as f,G as v,o as m,H,e as u,S as I,t as d,b as D,s as b,I as h,l as M,F as g}from"./index.js";async function w(a,r){let e=[];return r===""?e=await y(a):e=await f(a,r),e!=null?(e.sort((s,t)=>s.Date<t.Date?1:-1),e):[]}var x=d("<i>");function G(a){const[r,e]=v([]);let s;return m(async()=>{const t=await w(a.mac,a.date);e(t),s=setInterval(async()=>{const o=await w(a.mac,a.date);e(o)},6e4)}),H(()=>{clearInterval(s)}),u(g,{each:r,children:(t,o)=>u(I,{get when(){return o()<M()},get children(){var i=x();return D(n=>{var c="Date:"+t.Date+`
Iface:`+t.Iface+`
IP:`+t.IP+`
Known:`+t.Known,l=t.Now===0?"my-box-off":"my-box-on";return c!==n.e&&b(i,"title",n.e=c),l!==n.t&&h(i,n.t=l),n},{e:void 0,t:void 0}),i}})})}export{F as M};
Known:`+t.Known,l=t.Now===0?"my-box-off":"my-box-on";return c!==n.e&&b(i,"title",n.e=c),l!==n.t&&h(i,n.t=l),n},{e:void 0,t:void 0}),i}})})}export{G as M};

File diff suppressed because one or more lines are too long