123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931 |
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta http-equiv="X-UA-Compatible" content="ie=edge">
- <title>EdgeVPN</title>
- <meta name="description" content="Edgevpn dashboard">
- <meta name="keywords" content="edgevpn,dashboard">
- <script src="/js/apexcharts.min.js"></script>
- <script src="/js/alpine-magic-helpers.min.js" defer></script>
- <script src="/js/alpine.min.js" defer></script>
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css" integrity="sha512-Kc323vGBEqzTmouAECnVceyQqyqdsSiqLQISBL29aUW4U/M7pSPA/gEUZQqv1cwx4OnYxTxve5UMg5GT6L4JJg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
- <style>
- .bg-black-alt {
- background:#191919;
- }
- .text-black-alt {
- color:#191919;
- }
- .border-black-alt {
- border-color: #191919;
- }
- .string { color: green; }
- .number { color: darkorange; }
- .boolean { color: blue; }
- .null { color: magenta; }
- .key { color: red; }
-
- #checkbox:checked + label .switch-ball{
- background-color: white;
- transform: translateX(24px);
- transition: transform 0.3s linear;
- }
- </style>
- <script src="/js/tailwind.min.js"></script>
- <script>
- tailwind.config = {
- darkMode: 'class',
- theme: {
- extend: {
- colors: {
- clifford: '#da373d',
- }
- }
- }
- }
- </script>
- </head>
- <body class="font-sans leading-normal tracking-normal"
- x-data="{page: location.hash, 'darkMode': false }"
- @hashchange.window="page = location.hash"
- x-init="
- darkMode = JSON.parse(localStorage.getItem('darkMode'));
- $watch('darkMode', value => localStorage.setItem('darkMode', JSON.stringify(value)))"
- x-bind:class="darkMode === true ? 'dark bg-black-alt': 'bg-white'"
- >
- <nav id="header" class="bg-slate-100 dark:bg-gray-900 fixed w-full z-10 top-0 shadow">
-
- <div class="w-full container mx-auto flex flex-wrap items-center mt-0 pt-3 pb-3 md:pb-0">
-
- <div class="w-1/2 pl-2 md:pl-0 align-text-bottom">
- <a class="text-gray-100 text-base xl:text-xl no-underline hover:no-underline font-bold align-top" href="#">
- <img src="/images/logo.png" class="object-scale-down float-left h-7 w-7"> <span class="pl-4 pt-1 md:pb-0 text-md text-slate-700 dark:text-slate-100"> EdgeVPN </span>
- </a>
- </div>
- <div class="w-1/2 pr-0">
- <div class="flex relative inline-block float-right">
- <!-- Dark/Light mode button-->
- <div >
- <div>
- <div class="dark:text-gray-100">
- <div class="flex items-center justify-center space-x-2">
- <span class="text-sm text-gray-800 dark:text-gray-500 p-2">Light</span>
- <label for="toggle"
- class="flex items-center h-5 p-1 duration-300 ease-in-out bg-gray-300 rounded-full cursor-pointer w-9 dark:bg-gray-600">
- <div
- class="w-4 h-4 duration-300 ease-in-out transform bg-white rounded-full shadow-md toggle-dot dark:translate-x-3">
- </div>
- </label>
- <span class="text-sm text-gray-400 dark:text-white p-2">Dark</span>
- <input id="toggle" type="checkbox" class="hidden" :value="darkMode" @change="darkMode = !darkMode" />
- </div>
- </div>
- </div>
- </div>
- <!-- END Dark/Light mode button-->
- <div class="block lg:hidden pr-4">
- <button id="nav-toggle" class="flex items-center px-3 py-2 border rounded text-gray-500 border-gray-600 hover:text-gray-100 hover:border-teal-500 appearance-none focus:outline-none">
- <svg class="fill-current h-3 w-3" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><title>Menu</title><path d="M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z"/></svg>
- </button>
- </div>
- </div>
- </div>
- <div class="w-full flex-grow lg:flex lg:items-center lg:w-auto hidden lg:block mt-2 lg:mt-0 bg-white-300 dark:bg-gray-900 z-20" id="nav-content">
- <ul class="list-reset lg:flex flex-1 items-center px-4 md:px-0">
-
-
- <li class="mr-6 my-2 md:my-0">
- <a href="#"
- x-bind:class="page === '' ? 'text-blue-400 border-blue-400 hover:border-blue-400' : 'text-gray-500 dark:hover:text-gray-100 dark:hover:border-violet-900 hover:text-gray-900 border-sky-100 dark:border-sky-900 hover:border-pink-400'"
- class="block py-1 md:py-3 pl-1 align-middle no-underline border-b-2">
- <i
- x-bind:class="page === '' ? 'text-blue-400' : '' "
- class="fas fa-home fa-fw mr-3"></i><span class="pb-1 md:pb-0 text-sm">Home</span>
- </a>
- </li>
-
-
- <li class="mr-6 my-2 md:my-0">
- <a href="#nodes"
- x-bind:class="page === '#nodes' ? 'text-blue-400 border-blue-400 hover:border-blue-400' : 'text-gray-500 dark:hover:text-gray-100 dark:hover:border-violet-900 hover:text-gray-900 border-sky-100 dark:border-sky-900 hover:border-pink-400'"
- class="block py-1 md:py-3 pl-1 align-middle no-underline border-b-2">
- <i
- x-bind:class="page === '#nodes' ? 'text-blue-400' : '' "
- class="fas fa-server fa-fw mr-3"></i><span class="pb-1 md:pb-0 text-sm">Nodes</span>
- </a>
- </li>
-
-
- <li class="mr-6 my-2 md:my-0">
- <a href="#dns"
- x-bind:class="page === '#dns' ? 'text-blue-400 border-blue-400 hover:border-blue-400' : 'text-gray-500 dark:hover:text-gray-100 dark:hover:border-violet-900 hover:text-gray-900 border-sky-100 dark:border-sky-900 hover:border-pink-400'"
- class="block py-1 md:py-3 pl-1 align-middle no-underline border-b-2">
- <i
- x-bind:class="page === '#dns' ? 'text-blue-400' : '' "
- class="fas fa-globe fa-fw mr-3"></i><span class="pb-1 md:pb-0 text-sm">DNS</span>
- </a>
- </li>
-
-
- <li class="mr-6 my-2 md:my-0">
- <a href="#blockchain"
- x-bind:class="page === '#blockchain' ? 'text-blue-400 border-blue-400 hover:border-blue-400' : 'text-gray-500 dark:hover:text-gray-100 dark:hover:border-violet-900 hover:text-gray-900 border-sky-100 dark:border-sky-900 hover:border-pink-400'"
- class="block py-1 md:py-3 pl-1 align-middle no-underline border-b-2">
- <i
- x-bind:class="page === '#blockchain' ? 'text-blue-400' : '' "
- class="fas fa-dice-d20 fa-fw mr-3"></i><span class="pb-1 md:pb-0 text-sm">Blockchain</span>
- </a>
- </li>
-
-
- <li class="mr-6 my-2 md:my-0">
- <a href="#services"
- x-bind:class="page === '#services' ? 'text-blue-400 border-blue-400 hover:border-blue-400' : 'text-gray-500 dark:hover:text-gray-100 dark:hover:border-violet-900 hover:text-gray-900 border-sky-100 dark:border-sky-900 hover:border-pink-400'"
- class="block py-1 md:py-3 pl-1 align-middle no-underline border-b-2">
- <i
- x-bind:class="page === '#services' ? 'text-blue-400' : '' "
- class="fas fa-ethernet fa-fw mr-3"></i><span class="pb-1 md:pb-0 text-sm">Services</span>
- </a>
- </li>
-
-
- <li class="mr-6 my-2 md:my-0">
- <a href="#peers"
- x-bind:class="page === '#peers' ? 'text-blue-400 border-blue-400 hover:border-blue-400' : 'text-gray-500 dark:hover:text-gray-100 dark:hover:border-violet-900 hover:text-gray-900 border-sky-100 dark:border-sky-900 hover:border-pink-400'"
- class="block py-1 md:py-3 pl-1 align-middle no-underline border-b-2">
- <i
- x-bind:class="page === '#peers' ? 'text-blue-400' : '' "
- class="fas fa-users fa-fw mr-3"></i><span class="pb-1 md:pb-0 text-sm">Peers</span>
- </a>
- </li>
- </ul>
-
- <div class="relative pull-right pl-4 pr-4 md:pr-0">
- </div>
- </div>
- </div>
- </nav>
- <!-- Nodes Container-->
- <div class="container w-full mx-auto pt-20" x-show="page === '#nodes'">
-
-
- <div class="px-4 md:px-0 md:mt-8 mb-20 leading-normal " >
-
- <div class="relative " >
- <a class="mr-2 bg-sky-300 dark:bg-sky-600 text-white p-2 rounded leading-none items-center absolute top-10 right-1 " href="https://mudler.github.io/edgevpn/docs/getting-started/api/#apimachines" target=_blank>
- <i class="fa-solid fa-book fa-fw pr-1"></i> Machines API Documentation
- </a>
- </div>
- </div>
-
-
- <div class="w-full px-4 md:px-0 md:mt-8 mb-16 text-gray-800 leading-normal"
- x-data="machines()"
- x-init="$interval(updateItems, 1500)"
- >
- <!-- Notification toast -->
- <div
- x-show="open"
- class="w-96 p-4 rounded h-32 fixed bottom-4 right-4 transform-gpu transition-transform duration-400 ease"
- x-class="success ? 'bg-green-500' : 'bg-red-500'"
- x-transition:enter-start="opacity-0 translate-y-full"
- x-transition:enter-end="opacity-100 translate-y-0"
- x-transition:leave-start="translate-y-0"
- x-transition:leave="transition transform ease-in duration-300"
- x-transition:leave-end="opacity-0 translate-y-full"
- >
- <div class="bg-white border-gray-300 dark:border-slate-800 dark:bg-slate-900 border p-3 flex items-start shadow-lg rounded-md space-x-2">
- <svg class="flex-shrink-0 h-6 w-6 text-green-400" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1" d="M10.219,1.688c-4.471,0-8.094,3.623-8.094,8.094s3.623,8.094,8.094,8.094s8.094-3.623,8.094-8.094S14.689,1.688,10.219,1.688 M10.219,17.022c-3.994,0-7.242-3.247-7.242-7.241c0-3.994,3.248-7.242,7.242-7.242c3.994,0,7.241,3.248,7.241,7.242C17.46,13.775,14.213,17.022,10.219,17.022 M15.099,7.03c-0.167-0.167-0.438-0.167-0.604,0.002L9.062,12.48l-2.269-2.277c-0.166-0.167-0.437-0.167-0.603,0c-0.166,0.166-0.168,0.437-0.002,0.603l2.573,2.578c0.079,0.08,0.188,0.125,0.3,0.125s0.222-0.045,0.303-0.125l5.736-5.751C15.268,7.466,15.265,7.196,15.099,7.03"></path>
- </svg>
- <div class="flex-1 space-y-1">
- <p class="text-base leading-6 font-medium text-gray-700 dark:text-gray-400" x-text="title"></p>
- <p class="text-sm leading-5 text-gray-600 dark:text-gray-400" x-text="message"></p>
- </div>
- <svg class="flex-shrink-0 h-5 w-5 text-gray-400 cursor-pointer" x-on:click="isShow = false" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1.2" d="M15.898,4.045c-0.271-0.272-0.713-0.272-0.986,0l-4.71,4.711L5.493,4.045c-0.272-0.272-0.714-0.272-0.986,0s-0.272,0.714,0,0.986l4.709,4.711l-4.71,4.711c-0.272,0.271-0.272,0.713,0,0.986c0.136,0.136,0.314,0.203,0.492,0.203c0.179,0,0.357-0.067,0.493-0.203l4.711-4.711l4.71,4.711c0.137,0.136,0.314,0.203,0.494,0.203c0.178,0,0.355-0.067,0.492-0.203c0.273-0.273,0.273-0.715,0-0.986l-4.711-4.711l4.711-4.711C16.172,4.759,16.172,4.317,15.898,4.045z"></path>
- </svg>
- </div>
- </div>
- <div class="w-full mt-12 p-3 dark:bg-gray-900 border dark:border-gray-800 rounded shadow">
- <div class="border-b bg-white-200 dark:bg-gray-900 dark:border-gray-800 p-3">
- <h5 class="font-bold uppercase dark:text-gray-600">Nodes</h5>
- </div>
- <br>
- <div class="relative mt-1 ">
- <div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
- <svg class="w-5 h-5 text-gray-500 dark:text-gray-400" fill="currentColor" viewBox="0 0 20 20"
- xmlns="http://www.w3.org/2000/svg">
- <path fill-rule="evenodd"
- d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
- clip-rule="evenodd"></path>
- </svg>
- </div>
- <input
- x-ref="searchField"
- x-model="search"
- x-on:click="viewPage(0)"
- x-on:keydown.window.prevent.slash=" viewPage(0), $refs.searchField.focus()"
- placeholder="Search..."
- type="search"
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
- />
-
- </div>
- <div class="overflow-auto">
-
- <table class="min-w-full bg-white-200 dark:bg-gray-900">
- <thead class="bg-slate-200 dark:bg-gray-800 dark:text-white">
- <tr>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">Address</th>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">PeerID</th>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">Hostname</th>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">OS</th>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">Architecture</th>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">Version</th>
-
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm"></th>
-
- </tr>
- </thead>
- <tbody class="text-black dark:text-white">
- <template x-for="(d, index) in filtered" :key="index">
- <tr
- x-bind:class="d.Online ? 'bg-lime-100 dark:bg-lime-800' : 'bg-stone-200 dark:bg-stone-800'"
- >
-
- <td x-text="d.Address" class="text-left py-3 px-4"></td>
-
- <td x-text="d.PeerID" class="text-left py-3 px-4"></td>
-
- <td x-text="d.Hostname" class="text-left py-3 px-4"></td>
-
- <td x-text="d.OS" class="text-left py-3 px-4"></td>
-
- <td x-text="d.Arch" class="text-left py-3 px-4"></td>
-
- <td x-text="d.Version" class="text-left py-3 px-4"></td>
-
-
- <!-- Action menu -->
- <td class="text-left py-3 px-4" >
- <button
- class="px-3 py-2 rounded"
- type="button"
- x-on:click="deleteItem(d.Address)"
- >
- <i class="fa-solid fa-trash-can"></i>
- </button>
- </td>
-
- </tr>
- </template>
- </tbody>
- </table>
- <!--Pagination Buttons-->
- <div
- class="w-full md:w-1/2 mx-auto py-6 flex justify-between items-center"
- x-show="pageCount() > 1"
- >
- <!--First Button-->
- <button
- x-on:click="viewPage(0)"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="19 20 9 12 19 4 19 20"></polygon>
- <line x1="5" y1="19" x2="5" y2="5"></line>
- </svg>
- </button>
-
- <!--Previous Button-->
- <button
- x-on:click="prevPage"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="15 18 9 12 15 6"></polyline>
- </svg>
- </button>
-
- <!-- Display page numbers -->
- <template x-for="(page,index) in pages()" :key="page">
- <button
- class="px-3 py-2 rounded"
- :class="{ 'bg-indigo-600 text-white font-bold' : page === pageNumber }"
- type="button"
- x-on:click="viewPage(page)"
- >
- <span x-text="page" class="dark:text-white"></span>
- </button>
- </template>
-
- <!--Next Button-->
- <button
- x-on:click="nextPage"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="9 18 15 12 9 6"></polyline>
- </svg>
- </button>
-
- <!--Last Button-->
- <button
- x-on:click="viewPage(Math.ceil(total/size)-1)"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="5 4 15 12 5 20 5 4"></polygon>
- <line x1="19" y1="5" x2="19" y2="19"></line>
- </svg>
- </button>
- </div>
- <!-- /Pagination Buttons-->
- </div>
- </div>
- </div>
- </div>
- <!--END Node Container-->
- <!-- Blockchain Container-->
- <div class="container w-full mx-auto pt-20" x-show="page === '#blockchain'">
- <div class="w-full px-4 md:px-0 md:mt-8 mb-16 text-gray-800 leading-normal">
- <div class="w-full mt-12 p-3 dark:bg-gray-900 bg-white-100 border dark:border-gray-800 rounded shadow"
- x-data="blockchain()"
- x-init="$interval(updateItems, 5500)"
- >
- <div class="border-b border-gray-800 p-3">
- <h5 class="font-bold uppercase text-gray-600">Blockchain </h5>
- <h5 class="font-bold uppercase text-gray-600">
- <span class="mt-1 text-xs px-2 py-1 font-semibold leading-tight text-slate-700 bg-slate-100 rounded-full dark:bg-slate-700 dark:text-slate-100"><i class="fa-solid fa-hashtag fa-fw mr-3"></i> <span x-text="blockchain.Index"></span> </span>
- <span class="mt-1 text-xs px-2 py-1 font-semibold leading-tight text-slate-700 bg-slate-100 rounded-full dark:bg-slate-700 dark:text-slate-100"><i class="fa-solid fa-clock fa-fw mr-3"></i> <span x-text="blockchain.Timestamp"></span> </span>
- <span class="mt-1 text-xs px-2 py-1 font-semibold leading-tight text-slate-700 bg-slate-100 rounded-full dark:bg-slate-700 dark:text-slate-100"><i class="fa-solid fa-dice-d20 fa-fw mr-3"></i> <span x-text="blockchain.Hash"></span> </span>
- <span class="mt-1 text-xs px-2 py-1 font-semibold leading-tight text-slate-700 bg-slate-100 rounded-full dark:bg-slate-700 dark:text-slate-100"><i class="fa-solid fa-link fa-fw mr-3"></i> <span x-text="blockchain.PrevHash"></span> </span>
- </div>
- <section class="flex justify-center mt-10">
-
- <div class="bg-white-300 py-1 w-11/12 rounded border-b-4 border-red-400 flex dark:text-white">
- <pre class="overflow-auto"><code class="overflow-auto" x-html="syntaxHighlight(JSON.stringify(blockchain, null, 2))"></code></pre>
- </div>
- </section>
- </div>
- </div>
- </div>
- <!--END Blockchain Container-->
- <!-- DNS Container-->
- <div class="container w-full mx-auto pt-20" x-show="page === '#dns'">
-
-
- <div class="px-4 md:px-0 md:mt-8 mb-20 leading-normal " >
-
- <div class="relative " >
- <a class="mr-2 bg-sky-300 dark:bg-sky-600 text-white p-2 rounded leading-none items-center absolute top-10 right-1 " href="https://mudler.github.io/edgevpn/docs/concepts/overview/dns/" target=_blank>
- <i class="fa-solid fa-book fa-fw pr-1"></i> DNS Documentation
- </a>
- </div>
- </div>
-
-
- <div class="w-full px-4 md:px-0 md:mt-8 mb-16 text-gray-800 leading-normal"
- x-data="dns()"
- x-init="$interval(updateItems, 1500)"
- >
- <!-- Notification toast -->
- <div
- x-show="open"
- class="w-96 p-4 rounded h-32 fixed bottom-4 right-4 transform-gpu transition-transform duration-400 ease"
- x-class="success ? 'bg-green-500' : 'bg-red-500'"
- x-transition:enter-start="opacity-0 translate-y-full"
- x-transition:enter-end="opacity-100 translate-y-0"
- x-transition:leave-start="translate-y-0"
- x-transition:leave="transition transform ease-in duration-300"
- x-transition:leave-end="opacity-0 translate-y-full"
- >
- <div class="bg-white border-gray-300 dark:border-slate-800 dark:bg-slate-900 border p-3 flex items-start shadow-lg rounded-md space-x-2">
- <svg class="flex-shrink-0 h-6 w-6 text-green-400" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1" d="M10.219,1.688c-4.471,0-8.094,3.623-8.094,8.094s3.623,8.094,8.094,8.094s8.094-3.623,8.094-8.094S14.689,1.688,10.219,1.688 M10.219,17.022c-3.994,0-7.242-3.247-7.242-7.241c0-3.994,3.248-7.242,7.242-7.242c3.994,0,7.241,3.248,7.241,7.242C17.46,13.775,14.213,17.022,10.219,17.022 M15.099,7.03c-0.167-0.167-0.438-0.167-0.604,0.002L9.062,12.48l-2.269-2.277c-0.166-0.167-0.437-0.167-0.603,0c-0.166,0.166-0.168,0.437-0.002,0.603l2.573,2.578c0.079,0.08,0.188,0.125,0.3,0.125s0.222-0.045,0.303-0.125l5.736-5.751C15.268,7.466,15.265,7.196,15.099,7.03"></path>
- </svg>
- <div class="flex-1 space-y-1">
- <p class="text-base leading-6 font-medium text-gray-700 dark:text-gray-400" x-text="title"></p>
- <p class="text-sm leading-5 text-gray-600 dark:text-gray-400" x-text="message"></p>
- </div>
- <svg class="flex-shrink-0 h-5 w-5 text-gray-400 cursor-pointer" x-on:click="isShow = false" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1.2" d="M15.898,4.045c-0.271-0.272-0.713-0.272-0.986,0l-4.71,4.711L5.493,4.045c-0.272-0.272-0.714-0.272-0.986,0s-0.272,0.714,0,0.986l4.709,4.711l-4.71,4.711c-0.272,0.271-0.272,0.713,0,0.986c0.136,0.136,0.314,0.203,0.492,0.203c0.179,0,0.357-0.067,0.493-0.203l4.711-4.711l4.71,4.711c0.137,0.136,0.314,0.203,0.494,0.203c0.178,0,0.355-0.067,0.492-0.203c0.273-0.273,0.273-0.715,0-0.986l-4.711-4.711l4.711-4.711C16.172,4.759,16.172,4.317,15.898,4.045z"></path>
- </svg>
- </div>
- </div>
- <div class="w-full mt-12 p-3 dark:bg-gray-900 border dark:border-gray-800 rounded shadow">
- <div class="border-b bg-white-200 dark:bg-gray-900 dark:border-gray-800 p-3">
- <h5 class="font-bold uppercase dark:text-gray-600">DNS</h5>
- </div>
- <br>
- <div class="relative mt-1 ">
- <div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
- <svg class="w-5 h-5 text-gray-500 dark:text-gray-400" fill="currentColor" viewBox="0 0 20 20"
- xmlns="http://www.w3.org/2000/svg">
- <path fill-rule="evenodd"
- d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
- clip-rule="evenodd"></path>
- </svg>
- </div>
- <input
- x-ref="searchField"
- x-model="search"
- x-on:click="viewPage(0)"
- x-on:keydown.window.prevent.slash=" viewPage(0), $refs.searchField.focus()"
- placeholder="Search..."
- type="search"
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
- />
-
- </div>
- <div class="overflow-auto">
-
- <table class="min-w-full bg-white-200 dark:bg-gray-900">
- <thead class="bg-slate-200 dark:bg-gray-800 dark:text-white">
- <tr>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">Regex</th>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">Records</th>
-
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm"></th>
-
- </tr>
- </thead>
- <tbody class="text-black dark:text-white">
- <template x-for="(d, index) in filtered" :key="index">
- <tr
-
- >
-
- <td x-text="d.Regex" class="text-left py-3 px-4"></td>
-
- <td x-text="JSON.stringify(d.Records)" class="text-left py-3 px-4"></td>
-
-
- <!-- Action menu -->
- <td class="text-left py-3 px-4" >
- <button
- class="px-3 py-2 rounded"
- type="button"
- x-on:click="deleteItem(d.Regex)"
- >
- <i class="fa-solid fa-trash-can"></i>
- </button>
- </td>
-
- </tr>
- </template>
- </tbody>
- </table>
- <!--Pagination Buttons-->
- <div
- class="w-full md:w-1/2 mx-auto py-6 flex justify-between items-center"
- x-show="pageCount() > 1"
- >
- <!--First Button-->
- <button
- x-on:click="viewPage(0)"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="19 20 9 12 19 4 19 20"></polygon>
- <line x1="5" y1="19" x2="5" y2="5"></line>
- </svg>
- </button>
-
- <!--Previous Button-->
- <button
- x-on:click="prevPage"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="15 18 9 12 15 6"></polyline>
- </svg>
- </button>
-
- <!-- Display page numbers -->
- <template x-for="(page,index) in pages()" :key="page">
- <button
- class="px-3 py-2 rounded"
- :class="{ 'bg-indigo-600 text-white font-bold' : page === pageNumber }"
- type="button"
- x-on:click="viewPage(page)"
- >
- <span x-text="page" class="dark:text-white"></span>
- </button>
- </template>
-
- <!--Next Button-->
- <button
- x-on:click="nextPage"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="9 18 15 12 9 6"></polyline>
- </svg>
- </button>
-
- <!--Last Button-->
- <button
- x-on:click="viewPage(Math.ceil(total/size)-1)"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="5 4 15 12 5 20 5 4"></polygon>
- <line x1="19" y1="5" x2="19" y2="19"></line>
- </svg>
- </button>
- </div>
- <!-- /Pagination Buttons-->
- </div>
- </div>
- </div>
-
- </div>
- <!--END DNS Container-->
- <!-- Services Container-->
- <div class="container w-full mx-auto pt-20" x-show="page === '#services'">
-
-
- <div class="px-4 md:px-0 md:mt-8 mb-20 leading-normal " >
-
- <div class="relative " >
- <a class="mr-2 bg-sky-300 dark:bg-sky-600 text-white p-2 rounded leading-none items-center absolute top-10 right-1 " href="https://mudler.github.io/edgevpn/docs/concepts/overview/services/" target=_blank>
- <i class="fa-solid fa-book fa-fw pr-1"></i> Tunnelling Documentation
- </a>
- </div>
- </div>
-
-
- <div class="w-full px-4 md:px-0 md:mt-8 mb-16 text-gray-800 leading-normal"
- x-data="services()"
- x-init="$interval(updateItems, 1500)"
- >
- <!-- Notification toast -->
- <div
- x-show="open"
- class="w-96 p-4 rounded h-32 fixed bottom-4 right-4 transform-gpu transition-transform duration-400 ease"
- x-class="success ? 'bg-green-500' : 'bg-red-500'"
- x-transition:enter-start="opacity-0 translate-y-full"
- x-transition:enter-end="opacity-100 translate-y-0"
- x-transition:leave-start="translate-y-0"
- x-transition:leave="transition transform ease-in duration-300"
- x-transition:leave-end="opacity-0 translate-y-full"
- >
- <div class="bg-white border-gray-300 dark:border-slate-800 dark:bg-slate-900 border p-3 flex items-start shadow-lg rounded-md space-x-2">
- <svg class="flex-shrink-0 h-6 w-6 text-green-400" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1" d="M10.219,1.688c-4.471,0-8.094,3.623-8.094,8.094s3.623,8.094,8.094,8.094s8.094-3.623,8.094-8.094S14.689,1.688,10.219,1.688 M10.219,17.022c-3.994,0-7.242-3.247-7.242-7.241c0-3.994,3.248-7.242,7.242-7.242c3.994,0,7.241,3.248,7.241,7.242C17.46,13.775,14.213,17.022,10.219,17.022 M15.099,7.03c-0.167-0.167-0.438-0.167-0.604,0.002L9.062,12.48l-2.269-2.277c-0.166-0.167-0.437-0.167-0.603,0c-0.166,0.166-0.168,0.437-0.002,0.603l2.573,2.578c0.079,0.08,0.188,0.125,0.3,0.125s0.222-0.045,0.303-0.125l5.736-5.751C15.268,7.466,15.265,7.196,15.099,7.03"></path>
- </svg>
- <div class="flex-1 space-y-1">
- <p class="text-base leading-6 font-medium text-gray-700 dark:text-gray-400" x-text="title"></p>
- <p class="text-sm leading-5 text-gray-600 dark:text-gray-400" x-text="message"></p>
- </div>
- <svg class="flex-shrink-0 h-5 w-5 text-gray-400 cursor-pointer" x-on:click="isShow = false" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1.2" d="M15.898,4.045c-0.271-0.272-0.713-0.272-0.986,0l-4.71,4.711L5.493,4.045c-0.272-0.272-0.714-0.272-0.986,0s-0.272,0.714,0,0.986l4.709,4.711l-4.71,4.711c-0.272,0.271-0.272,0.713,0,0.986c0.136,0.136,0.314,0.203,0.492,0.203c0.179,0,0.357-0.067,0.493-0.203l4.711-4.711l4.71,4.711c0.137,0.136,0.314,0.203,0.494,0.203c0.178,0,0.355-0.067,0.492-0.203c0.273-0.273,0.273-0.715,0-0.986l-4.711-4.711l4.711-4.711C16.172,4.759,16.172,4.317,15.898,4.045z"></path>
- </svg>
- </div>
- </div>
- <div class="w-full mt-12 p-3 dark:bg-gray-900 border dark:border-gray-800 rounded shadow">
- <div class="border-b bg-white-200 dark:bg-gray-900 dark:border-gray-800 p-3">
- <h5 class="font-bold uppercase dark:text-gray-600">TCP Tunnels</h5>
- </div>
- <br>
- <div class="relative mt-1 ">
- <div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
- <svg class="w-5 h-5 text-gray-500 dark:text-gray-400" fill="currentColor" viewBox="0 0 20 20"
- xmlns="http://www.w3.org/2000/svg">
- <path fill-rule="evenodd"
- d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
- clip-rule="evenodd"></path>
- </svg>
- </div>
- <input
- x-ref="searchField"
- x-model="search"
- x-on:click="viewPage(0)"
- x-on:keydown.window.prevent.slash=" viewPage(0), $refs.searchField.focus()"
- placeholder="Search..."
- type="search"
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
- />
-
- </div>
- <div class="overflow-auto">
-
- <table class="min-w-full bg-white-200 dark:bg-gray-900">
- <thead class="bg-slate-200 dark:bg-gray-800 dark:text-white">
- <tr>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">Name</th>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">PeerID</th>
-
-
- </tr>
- </thead>
- <tbody class="text-black dark:text-white">
- <template x-for="(d, index) in filtered" :key="index">
- <tr
-
- >
-
- <td x-text="d.Name" class="text-left py-3 px-4"></td>
-
- <td x-text="d.PeerID" class="text-left py-3 px-4"></td>
-
-
- </tr>
- </template>
- </tbody>
- </table>
- <!--Pagination Buttons-->
- <div
- class="w-full md:w-1/2 mx-auto py-6 flex justify-between items-center"
- x-show="pageCount() > 1"
- >
- <!--First Button-->
- <button
- x-on:click="viewPage(0)"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="19 20 9 12 19 4 19 20"></polygon>
- <line x1="5" y1="19" x2="5" y2="5"></line>
- </svg>
- </button>
-
- <!--Previous Button-->
- <button
- x-on:click="prevPage"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="15 18 9 12 15 6"></polyline>
- </svg>
- </button>
-
- <!-- Display page numbers -->
- <template x-for="(page,index) in pages()" :key="page">
- <button
- class="px-3 py-2 rounded"
- :class="{ 'bg-indigo-600 text-white font-bold' : page === pageNumber }"
- type="button"
- x-on:click="viewPage(page)"
- >
- <span x-text="page" class="dark:text-white"></span>
- </button>
- </template>
-
- <!--Next Button-->
- <button
- x-on:click="nextPage"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="9 18 15 12 9 6"></polyline>
- </svg>
- </button>
-
- <!--Last Button-->
- <button
- x-on:click="viewPage(Math.ceil(total/size)-1)"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="5 4 15 12 5 20 5 4"></polygon>
- <line x1="19" y1="5" x2="19" y2="19"></line>
- </svg>
- </button>
- </div>
- <!-- /Pagination Buttons-->
- </div>
- </div>
- </div>
-
- <hr class="border-b-2 border-gray-600 my-8 mx-4">
-
-
- <div class="px-4 md:px-0 md:mt-8 mb-20 leading-normal " >
-
- <div class="relative " >
- <a class="mr-2 bg-sky-300 dark:bg-sky-600 text-white p-2 rounded leading-none items-center absolute top-10 right-1 " href="https://mudler.github.io/edgevpn/docs/concepts/overview/files/" target=_blank>
- <i class="fa-solid fa-book fa-fw pr-1"></i> Files Documentation
- </a>
- </div>
- </div>
-
-
- <div class="w-full px-4 md:px-0 md:mt-8 mb-16 text-gray-800 leading-normal"
- x-data="files()"
- x-init="$interval(updateItems, 1500)"
- >
- <!-- Notification toast -->
- <div
- x-show="open"
- class="w-96 p-4 rounded h-32 fixed bottom-4 right-4 transform-gpu transition-transform duration-400 ease"
- x-class="success ? 'bg-green-500' : 'bg-red-500'"
- x-transition:enter-start="opacity-0 translate-y-full"
- x-transition:enter-end="opacity-100 translate-y-0"
- x-transition:leave-start="translate-y-0"
- x-transition:leave="transition transform ease-in duration-300"
- x-transition:leave-end="opacity-0 translate-y-full"
- >
- <div class="bg-white border-gray-300 dark:border-slate-800 dark:bg-slate-900 border p-3 flex items-start shadow-lg rounded-md space-x-2">
- <svg class="flex-shrink-0 h-6 w-6 text-green-400" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1" d="M10.219,1.688c-4.471,0-8.094,3.623-8.094,8.094s3.623,8.094,8.094,8.094s8.094-3.623,8.094-8.094S14.689,1.688,10.219,1.688 M10.219,17.022c-3.994,0-7.242-3.247-7.242-7.241c0-3.994,3.248-7.242,7.242-7.242c3.994,0,7.241,3.248,7.241,7.242C17.46,13.775,14.213,17.022,10.219,17.022 M15.099,7.03c-0.167-0.167-0.438-0.167-0.604,0.002L9.062,12.48l-2.269-2.277c-0.166-0.167-0.437-0.167-0.603,0c-0.166,0.166-0.168,0.437-0.002,0.603l2.573,2.578c0.079,0.08,0.188,0.125,0.3,0.125s0.222-0.045,0.303-0.125l5.736-5.751C15.268,7.466,15.265,7.196,15.099,7.03"></path>
- </svg>
- <div class="flex-1 space-y-1">
- <p class="text-base leading-6 font-medium text-gray-700 dark:text-gray-400" x-text="title"></p>
- <p class="text-sm leading-5 text-gray-600 dark:text-gray-400" x-text="message"></p>
- </div>
- <svg class="flex-shrink-0 h-5 w-5 text-gray-400 cursor-pointer" x-on:click="isShow = false" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1.2" d="M15.898,4.045c-0.271-0.272-0.713-0.272-0.986,0l-4.71,4.711L5.493,4.045c-0.272-0.272-0.714-0.272-0.986,0s-0.272,0.714,0,0.986l4.709,4.711l-4.71,4.711c-0.272,0.271-0.272,0.713,0,0.986c0.136,0.136,0.314,0.203,0.492,0.203c0.179,0,0.357-0.067,0.493-0.203l4.711-4.711l4.71,4.711c0.137,0.136,0.314,0.203,0.494,0.203c0.178,0,0.355-0.067,0.492-0.203c0.273-0.273,0.273-0.715,0-0.986l-4.711-4.711l4.711-4.711C16.172,4.759,16.172,4.317,15.898,4.045z"></path>
- </svg>
- </div>
- </div>
- <div class="w-full mt-12 p-3 dark:bg-gray-900 border dark:border-gray-800 rounded shadow">
- <div class="border-b bg-white-200 dark:bg-gray-900 dark:border-gray-800 p-3">
- <h5 class="font-bold uppercase dark:text-gray-600">Files</h5>
- </div>
- <br>
- <div class="relative mt-1 ">
- <div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
- <svg class="w-5 h-5 text-gray-500 dark:text-gray-400" fill="currentColor" viewBox="0 0 20 20"
- xmlns="http://www.w3.org/2000/svg">
- <path fill-rule="evenodd"
- d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
- clip-rule="evenodd"></path>
- </svg>
- </div>
- <input
- x-ref="searchField"
- x-model="search"
- x-on:click="viewPage(0)"
- x-on:keydown.window.prevent.slash=" viewPage(0), $refs.searchField.focus()"
- placeholder="Search..."
- type="search"
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
- />
-
- </div>
- <div class="overflow-auto">
-
- <table class="min-w-full bg-white-200 dark:bg-gray-900">
- <thead class="bg-slate-200 dark:bg-gray-800 dark:text-white">
- <tr>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">Name</th>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">PeerID</th>
-
-
- </tr>
- </thead>
- <tbody class="text-black dark:text-white">
- <template x-for="(d, index) in filtered" :key="index">
- <tr
-
- >
-
- <td x-text="d.Name" class="text-left py-3 px-4"></td>
-
- <td x-text="d.PeerID" class="text-left py-3 px-4"></td>
-
-
- </tr>
- </template>
- </tbody>
- </table>
- <!--Pagination Buttons-->
- <div
- class="w-full md:w-1/2 mx-auto py-6 flex justify-between items-center"
- x-show="pageCount() > 1"
- >
- <!--First Button-->
- <button
- x-on:click="viewPage(0)"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="19 20 9 12 19 4 19 20"></polygon>
- <line x1="5" y1="19" x2="5" y2="5"></line>
- </svg>
- </button>
-
- <!--Previous Button-->
- <button
- x-on:click="prevPage"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="15 18 9 12 15 6"></polyline>
- </svg>
- </button>
-
- <!-- Display page numbers -->
- <template x-for="(page,index) in pages()" :key="page">
- <button
- class="px-3 py-2 rounded"
- :class="{ 'bg-indigo-600 text-white font-bold' : page === pageNumber }"
- type="button"
- x-on:click="viewPage(page)"
- >
- <span x-text="page" class="dark:text-white"></span>
- </button>
- </template>
-
- <!--Next Button-->
- <button
- x-on:click="nextPage"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="9 18 15 12 9 6"></polyline>
- </svg>
- </button>
-
- <!--Last Button-->
- <button
- x-on:click="viewPage(Math.ceil(total/size)-1)"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="5 4 15 12 5 20 5 4"></polygon>
- <line x1="19" y1="5" x2="19" y2="19"></line>
- </svg>
- </button>
- </div>
- <!-- /Pagination Buttons-->
- </div>
- </div>
- </div>
-
- </div>
- <!--END Services Container-->
- <!-- Peers Container-->
- <div class="container w-full mx-auto pt-20" x-show="page === '#peers'">
-
-
- <div class="w-full px-4 md:px-0 md:mt-8 mb-16 text-gray-800 leading-normal"
- x-data="nodes()"
- x-init="$interval(updateItems, 1500)"
- >
- <!-- Notification toast -->
- <div
- x-show="open"
- class="w-96 p-4 rounded h-32 fixed bottom-4 right-4 transform-gpu transition-transform duration-400 ease"
- x-class="success ? 'bg-green-500' : 'bg-red-500'"
- x-transition:enter-start="opacity-0 translate-y-full"
- x-transition:enter-end="opacity-100 translate-y-0"
- x-transition:leave-start="translate-y-0"
- x-transition:leave="transition transform ease-in duration-300"
- x-transition:leave-end="opacity-0 translate-y-full"
- >
- <div class="bg-white border-gray-300 dark:border-slate-800 dark:bg-slate-900 border p-3 flex items-start shadow-lg rounded-md space-x-2">
- <svg class="flex-shrink-0 h-6 w-6 text-green-400" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1" d="M10.219,1.688c-4.471,0-8.094,3.623-8.094,8.094s3.623,8.094,8.094,8.094s8.094-3.623,8.094-8.094S14.689,1.688,10.219,1.688 M10.219,17.022c-3.994,0-7.242-3.247-7.242-7.241c0-3.994,3.248-7.242,7.242-7.242c3.994,0,7.241,3.248,7.241,7.242C17.46,13.775,14.213,17.022,10.219,17.022 M15.099,7.03c-0.167-0.167-0.438-0.167-0.604,0.002L9.062,12.48l-2.269-2.277c-0.166-0.167-0.437-0.167-0.603,0c-0.166,0.166-0.168,0.437-0.002,0.603l2.573,2.578c0.079,0.08,0.188,0.125,0.3,0.125s0.222-0.045,0.303-0.125l5.736-5.751C15.268,7.466,15.265,7.196,15.099,7.03"></path>
- </svg>
- <div class="flex-1 space-y-1">
- <p class="text-base leading-6 font-medium text-gray-700 dark:text-gray-400" x-text="title"></p>
- <p class="text-sm leading-5 text-gray-600 dark:text-gray-400" x-text="message"></p>
- </div>
- <svg class="flex-shrink-0 h-5 w-5 text-gray-400 cursor-pointer" x-on:click="isShow = false" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1.2" d="M15.898,4.045c-0.271-0.272-0.713-0.272-0.986,0l-4.71,4.711L5.493,4.045c-0.272-0.272-0.714-0.272-0.986,0s-0.272,0.714,0,0.986l4.709,4.711l-4.71,4.711c-0.272,0.271-0.272,0.713,0,0.986c0.136,0.136,0.314,0.203,0.492,0.203c0.179,0,0.357-0.067,0.493-0.203l4.711-4.711l4.71,4.711c0.137,0.136,0.314,0.203,0.494,0.203c0.178,0,0.355-0.067,0.492-0.203c0.273-0.273,0.273-0.715,0-0.986l-4.711-4.711l4.711-4.711C16.172,4.759,16.172,4.317,15.898,4.045z"></path>
- </svg>
- </div>
- </div>
- <div class="w-full mt-12 p-3 dark:bg-gray-900 border dark:border-gray-800 rounded shadow">
- <div class="border-b bg-white-200 dark:bg-gray-900 dark:border-gray-800 p-3">
- <h5 class="font-bold uppercase dark:text-gray-600">Nodes</h5>
- </div>
- <br>
- <div class="relative mt-1 ">
- <div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
- <svg class="w-5 h-5 text-gray-500 dark:text-gray-400" fill="currentColor" viewBox="0 0 20 20"
- xmlns="http://www.w3.org/2000/svg">
- <path fill-rule="evenodd"
- d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
- clip-rule="evenodd"></path>
- </svg>
- </div>
- <input
- x-ref="searchField"
- x-model="search"
- x-on:click="viewPage(0)"
- x-on:keydown.window.prevent.slash=" viewPage(0), $refs.searchField.focus()"
- placeholder="Search..."
- type="search"
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
- />
-
- </div>
- <div class="overflow-auto">
-
- <table class="min-w-full bg-white-200 dark:bg-gray-900">
- <thead class="bg-slate-200 dark:bg-gray-800 dark:text-white">
- <tr>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">PeerID</th>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">Online</th>
-
-
- </tr>
- </thead>
- <tbody class="text-black dark:text-white">
- <template x-for="(d, index) in filtered" :key="index">
- <tr
-
- >
-
- <td x-text="d.ID" class="text-left py-3 px-4"></td>
-
- <td x-text="d.Online" class="text-left py-3 px-4"></td>
-
-
- </tr>
- </template>
- </tbody>
- </table>
- <!--Pagination Buttons-->
- <div
- class="w-full md:w-1/2 mx-auto py-6 flex justify-between items-center"
- x-show="pageCount() > 1"
- >
- <!--First Button-->
- <button
- x-on:click="viewPage(0)"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="19 20 9 12 19 4 19 20"></polygon>
- <line x1="5" y1="19" x2="5" y2="5"></line>
- </svg>
- </button>
-
- <!--Previous Button-->
- <button
- x-on:click="prevPage"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="15 18 9 12 15 6"></polyline>
- </svg>
- </button>
-
- <!-- Display page numbers -->
- <template x-for="(page,index) in pages()" :key="page">
- <button
- class="px-3 py-2 rounded"
- :class="{ 'bg-indigo-600 text-white font-bold' : page === pageNumber }"
- type="button"
- x-on:click="viewPage(page)"
- >
- <span x-text="page" class="dark:text-white"></span>
- </button>
- </template>
-
- <!--Next Button-->
- <button
- x-on:click="nextPage"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="9 18 15 12 9 6"></polyline>
- </svg>
- </button>
-
- <!--Last Button-->
- <button
- x-on:click="viewPage(Math.ceil(total/size)-1)"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="5 4 15 12 5 20 5 4"></polygon>
- <line x1="19" y1="5" x2="19" y2="19"></line>
- </svg>
- </button>
- </div>
- <!-- /Pagination Buttons-->
- </div>
- </div>
- </div>
- <hr class="border-b-2 border-gray-600 my-8 mx-4">
-
-
- <div class="w-full px-4 md:px-0 md:mt-8 mb-16 text-gray-800 leading-normal"
- x-data="peerstore()"
- x-init="$interval(updateItems, 1500)"
- >
- <!-- Notification toast -->
- <div
- x-show="open"
- class="w-96 p-4 rounded h-32 fixed bottom-4 right-4 transform-gpu transition-transform duration-400 ease"
- x-class="success ? 'bg-green-500' : 'bg-red-500'"
- x-transition:enter-start="opacity-0 translate-y-full"
- x-transition:enter-end="opacity-100 translate-y-0"
- x-transition:leave-start="translate-y-0"
- x-transition:leave="transition transform ease-in duration-300"
- x-transition:leave-end="opacity-0 translate-y-full"
- >
- <div class="bg-white border-gray-300 dark:border-slate-800 dark:bg-slate-900 border p-3 flex items-start shadow-lg rounded-md space-x-2">
- <svg class="flex-shrink-0 h-6 w-6 text-green-400" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1" d="M10.219,1.688c-4.471,0-8.094,3.623-8.094,8.094s3.623,8.094,8.094,8.094s8.094-3.623,8.094-8.094S14.689,1.688,10.219,1.688 M10.219,17.022c-3.994,0-7.242-3.247-7.242-7.241c0-3.994,3.248-7.242,7.242-7.242c3.994,0,7.241,3.248,7.241,7.242C17.46,13.775,14.213,17.022,10.219,17.022 M15.099,7.03c-0.167-0.167-0.438-0.167-0.604,0.002L9.062,12.48l-2.269-2.277c-0.166-0.167-0.437-0.167-0.603,0c-0.166,0.166-0.168,0.437-0.002,0.603l2.573,2.578c0.079,0.08,0.188,0.125,0.3,0.125s0.222-0.045,0.303-0.125l5.736-5.751C15.268,7.466,15.265,7.196,15.099,7.03"></path>
- </svg>
- <div class="flex-1 space-y-1">
- <p class="text-base leading-6 font-medium text-gray-700 dark:text-gray-400" x-text="title"></p>
- <p class="text-sm leading-5 text-gray-600 dark:text-gray-400" x-text="message"></p>
- </div>
- <svg class="flex-shrink-0 h-5 w-5 text-gray-400 cursor-pointer" x-on:click="isShow = false" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1.2" d="M15.898,4.045c-0.271-0.272-0.713-0.272-0.986,0l-4.71,4.711L5.493,4.045c-0.272-0.272-0.714-0.272-0.986,0s-0.272,0.714,0,0.986l4.709,4.711l-4.71,4.711c-0.272,0.271-0.272,0.713,0,0.986c0.136,0.136,0.314,0.203,0.492,0.203c0.179,0,0.357-0.067,0.493-0.203l4.711-4.711l4.71,4.711c0.137,0.136,0.314,0.203,0.494,0.203c0.178,0,0.355-0.067,0.492-0.203c0.273-0.273,0.273-0.715,0-0.986l-4.711-4.711l4.711-4.711C16.172,4.759,16.172,4.317,15.898,4.045z"></path>
- </svg>
- </div>
- </div>
- <div class="w-full mt-12 p-3 dark:bg-gray-900 border dark:border-gray-800 rounded shadow">
- <div class="border-b bg-white-200 dark:bg-gray-900 dark:border-gray-800 p-3">
- <h5 class="font-bold uppercase dark:text-gray-600">Peer store</h5>
- </div>
- <br>
- <div class="relative mt-1 ">
- <div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
- <svg class="w-5 h-5 text-gray-500 dark:text-gray-400" fill="currentColor" viewBox="0 0 20 20"
- xmlns="http://www.w3.org/2000/svg">
- <path fill-rule="evenodd"
- d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
- clip-rule="evenodd"></path>
- </svg>
- </div>
- <input
- x-ref="searchField"
- x-model="search"
- x-on:click="viewPage(0)"
- x-on:keydown.window.prevent.slash=" viewPage(0), $refs.searchField.focus()"
- placeholder="Search..."
- type="search"
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
- />
-
- </div>
- <div class="overflow-auto">
-
- <table class="min-w-full bg-white-200 dark:bg-gray-900">
- <thead class="bg-slate-200 dark:bg-gray-800 dark:text-white">
- <tr>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">PeerID</th>
-
-
- </tr>
- </thead>
- <tbody class="text-black dark:text-white">
- <template x-for="(d, index) in filtered" :key="index">
- <tr
-
- >
-
- <td x-text="d.ID" class="text-left py-3 px-4"></td>
-
-
- </tr>
- </template>
- </tbody>
- </table>
- <!--Pagination Buttons-->
- <div
- class="w-full md:w-1/2 mx-auto py-6 flex justify-between items-center"
- x-show="pageCount() > 1"
- >
- <!--First Button-->
- <button
- x-on:click="viewPage(0)"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="19 20 9 12 19 4 19 20"></polygon>
- <line x1="5" y1="19" x2="5" y2="5"></line>
- </svg>
- </button>
-
- <!--Previous Button-->
- <button
- x-on:click="prevPage"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="15 18 9 12 15 6"></polyline>
- </svg>
- </button>
-
- <!-- Display page numbers -->
- <template x-for="(page,index) in pages()" :key="page">
- <button
- class="px-3 py-2 rounded"
- :class="{ 'bg-indigo-600 text-white font-bold' : page === pageNumber }"
- type="button"
- x-on:click="viewPage(page)"
- >
- <span x-text="page" class="dark:text-white"></span>
- </button>
- </template>
-
- <!--Next Button-->
- <button
- x-on:click="nextPage"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="9 18 15 12 9 6"></polyline>
- </svg>
- </button>
-
- <!--Last Button-->
- <button
- x-on:click="viewPage(Math.ceil(total/size)-1)"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="5 4 15 12 5 20 5 4"></polygon>
- <line x1="19" y1="5" x2="19" y2="19"></line>
- </svg>
- </button>
- </div>
- <!-- /Pagination Buttons-->
- </div>
- </div>
- </div>
- </div>
- </div>
- <!--END Peers Container-->
- <!-- Index Container-->
- <div class="container w-full mx-auto pt-20" x-show="page === ''">
-
- <div class="w-full px-4 md:px-0 md:mt-8 mb-16 text-gray-800 leading-normal"
- x-data="summary()"
- x-init="$interval(updateItems, 1500); initChart()"
- >
- <!--Summary Content-->
-
- <div class="flex flex-wrap">
-
-
- <div class="w-full md:w-1/2 xl:w-1/3 p-3">
- <!--Metric Card-->
- <div class="dark:bg-gray-900 bg-white-100 dark:border-gray-800 dark:border-gray-600 border-b-4 rounded shadow p-2">
- <div class="flex flex-row items-center">
- <div class="flex-shrink pr-4">
- <div class="rounded p-3 bg-emerald-600"><i class="fas fa-network-wired fa-2x fa-fw fa-inverse"></i></div>
- </div>
- <div class="flex-1 text-right md:text-center">
- <h5 class="font-bold uppercase text-gray-400">VPN Nodes</h5>
- <h3 class="font-bold text-3xl text-gray-600" x-text="summary.Machines"></h3>
- </div>
- </div>
- </div>
- <!--/Metric Card-->
- </div>
-
-
-
- <div class="w-full md:w-1/2 xl:w-1/3 p-3">
- <!--Metric Card-->
- <div class="dark:bg-gray-900 bg-white-100 dark:border-gray-800 dark:border-gray-600 border-b-4 rounded shadow p-2">
- <div class="flex flex-row items-center">
- <div class="flex-shrink pr-4">
- <div class="rounded p-3 bg-cyan-600"><i class="fa-solid fa-circle-nodes fa-2x fa-fw fa-inverse"></i></div>
- </div>
- <div class="flex-1 text-right md:text-center">
- <h5 class="font-bold uppercase text-gray-400">P2P peers</h5>
- <h3 class="font-bold text-3xl text-gray-600" x-text="summary.Peers"></h3>
- </div>
- </div>
- </div>
- <!--/Metric Card-->
- </div>
-
-
-
- <div class="w-full md:w-1/2 xl:w-1/3 p-3">
- <!--Metric Card-->
- <div class="dark:bg-gray-900 bg-white-100 dark:border-gray-800 dark:border-gray-600 border-b-4 rounded shadow p-2">
- <div class="flex flex-row items-center">
- <div class="flex-shrink pr-4">
- <div class="rounded p-3 bg-yellow-600"><i class="fa-solid fa-box-archive fa-2x fa-fw fa-inverse"></i></div>
- </div>
- <div class="flex-1 text-right md:text-center">
- <h5 class="font-bold uppercase text-gray-400">Files</h5>
- <h3 class="font-bold text-3xl text-gray-600" x-text="summary.Files"></h3>
- </div>
- </div>
- </div>
- <!--/Metric Card-->
- </div>
-
-
-
- <div class="w-full md:w-1/2 xl:w-1/3 p-3">
- <!--Metric Card-->
- <div class="dark:bg-gray-900 bg-white-100 dark:border-gray-800 dark:border-gray-600 border-b-4 rounded shadow p-2">
- <div class="flex flex-row items-center">
- <div class="flex-shrink pr-4">
- <div class="rounded p-3 bg-pink-600"><i class="fas fa-users fa-2x fa-fw fa-inverse"></i></div>
- </div>
- <div class="flex-1 text-right md:text-center">
- <h5 class="font-bold uppercase text-gray-400">Users</h5>
- <h3 class="font-bold text-3xl text-gray-600" x-text="summary.Users"></h3>
- </div>
- </div>
- </div>
- <!--/Metric Card-->
- </div>
-
-
-
- <div class="w-full md:w-1/2 xl:w-1/3 p-3">
- <!--Metric Card-->
- <div class="dark:bg-gray-900 bg-white-100 dark:border-gray-800 dark:border-gray-600 border-b-4 rounded shadow p-2">
- <div class="flex flex-row items-center">
- <div class="flex-shrink pr-4">
- <div class="rounded p-3 bg-indigo-600"><i class="fas fa-dice-d20 fa-2x fa-fw fa-inverse"></i></div>
- </div>
- <div class="flex-1 text-right md:text-center">
- <h5 class="font-bold uppercase text-gray-400">Blockchain index</h5>
- <h3 class="font-bold text-3xl text-gray-600" x-text="summary.BlockChain"></h3>
- </div>
- </div>
- </div>
- <!--/Metric Card-->
- </div>
-
-
-
- <div class="w-full md:w-1/2 xl:w-1/3 p-3">
- <!--Metric Card-->
- <div class="dark:bg-gray-900 bg-white-100 dark:border-gray-800 dark:border-gray-600 border-b-4 rounded shadow p-2">
- <div class="flex flex-row items-center">
- <div class="flex-shrink pr-4">
- <div class="rounded p-3 bg-sky-600"><i class="fa-solid fa-car-tunnel fa-2x fa-fw fa-inverse"></i></div>
- </div>
- <div class="flex-1 text-right md:text-center">
- <h5 class="font-bold uppercase text-gray-400">Services</h5>
- <h3 class="font-bold text-3xl text-gray-600" x-text="summary.Services"></h3>
- </div>
- </div>
- </div>
- <!--/Metric Card-->
- </div>
-
-
- <div class="w-full md:w-1/2 xl:w-1/3 p-3">
- <!--Metric Card-->
- <div class="dark:bg-gray-900 bg-white-100 dark:border-gray-800 dark:border-gray-600 border-b-4 rounded shadow p-2">
- <div class="flex flex-row items-center">
- <div class="flex-shrink pr-4">
- <div class="rounded p-3 bg-cyan-600"><i class="fas fa-download fa-2x fa-fw fa-inverse"></i></div>
- </div>
- <div class="flex-1 text-right md:text-center">
- <h5 class="font-bold uppercase text-gray-400">Total downloaded</h5>
- <h3 class="font-bold text-3xl text-gray-600" x-text="bytesToSize(metrics.TotalIn)"></h3>
- </div>
- </div>
- </div>
- <!--/Metric Card-->
- </div>
-
- <div class="w-full md:w-1/2 xl:w-1/3 p-3 text-gray-800 ">
- <div class="dark:bg-gray-900 rounded shadow dark:border-gray-600 border-b-4 ">
- <div class="bg-white-200 dark:bg-gray-900 p-3">
- <h5 class="font-bold float-left uppercase text-gray-400">
- <span class="rounded p-1 bg-teal-600"><i class="fa-duotone fa-right-left fa-fw fa-inverse"></i></span>
- Bandwidth
- </h5>
- <h5 class="font-bold uppercase float-right text-gray-600">
- <span class="rounded p-1 bg-cyan-600"><i class="fas fa-arrow-down fa-fw fa-inverse"></i></span>
- <span x-text="bytesToSize(metrics.RateIn)"></span>
- <span class="rounded p-1 bg-amber-600"><i class="fas fa-arrow-up fa-fw fa-inverse"></i></span>
- <span x-text="bytesToSize(metrics.RateOut)"></span>
- </h5>
- </div>
- <br>
- <div class=" relative mt-1 ">
- <!-- Network stat Card-->
- <div class="dark:bg-gray-900 bg-white-100 rounded shadow p-2">
- <div class="flex flex-row items-center">
- <div class="flex-1 text-right md:text-center">
- <div x-ref="chart"></div>
- </div>
- </div>
- </div>
- <!--/Network stat Card-->
- </div>
- </div>
- </div>
-
-
- <div class="w-full md:w-1/2 xl:w-1/3 p-3">
- <!--Metric Card-->
- <div class="dark:bg-gray-900 bg-white-100 dark:border-gray-800 dark:border-gray-600 border-b-4 rounded shadow p-2">
- <div class="flex flex-row items-center">
- <div class="flex-shrink pr-4">
- <div class="rounded p-3 bg-amber-600"><i class="fas fa-upload fa-2x fa-fw fa-inverse"></i></div>
- </div>
- <div class="flex-1 text-right md:text-center">
- <h5 class="font-bold uppercase text-gray-400">Total uploaded</h5>
- <h3 class="font-bold text-3xl text-gray-600" x-text="bytesToSize(metrics.TotalOut)"></h3>
- </div>
- </div>
- </div>
- <!--/Metric Card-->
- </div>
-
- <!--Divider-->
- <hr class="border-b-2 border-gray-600 my-8 mx-4">
-
-
- <div class="w-full px-4 md:px-0 md:mt-8 mb-16 text-gray-800 leading-normal"
- x-data="users()"
- x-init="$interval(updateItems, 1500)"
- >
- <!-- Notification toast -->
- <div
- x-show="open"
- class="w-96 p-4 rounded h-32 fixed bottom-4 right-4 transform-gpu transition-transform duration-400 ease"
- x-class="success ? 'bg-green-500' : 'bg-red-500'"
- x-transition:enter-start="opacity-0 translate-y-full"
- x-transition:enter-end="opacity-100 translate-y-0"
- x-transition:leave-start="translate-y-0"
- x-transition:leave="transition transform ease-in duration-300"
- x-transition:leave-end="opacity-0 translate-y-full"
- >
- <div class="bg-white border-gray-300 dark:border-slate-800 dark:bg-slate-900 border p-3 flex items-start shadow-lg rounded-md space-x-2">
- <svg class="flex-shrink-0 h-6 w-6 text-green-400" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1" d="M10.219,1.688c-4.471,0-8.094,3.623-8.094,8.094s3.623,8.094,8.094,8.094s8.094-3.623,8.094-8.094S14.689,1.688,10.219,1.688 M10.219,17.022c-3.994,0-7.242-3.247-7.242-7.241c0-3.994,3.248-7.242,7.242-7.242c3.994,0,7.241,3.248,7.241,7.242C17.46,13.775,14.213,17.022,10.219,17.022 M15.099,7.03c-0.167-0.167-0.438-0.167-0.604,0.002L9.062,12.48l-2.269-2.277c-0.166-0.167-0.437-0.167-0.603,0c-0.166,0.166-0.168,0.437-0.002,0.603l2.573,2.578c0.079,0.08,0.188,0.125,0.3,0.125s0.222-0.045,0.303-0.125l5.736-5.751C15.268,7.466,15.265,7.196,15.099,7.03"></path>
- </svg>
- <div class="flex-1 space-y-1">
- <p class="text-base leading-6 font-medium text-gray-700 dark:text-gray-400" x-text="title"></p>
- <p class="text-sm leading-5 text-gray-600 dark:text-gray-400" x-text="message"></p>
- </div>
- <svg class="flex-shrink-0 h-5 w-5 text-gray-400 cursor-pointer" x-on:click="isShow = false" stroke="currentColor" viewBox="0 0 20 20">
- <path stroke-width="1.2" d="M15.898,4.045c-0.271-0.272-0.713-0.272-0.986,0l-4.71,4.711L5.493,4.045c-0.272-0.272-0.714-0.272-0.986,0s-0.272,0.714,0,0.986l4.709,4.711l-4.71,4.711c-0.272,0.271-0.272,0.713,0,0.986c0.136,0.136,0.314,0.203,0.492,0.203c0.179,0,0.357-0.067,0.493-0.203l4.711-4.711l4.71,4.711c0.137,0.136,0.314,0.203,0.494,0.203c0.178,0,0.355-0.067,0.492-0.203c0.273-0.273,0.273-0.715,0-0.986l-4.711-4.711l4.711-4.711C16.172,4.759,16.172,4.317,15.898,4.045z"></path>
- </svg>
- </div>
- </div>
- <div class="w-full mt-12 p-3 dark:bg-gray-900 border dark:border-gray-800 rounded shadow">
- <div class="border-b bg-white-200 dark:bg-gray-900 dark:border-gray-800 p-3">
- <h5 class="font-bold uppercase dark:text-gray-600">Connected users</h5>
- </div>
- <br>
- <div class="relative mt-1 ">
- <div class="absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none">
- <svg class="w-5 h-5 text-gray-500 dark:text-gray-400" fill="currentColor" viewBox="0 0 20 20"
- xmlns="http://www.w3.org/2000/svg">
- <path fill-rule="evenodd"
- d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
- clip-rule="evenodd"></path>
- </svg>
- </div>
- <input
- x-ref="searchField"
- x-model="search"
- x-on:click="viewPage(0)"
- x-on:keydown.window.prevent.slash=" viewPage(0), $refs.searchField.focus()"
- placeholder="Search..."
- type="search"
- class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full pl-10 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
- />
-
- </div>
- <div class="overflow-auto">
-
- <table class="min-w-full bg-white-200 dark:bg-gray-900">
- <thead class="bg-slate-200 dark:bg-gray-800 dark:text-white">
- <tr>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">PeerID</th>
-
- <th class="w-1/3 text-left py-3 px-4 uppercase font-semibold text-sm">Time</th>
-
-
- </tr>
- </thead>
- <tbody class="text-black dark:text-white">
- <template x-for="(d, index) in filtered" :key="index">
- <tr
-
- >
-
- <td x-text="d.PeerID" class="text-left py-3 px-4"></td>
-
- <td x-text="d.Timestamp" class="text-left py-3 px-4"></td>
-
-
- </tr>
- </template>
- </tbody>
- </table>
- <!--Pagination Buttons-->
- <div
- class="w-full md:w-1/2 mx-auto py-6 flex justify-between items-center"
- x-show="pageCount() > 1"
- >
- <!--First Button-->
- <button
- x-on:click="viewPage(0)"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="19 20 9 12 19 4 19 20"></polygon>
- <line x1="5" y1="19" x2="5" y2="5"></line>
- </svg>
- </button>
-
- <!--Previous Button-->
- <button
- x-on:click="prevPage"
- :disabled="pageNumber==0"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber==0 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="15 18 9 12 15 6"></polyline>
- </svg>
- </button>
-
- <!-- Display page numbers -->
- <template x-for="(page,index) in pages()" :key="page">
- <button
- class="px-3 py-2 rounded"
- :class="{ 'bg-indigo-600 text-white font-bold' : page === pageNumber }"
- type="button"
- x-on:click="viewPage(page)"
- >
- <span x-text="page" class="dark:text-white"></span>
- </button>
- </template>
-
- <!--Next Button-->
- <button
- x-on:click="nextPage"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polyline points="9 18 15 12 9 6"></polyline>
- </svg>
- </button>
-
- <!--Last Button-->
- <button
- x-on:click="viewPage(Math.ceil(total/size)-1)"
- :disabled="pageNumber >= pageCount() -1"
- :class="{ 'disabled cursor-not-allowed text-gray-600' : pageNumber >= pageCount() -1 }"
- >
- <svg
- class="h-8 w-8 text-indigo-600"
- width="24"
- height="24"
- viewBox="0 0 24 24"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"
- >
- <polygon points="5 4 15 12 5 20 5 4"></polygon>
- <line x1="19" y1="5" x2="19" y2="19"></line>
- </svg>
- </button>
- </div>
- <!-- /Pagination Buttons-->
- </div>
- </div>
- </div>
-
-
- <!--/ Summary Content-->
-
- </div>
- </div>
- <!--END Index /container-->
-
- <footer class="dark:bg-gray-900 border-t dark:border-gray-400 shadow">
- <div class="container max-w-md mx-auto flex py-8">
- <div class="w-full mx-auto flex flex-wrap">
- <div class="flex w-full md:w-1/2 ">
- <div class="px-8">
- <h3 class="font-bold font-bold dark:text-gray-100">About</h3>
- <p class="py-4 text-gray-600 text-sm">
- <strong>EdgeVPN</strong> by <a href="https://github.com/mudler/edgevpn">Ettore Di Giacinto</a>.<br>
- License <a href="https://github.com/mudler/edgevpn/blob/master/LICENSE">Apache v2</a>. <br>
- Logo originally made by <a href="https://www.flaticon.com/authors/uniconlabs" title="Uniconlabs">Uniconlabs</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a>
- </p>
- </div>
- </div>
-
- <div class="flex w-full md:w-1/2">
- <div class="px-8">
- <h3 class="font-bold font-bold dark:text-gray-100">Links</h3>
- <ul class="list-reset items-center text-sm pt-3">
- <li>
- <a class="inline-block text-gray-600 no-underline hover:text-black dark:hover:text-gray-100 hover:text-underline py-1" href="https://github.com/mudler/edgevpn" target=_blank><i class="fa-brands fa-github-alt fa-fw mr-3"></i>Github</a>
- </li>
- <li>
- <a class="inline-block text-gray-600 no-underline hover:text-black dark:hover:text-gray-100 hover:text-underline py-1" href="https://mudler.github.io/edgevpn/docs" target=_blank><i class="fas fa-book fa-fw mr-3"></i>Documentation</a>
- </li>
- <li>
- <a class="inline-block text-gray-600 no-underline hover:text-black dark:hover:text-gray-100 hover:text-underline py-1" href="https://github.com/mudler/edgevpn/issues/new" target=_blank><i class="fas fa-bug fa-fw mr-3"></i>Report issue</a>
- </li>
- </ul>
- </div>
- </div>
- </div>
- </div>
- </footer>
- <script>
- function bytesToSize(bytes, decimals = 2) {
- if (bytes === 0) return '0 Bytes';
- const k = 1024;
- const dm = decimals < 0 ? 0 : decimals;
- const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
- const i = Math.floor(Math.log(bytes) / Math.log(k));
- var s = sizes[i]
- if (!sizes[i]) {
- s = "B"
- }
- return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + s;
- }
- function scaleSize(bytes, scale = 1, decimals = 2) {
- if (bytes === 0) return '0';
- const k = 1024;
- const dm = decimals < 0 ? 0 : decimals;
- //const i = Math.floor(Math.log(bytes) / Math.log(k));
- //console.log(i)
- return parseFloat((bytes / Math.pow(k, scale)).toFixed(dm));
- }
-
- const range = (start, stop, step) => Array.from({ length: (stop - start) / step + 1}, (_, i) => start + (i * step));
- function calcPages(n, total, size) {
- start = 1;
- if (n > 5 ){
- start = n - 5
- }
- end = Math.ceil(total / size);
- if (end - n > 5 ){
- end = n + 5
- // Math.ceil(this.total / this.size) - 10
- }
- return range(start, end ,1)
- }
- function filter(obj, key) {
- const start = obj.pageNumber * obj.size,
- end = start + obj.size;
- if (obj.search === "") {
- obj.total = obj.data.length;
- return obj.data.slice(start, end);
- }
- //Return the total results of the filters
- obj.total = obj.data.filter((item) => {
- return item[key]
- .toLowerCase()
- .includes(obj.search.toLowerCase());
- }).length;
- //Return the filtered data
- return obj.data
- .filter((item) => {
- return item[key]
- .toLowerCase()
- .includes(obj.search.toLowerCase());
- })
- .slice(start, end);
- }
- function endRes(obj) {
- let resultsOnPage = (obj.pageNumber + 1) * obj.size;
- if (resultsOnPage <= obj.total) {
- return resultsOnPage;
- }
- return obj.total;
- }
- function sortData(key, order = "asc") {
- return function innerSort(a, b) {
- if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
- return 0;
- }
- const varA = typeof a[key] === "string" ? a[key].toUpperCase() : a[key];
- const varB = typeof b[key] === "string" ? b[key].toUpperCase() : b[key];
- let comparison = 0;
- if (varA > varB) {
- comparison = 1;
- } else if (varA < varB) {
- comparison = -1;
- }
- return order === "desc" ? comparison * -1 : comparison;
- }
- }
-
-
- function machines(){
- return {
- data: [
-
- ],
- open: false,
- title: "",
- message: "",
- success: false,
- openToast(title, message, success) {
- this.title = title
- this.message = message
- this.success = success
- this.open = true
- setTimeout(() => {
- this.open = false
- }, 5000)
- },
-
- deleteItem(item) {
- fetch('/api/ledger/machines/'.concat("",item), {
- method: 'DELETE',
- });
- this.openToast("Delete", "Announcing deletion to the blockchain, please wait", true);
- },
-
- updateItems() {
- fetch('/api/machines')
- .then(response => response.json())
- .then(data => {
- data.sort(sortData("Address","asc"));
- this.data = data;
- } )
- },
- search: "",
- pageNumber: 0,
- size: 10,
- total: "",
-
- get filtered() {return filter(this, "Address") },
-
- //Create array of all pages (for loop to display page numbers)
- pages() {
- return calcPages(this.pageNumber, this.total, this.size)
- },
-
- //Next Page
- nextPage() {
- this.pageNumber++;
- },
-
- //Previous Page
- prevPage() {
- this.pageNumber--;
- },
-
- //Total number of pages
- pageCount() {
- return Math.ceil(this.total / this.size);
- },
-
- //Return the start range of the paginated results
- startResults() {
- return this.pageNumber * this.size + 1;
- },
-
- //Return the end range of the paginated results
- endResults() {
- return endRes(this)
- },
-
- //Link to navigate to page
- viewPage(index) {
- this.pageNumber = index;
- },
-
- };
- }
-
-
- function peerstore(){
- return {
- data: [
-
- ],
- open: false,
- title: "",
- message: "",
- success: false,
- openToast(title, message, success) {
- this.title = title
- this.message = message
- this.success = success
- this.open = true
- setTimeout(() => {
- this.open = false
- }, 5000)
- },
-
- updateItems() {
- fetch('/api/peerstore')
- .then(response => response.json())
- .then(data => {
- data.sort(sortData("ID","asc"));
- this.data = data;
- } )
- },
- search: "",
- pageNumber: 0,
- size: 10,
- total: "",
-
- get filtered() {return filter(this, "ID") },
-
- //Create array of all pages (for loop to display page numbers)
- pages() {
- return calcPages(this.pageNumber, this.total, this.size)
- },
-
- //Next Page
- nextPage() {
- this.pageNumber++;
- },
-
- //Previous Page
- prevPage() {
- this.pageNumber--;
- },
-
- //Total number of pages
- pageCount() {
- return Math.ceil(this.total / this.size);
- },
-
- //Return the start range of the paginated results
- startResults() {
- return this.pageNumber * this.size + 1;
- },
-
- //Return the end range of the paginated results
- endResults() {
- return endRes(this)
- },
-
- //Link to navigate to page
- viewPage(index) {
- this.pageNumber = index;
- },
-
- };
- }
-
-
- function nodes(){
- return {
- data: [
-
- ],
- open: false,
- title: "",
- message: "",
- success: false,
- openToast(title, message, success) {
- this.title = title
- this.message = message
- this.success = success
- this.open = true
- setTimeout(() => {
- this.open = false
- }, 5000)
- },
-
- updateItems() {
- fetch('/api/nodes')
- .then(response => response.json())
- .then(data => {
- data.sort(sortData("ID","asc"));
- this.data = data;
- } )
- },
- search: "",
- pageNumber: 0,
- size: 10,
- total: "",
-
- get filtered() {return filter(this, "ID") },
-
- //Create array of all pages (for loop to display page numbers)
- pages() {
- return calcPages(this.pageNumber, this.total, this.size)
- },
-
- //Next Page
- nextPage() {
- this.pageNumber++;
- },
-
- //Previous Page
- prevPage() {
- this.pageNumber--;
- },
-
- //Total number of pages
- pageCount() {
- return Math.ceil(this.total / this.size);
- },
-
- //Return the start range of the paginated results
- startResults() {
- return this.pageNumber * this.size + 1;
- },
-
- //Return the end range of the paginated results
- endResults() {
- return endRes(this)
- },
-
- //Link to navigate to page
- viewPage(index) {
- this.pageNumber = index;
- },
-
- };
- }
-
-
- function users(){
- return {
- data: [
-
- ],
- open: false,
- title: "",
- message: "",
- success: false,
- openToast(title, message, success) {
- this.title = title
- this.message = message
- this.success = success
- this.open = true
- setTimeout(() => {
- this.open = false
- }, 5000)
- },
-
- updateItems() {
- fetch('/api/users')
- .then(response => response.json())
- .then(data => {
- data.sort(sortData("ID","asc"));
- this.data = data;
- } )
- },
- search: "",
- pageNumber: 0,
- size: 10,
- total: "",
-
- get filtered() {return filter(this, "ID") },
-
- //Create array of all pages (for loop to display page numbers)
- pages() {
- return calcPages(this.pageNumber, this.total, this.size)
- },
-
- //Next Page
- nextPage() {
- this.pageNumber++;
- },
-
- //Previous Page
- prevPage() {
- this.pageNumber--;
- },
-
- //Total number of pages
- pageCount() {
- return Math.ceil(this.total / this.size);
- },
-
- //Return the start range of the paginated results
- startResults() {
- return this.pageNumber * this.size + 1;
- },
-
- //Return the end range of the paginated results
- endResults() {
- return endRes(this)
- },
-
- //Link to navigate to page
- viewPage(index) {
- this.pageNumber = index;
- },
-
- };
- }
-
-
- function dns(){
- return {
- data: [
-
- ],
- open: false,
- title: "",
- message: "",
- success: false,
- openToast(title, message, success) {
- this.title = title
- this.message = message
- this.success = success
- this.open = true
- setTimeout(() => {
- this.open = false
- }, 5000)
- },
-
- deleteItem(item) {
- fetch('/api/ledger/dns/'.concat("",item), {
- method: 'DELETE',
- });
- this.openToast("Delete", "Announcing deletion to the blockchain, please wait", true);
- },
-
- updateItems() {
- fetch('/api/dns')
- .then(response => response.json())
- .then(data => {
- data.sort(sortData("Regex","asc"));
- this.data = data;
- } )
- },
- search: "",
- pageNumber: 0,
- size: 10,
- total: "",
-
- get filtered() {return filter(this, "Regex") },
-
- //Create array of all pages (for loop to display page numbers)
- pages() {
- return calcPages(this.pageNumber, this.total, this.size)
- },
-
- //Next Page
- nextPage() {
- this.pageNumber++;
- },
-
- //Previous Page
- prevPage() {
- this.pageNumber--;
- },
-
- //Total number of pages
- pageCount() {
- return Math.ceil(this.total / this.size);
- },
-
- //Return the start range of the paginated results
- startResults() {
- return this.pageNumber * this.size + 1;
- },
-
- //Return the end range of the paginated results
- endResults() {
- return endRes(this)
- },
-
- //Link to navigate to page
- viewPage(index) {
- this.pageNumber = index;
- },
-
- };
- }
-
-
- function services(){
- return {
- data: [
-
- ],
- open: false,
- title: "",
- message: "",
- success: false,
- openToast(title, message, success) {
- this.title = title
- this.message = message
- this.success = success
- this.open = true
- setTimeout(() => {
- this.open = false
- }, 5000)
- },
-
- updateItems() {
- fetch('/api/services')
- .then(response => response.json())
- .then(data => {
- data.sort(sortData("Name","asc"));
- this.data = data;
- } )
- },
- search: "",
- pageNumber: 0,
- size: 10,
- total: "",
-
- get filtered() {return filter(this, "Name") },
-
- //Create array of all pages (for loop to display page numbers)
- pages() {
- return calcPages(this.pageNumber, this.total, this.size)
- },
-
- //Next Page
- nextPage() {
- this.pageNumber++;
- },
-
- //Previous Page
- prevPage() {
- this.pageNumber--;
- },
-
- //Total number of pages
- pageCount() {
- return Math.ceil(this.total / this.size);
- },
-
- //Return the start range of the paginated results
- startResults() {
- return this.pageNumber * this.size + 1;
- },
-
- //Return the end range of the paginated results
- endResults() {
- return endRes(this)
- },
-
- //Link to navigate to page
- viewPage(index) {
- this.pageNumber = index;
- },
-
- };
- }
-
-
- function files(){
- return {
- data: [
-
- ],
- open: false,
- title: "",
- message: "",
- success: false,
- openToast(title, message, success) {
- this.title = title
- this.message = message
- this.success = success
- this.open = true
- setTimeout(() => {
- this.open = false
- }, 5000)
- },
-
- updateItems() {
- fetch('/api/files')
- .then(response => response.json())
- .then(data => {
- data.sort(sortData("Name","asc"));
- this.data = data;
- } )
- },
- search: "",
- pageNumber: 0,
- size: 10,
- total: "",
-
- get filtered() {return filter(this, "Name") },
-
- //Create array of all pages (for loop to display page numbers)
- pages() {
- return calcPages(this.pageNumber, this.total, this.size)
- },
-
- //Next Page
- nextPage() {
- this.pageNumber++;
- },
-
- //Previous Page
- prevPage() {
- this.pageNumber--;
- },
-
- //Total number of pages
- pageCount() {
- return Math.ceil(this.total / this.size);
- },
-
- //Return the start range of the paginated results
- startResults() {
- return this.pageNumber * this.size + 1;
- },
-
- //Return the end range of the paginated results
- endResults() {
- return endRes(this)
- },
-
- //Link to navigate to page
- viewPage(index) {
- this.pageNumber = index;
- },
-
- };
- }
- function blockchain(){
- return {
- blockchain: {},
- updateItems() {
- fetch('/api/blockchain')
- .then(response => response.json())
- .then(data => this.blockchain = data )
- }
- };
- }
- function syntaxHighlight(json) {
- json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
- return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
- var cls = 'number';
- if (/^"/.test(match)) {
- if (/:$/.test(match)) {
- cls = 'key';
- } else {
- cls = 'string';
- }
- } else if (/true|false/.test(match)) {
- cls = 'boolean';
- } else if (/null/.test(match)) {
- cls = 'null';
- }
- return '<span class="' + cls + '">' + match + '</span>';
- });
- }
- function summary(){
- return {
- summary: {},
- chart: null,
- metrics: {},
- initChart() {
- this.chart = new ApexCharts(this.$refs.chart, {
- chart: {
- type: 'area',
- height: 80,
- sparkline: {
- enabled: true
- },
- dropShadow: {
- enabled: true,
- top: 1,
- left: 1,
- blur: 2,
- opacity: 0.2,
- }
- },
- dataLabels: {
- enabled: false,
- },
- series: [
- {
- name: "Download",
- data: [],
- },
- {
- name: "Upload",
- data: [],
- },
- ],
- stroke: {
- curve: 'smooth'
- },
- markers: {
- size: 0
- },
- grid: {
- padding: {
- top: 20,
- bottom: 10,
- }
- },
- colors: ['#247BA0', '#FF1654' ],
-
- noData: {
- text: "Loading...",
- },
- xaxis: {
- labels: {
- show: false,
- },
- },
- tooltip: {
- x: {
- show: false
- },
- y: {
- formatter: function(value, { series, seriesIndex, dataPointIndex, w }) {
- return value + ' KB/s'
- }
- }
- }
- })
- this.chart.render()
- },
- updateItems() {
- fetch('/api/summary')
- .then(response => response.json())
- .then(data => this.summary = data )
- fetch('/api/metrics')
- .then(response => response.json())
- .then(data => {
- this.metrics = data;
- this.chart.appendData([{ data: [ scaleSize(data.RateIn) ] }, { data: [ scaleSize(data.RateOut) ] } ]);
- } )
- }
- };
- }
- /*Toggle dropdown list*/
- /*https://gist.github.com/slavapas/593e8e50cf4cc16ac972afcbad4f70c8*/
- var navMenuDiv = document.getElementById("nav-content");
- var navMenu = document.getElementById("nav-toggle");
-
- document.onclick = check;
- function check(e){
- var target = (e && e.target) || (event && event.srcElement);
-
- //Nav Menu
- if (!checkParent(target, navMenuDiv)) {
- // click NOT on the menu
- if (checkParent(target, navMenu)) {
- // click on the link
- if (navMenuDiv.classList.contains("hidden")) {
- navMenuDiv.classList.remove("hidden");
- } else {navMenuDiv.classList.add("hidden");}
- } else {
- // click both outside link and outside menu, hide menu
- navMenuDiv.classList.add("hidden");
- }
- }
-
- }
- function checkParent(t, elm) {
- while(t.parentNode) {
- if( t == elm ) {return true;}
- t = t.parentNode;
- }
- return false;
- }
- </script>
- </body>
- </html>
|