From c26cb40a80910d3a9875e24bde42f60513137fad Mon Sep 17 00:00:00 2001 From: billz Date: Tue, 8 Oct 2019 18:58:46 +0100 Subject: [PATCH] Standardize project directory structure, in line with gulp build --- app/css/custom.css | 110 ++++++++++ app/css/hackernews.css | 112 ++++++++++ app/css/terminal.css | 301 +++++++++++++++++++++++++++ app/css/timeline.css | 180 ++++++++++++++++ app/icons/android-chrome-192x192.png | Bin 0 -> 26054 bytes app/icons/apple-touch-icon.png | Bin 0 -> 13708 bytes app/icons/browserconfig.xml | 9 + app/icons/favicon-16x16.png | Bin 0 -> 1392 bytes app/icons/favicon-32x32.png | Bin 0 -> 2585 bytes app/icons/favicon.png | Bin 0 -> 1707 bytes app/icons/mstile-150x150.png | Bin 0 -> 5098 bytes app/icons/safari-pinned-tab.svg | 48 +++++ app/icons/site.webmanifest | 14 ++ app/js/bandwidthcharts.js | 92 ++++++++ app/js/bandwidthcharts.min.js | 7 + app/js/custom.js | 291 ++++++++++++++++++++++++++ app/js/custom.min.js | 7 + 17 files changed, 1171 insertions(+) create mode 100644 app/css/custom.css create mode 100644 app/css/hackernews.css create mode 100644 app/css/terminal.css create mode 100755 app/css/timeline.css create mode 100644 app/icons/android-chrome-192x192.png create mode 100644 app/icons/apple-touch-icon.png create mode 100644 app/icons/browserconfig.xml create mode 100644 app/icons/favicon-16x16.png create mode 100644 app/icons/favicon-32x32.png create mode 100644 app/icons/favicon.png create mode 100644 app/icons/mstile-150x150.png create mode 100644 app/icons/safari-pinned-tab.svg create mode 100644 app/icons/site.webmanifest create mode 100644 app/js/bandwidthcharts.js create mode 100644 app/js/bandwidthcharts.min.js create mode 100644 app/js/custom.js create mode 100644 app/js/custom.min.js diff --git a/app/css/custom.css b/app/css/custom.css new file mode 100644 index 00000000..3cc72d61 --- /dev/null +++ b/app/css/custom.css @@ -0,0 +1,110 @@ +.page-header { + margin: 20px 0 20px; +} + +.page-header .logo { + margin-right: 5px; +} + +.panel-primary { + border-color: #c61931; +} + +.panel-primary>.panel-heading { + border-color: #d8224c; + background-color: #d8224c; +} + +.panel-footer { + background-color: #f2f1f0; +} + +.btn-primary.btn-outline { + color: #c61931; + border-color: #c61931; +} + +.btn-primary:hover { + background-color: #c61931; + border-color: #c61931; +} + +.info-item { + width: 140px; + float: left; +} + +.webconsole { + width:100%; + height:100%; + border:1px solid; +} + +#console { + height:500px; +} + +.systemtabcontent { + height:100%; + min-height:500px; +} + +.service-status-running, +.service-status-stopped { + background-color: #fff; + color: #333; + text-transform: uppercase; + line-height: inherit; +} +.service-status-running:before, +.service-status-stopped:before { + display: inline-block; + height: 16px; + width: 16px; + content: "\2022"; + font-size: 3.5em; + color: green; + line-height: 16px; + vertical-align: bottom; + margin-right: 2px; +} +.service-status-stopped:before { + color: red; + animation: flash 1s linear infinite; +} +@keyframes flash { + 50% { + opacity: 0; + } +} + +.logoutput { + width:100%; + height:300px; +} + +pre.unstyled { + border-width: 0; + background-color: transparent; + padding: 0; +} + +.dhcp-static-leases { + margin-top: 1em; + margin-bottom: 1em; +} + +.dhcp-static-lease-row { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.loading-spinner { + background: url("../../img/loading-spinner.gif") no-repeat scroll center center transparent; + min-height: 150px; + width: 100%; +} + +.js-wifi-stations .panel-body { + min-height: 256px; +} diff --git a/app/css/hackernews.css b/app/css/hackernews.css new file mode 100644 index 00000000..840658c8 --- /dev/null +++ b/app/css/hackernews.css @@ -0,0 +1,112 @@ +html * { + font-family: Verdana, Geneva, sans-serif; + font-size: 10pt; + color: #828282; +} + +.nav>li>a { + font-size: 12pt; +} + +a:focus, a:hover { + color: #666; +} + +h4 { + font-size: 18px; +} + +.panel { + border-radius: 1px; +} + +.panel-primary { + border-color: #ff6600; +} + +.panel-primary>.panel-heading { + border-color: #ff6600; + background-color: #ff6600; + color: #000; + font-size: 14pt; + font-weight: bold; +} + +.panel-heading { + border-top-left-radius: 1px; + border-top-right-radius: 1px; +} + +.panel-primary>.panel-heading .fa { + color: #fff; +} + +.page-header { + font-size: 26pt; + margin: 10px 0 20px; +} + +#wrapper,#page-wrapper,.panel-body,.nav>li>a,.navbar-default { + background-color: #f6f6ef; +} + +.panel-footer { + background-color: #eee; +} + +.btn-primary.btn-outline { + color: #c61931; + border-color: #c61931; +} + +.btn-primary:hover { + background-color: #c61931; + border-color: #c61931; +} + +.progress { + background-color: #eee; +} + +.progress-bar { + color: #eee; +} + +.info-item { + width: 140px; + float: left; +} + +.logoutput { + width: 100%; + height: 300px; +} + +.service-status-running, +.service-status-stopped { + background-color: #fff; + color: #333; + text-transform: uppercase; + line-height: inherit; +} +.service-status-running:before, +.service-status-stopped:before { + display: inline-block; + height: 18px; + width: 16px; + content: "\2022"; + font-size: 1.5em; + color: green; + line-height: 16px; + vertical-align: bottom; + margin-right: 2px; +} +.service-status-stopped:before { + color: red; + animation: flash 1s linear infinite; +} +@keyframes flash { + 50% { + opacity: 0; + } +} diff --git a/app/css/terminal.css b/app/css/terminal.css new file mode 100644 index 00000000..5eabd096 --- /dev/null +++ b/app/css/terminal.css @@ -0,0 +1,301 @@ +html * { + font-family: Courier New, Andale Mono, monospace; + font-size: 10pt; + color: #33ff00; +} + +#page-wrapper { + padding: 0 20px; + border-left: 1px solid #33ff00; +} + +.nav>li>a { + font-size: 10pt; +} + +.nav>li>a:focus, .nav>li>a:hover { + background-color: #000; +} + +.nav-tabs>li.active>a, .nav-tabs>li.active>a:focus, .nav-tabs>li.active>a:hover, .input-group-addon { + color: #33ff00; + cursor: default; + background-color: #000; + border: 1px solid #33ff00; + border-bottom-color: #33ff00; +} + +.nav-tabs>li>a,.nav-tabs>li>a:hover { + border: 1px solid #33ff00; +} + +.nav-tabs { + border-bottom: 1px solid #33ff00; +} + +.navbar-default { + border-color: #33ff00; +} + +.navbar-default .navbar-brand, .navbar-default .navbar-brand:hover { + color: #33ff00; +} + +.navbar-default .navbar-toggle { + border-color: #33ff00; +} + +.navbar-default .navbar-toggle .icon-bar { + background-color: #33ff00; +} + +.navbar-default .navbar-toggle:focus, .navbar-default .navbar-toggle:hover { + background-color: #000; +} + +.logo { + visibility: collapse; + width: 0px; +} + +a:focus, a:hover { + color: #33ff00; +} + +.panel-primary { + border-color: #33ff00; +} + +.panel-primary>.panel-heading, .panel-default>.panel-heading { + border-color: #33ff00; + background-color: #33ff00; + color: #000; + font-size: 12pt; +} + +.panel-primary>.panel-heading .fa { + color: #000; +} + +.panel { + margin-bottom: 20px; + border: 1px solid #33ff00; + border-radius: 0px; + background-color: #000; +} + +hr { + border-top: 1px solid #33ff00; +} + +.page-header { + font-size: 24pt; + margin: 10px 0 20px; + border-bottom: 1px solid #33ff00; +} + +#wrapper,#page-wrapper,.panel-body,.nav>li>a,.navbar-default { + background-color: #000; +} + +.panel-footer { + background-color: #000; + border-top: 1px solid #33ff00; +} + +.panel-primary>.panel-heading::before, .navbar-default::before { + content: " "; + display: block; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.25) 50%), linear-gradient(90deg, rgba(255, 0, 0, 0.06), rgba(0, 255, 0, 0.02), rgba(0, 0, 255, 0.06)); + z-index: 2; + background-size: 100% 2px, 3px 100%; + pointer-events: none; +} + +.sidebar ul li a.active,.sidebar ul li a.hover { + background-color: #000; +} + +.sidebar ul li { + border-bottom: 1px solid #33ff00; +} + +.btn-default.active, .btn-default.active:focus, .btn-default.active:hover { + color: #33ff00; + background-color: #000; +} + + +.btn-primary.btn-outline,.btn-warning,.btn-default,.btn-danger { + color: #33ff00; + border-color: #33ff00; +} + +.btn-primary:hover,.btn-primary:focus,.btn-warning:hover,.btn-warning:focus,.btn-primary:active,.btn-default:hover,.btn-danger:hover,.btn-default:active,.btn-default:focus { + color: #33ff00; + background-color: #000; + border-color: #33ff00; +} + +.btn-primary.btn-outline:hover,.btn-success, .btn-success.btn-outline:hover, .btn-info.btn-outline:hover, .btn-warning.btn-outline:hover, .btn-danger.btn-outline:hover { + color: #33ff00; +} + +label.btn.btn-primary { + color: #33ff00; +} + +label.btn.btn-primary.active, label.btn.btn-warning.active { + background-color: #33ff00; + border-color: #33ff00; + color: #000; +} + +.label-warning { + background-color: #33ff00; +} + +span.label.label-warning { + color: #000; +} + +.btn.btn-primary { + border-color: #33ff00; +} + +.table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th, .table>thead>tr>td, .table>thead>tr>th { + background-color: #000; + border-top: 1px solid #000; +} + +.table>thead>tr>th { + vertical-align: bottom; + border-bottom: 1px solid #33ff00; +} + +.btn-info, .btn-info:hover, .btn-info[disabled], .btn-danger.disabled, .btn-danger.disabled.active, .btn-danger.disabled.focus, .btn-danger.disabled:active, .btn-danger.disabled:focus, .btn-danger.disabled:hover, .btn-danger[disabled], .btn-danger[disabled].active, .btn-danger[disabled].focus, .btn-danger[disabled]:active, .btn-danger[disabled]:focus, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger.active, fieldset[disabled] .btn-danger.focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger:hover, .btn-info:hover { + background-color: #000; + border-color: #33ff00; + color: #33ff00; +} + +.btn { + background-color: #000; + border-radius: 0px; +} + +.alert { + border-radius: 0px; +} + +.alert-success,.alert-warning,.alert-info,.alert-dismissable,.alert-danger { + color: #33ff00; + background-color: #000; + border-color: #33ff00; + border: 1px dashed; +} + +.close { + font-size: 18px; + font-weight: normal; + text-shadow: 0 0px 0 #000; + opacity: 1; +} + +.form-control, .form-control:focus { + color: #33ff00; + background-color: #000; + border: 1px solid #33ff00; + border-radius: 0px; + transition: unset; +} + +input[type="text"]{ + color: #33ff00 !important +} + +.form-control::-webkit-input-placeholder { color: #33ff00; } +.form-control:-moz-placeholder { color: #33ff00; } +.form-control::-moz-placeholder { color: #33ff00; } +.form-control:-ms-input-placeholder { color: #33ff00; } +.form-control::-ms-input-placeholder { color: #33ff00; } + +.progress { + background-color: #000; + border-radius: 0px; +} + +.progress-bar { + color: #000; +} + +.progress-bar.progress-bar-info.progress-bar-striped.active { + background-color: #33ff00; +} + +.info-item { + width: 140px; + float: left; +} + +.logoutput { + width: 100%; + height: 300px; + background-color: #000; + border-color: #33ff00; +} + +.webconsole { + width: 100%; + height: 100%; + border-color: #33ff00; + border-bottom: 1px solid; + border-left: 1px solid; + border-top: 0px; + border-right: 1px solid; +} + +#console { + height: 500px; +} + +.systemtabcontent { + height: 100%; + min-height: 500px; +} + +tspan, rect { + fill: #33ff00; +} + +.morris-hover.morris-default-style { + background: none; + border-radius: 0px; + border-color: #33ff00; + border: dashed 1px #33ff00; +} + +.morris-hover-point { + color: #33ff00 !important; +} + +path { + stroke: #33ff00; +} + +span.service-status-running { + color: #000; + font-size: 10pt; + text-transform: uppercase; + line-height: inherit; +} + +pre { + background-color: #000; + border: #000; +} diff --git a/app/css/timeline.css b/app/css/timeline.css new file mode 100755 index 00000000..92161ebe --- /dev/null +++ b/app/css/timeline.css @@ -0,0 +1,180 @@ +.timeline { + position: relative; + padding: 20px 0 20px; + list-style: none; +} + +.timeline:before { + content: " "; + position: absolute; + top: 0; + bottom: 0; + left: 50%; + width: 3px; + margin-left: -1.5px; + background-color: #eeeeee; +} + +.timeline > li { + position: relative; + margin-bottom: 20px; +} + +.timeline > li:before, +.timeline > li:after { + content: " "; + display: table; +} + +.timeline > li:after { + clear: both; +} + +.timeline > li:before, +.timeline > li:after { + content: " "; + display: table; +} + +.timeline > li:after { + clear: both; +} + +.timeline > li > .timeline-panel { + float: left; + position: relative; + width: 46%; + padding: 20px; + border: 1px solid #d4d4d4; + border-radius: 2px; + -webkit-box-shadow: 0 1px 6px rgba(0,0,0,0.175); + box-shadow: 0 1px 6px rgba(0,0,0,0.175); +} + +.timeline > li > .timeline-panel:before { + content: " "; + display: inline-block; + position: absolute; + top: 26px; + right: -15px; + border-top: 15px solid transparent; + border-right: 0 solid #ccc; + border-bottom: 15px solid transparent; + border-left: 15px solid #ccc; +} + +.timeline > li > .timeline-panel:after { + content: " "; + display: inline-block; + position: absolute; + top: 27px; + right: -14px; + border-top: 14px solid transparent; + border-right: 0 solid #fff; + border-bottom: 14px solid transparent; + border-left: 14px solid #fff; +} + +.timeline > li > .timeline-badge { + z-index: 100; + position: absolute; + top: 16px; + left: 50%; + width: 50px; + height: 50px; + margin-left: -25px; + border-radius: 50% 50% 50% 50%; + text-align: center; + font-size: 1.4em; + line-height: 50px; + color: #fff; + background-color: #999999; +} + +.timeline > li.timeline-inverted > .timeline-panel { + float: right; +} + +.timeline > li.timeline-inverted > .timeline-panel:before { + right: auto; + left: -15px; + border-right-width: 15px; + border-left-width: 0; +} + +.timeline > li.timeline-inverted > .timeline-panel:after { + right: auto; + left: -14px; + border-right-width: 14px; + border-left-width: 0; +} + +.timeline-badge.primary { + background-color: #2e6da4 !important; +} + +.timeline-badge.success { + background-color: #3f903f !important; +} + +.timeline-badge.warning { + background-color: #f0ad4e !important; +} + +.timeline-badge.danger { + background-color: #d9534f !important; +} + +.timeline-badge.info { + background-color: #5bc0de !important; +} + +.timeline-title { + margin-top: 0; + color: inherit; +} + +.timeline-body > p, +.timeline-body > ul { + margin-bottom: 0; +} + +.timeline-body > p + p { + margin-top: 5px; +} + +@media(max-width:767px) { + ul.timeline:before { + left: 40px; + } + + ul.timeline > li > .timeline-panel { + width: calc(100% - 90px); + width: -moz-calc(100% - 90px); + width: -webkit-calc(100% - 90px); + } + + ul.timeline > li > .timeline-badge { + top: 16px; + left: 15px; + margin-left: 0; + } + + ul.timeline > li > .timeline-panel { + float: right; + } + + ul.timeline > li > .timeline-panel:before { + right: auto; + left: -15px; + border-right-width: 15px; + border-left-width: 0; + } + + ul.timeline > li > .timeline-panel:after { + right: auto; + left: -14px; + border-right-width: 14px; + border-left-width: 0; + } +} \ No newline at end of file diff --git a/app/icons/android-chrome-192x192.png b/app/icons/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..ccfa35f7d1cecb03093882e8b18fae790811374f GIT binary patch literal 26054 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 + + + + + #b91d47 + + + diff --git a/app/icons/favicon-16x16.png b/app/icons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..25a09c4af3eaa1f6a3935552401fdbdb61cfe5f9 GIT binary patch literal 1392 zcmZ`(e^Aq97=PKu_%Xkv27z0J1kQoH~{ev+;JltSoOvAx$Mvz^^0b0qK zib=#Jb$I4!xEJ@26I`orD3_kG^yc|M=#^E}`0 zeP7h5@&f%I@ka;+O7nAca6X9tzEs!+2^$LFpjjnK2|^znV%#%%!<|!+uTvt_z(=UD z8KEU`HQq#MuLz+9BSIM+2(fCqhP96&L=kEf`dmmLqLqX|M{pG+*hxi1yp9y=$&G3< zFpEeiBz2BC6h?3qM2w2yDW^q6Gf3dhG?G!W-sP29fbca$td`^|+<7)asK;q+Il+OY zAb2WZ!2E0(UQwO}(P*VRzJQ3;5CScRa~10$u3~npnSj!e15Svte*&-{oLnpnH?<}Vc0hsC zBN#t-D2GS!FORqcKQ&P3(TQgZlZ=$EuCA)A#%u7p3^{cw{OaBB_h`>?YaET=b!yVx zE}(P5BMZ-8)q1fn<%aCPu46pD%?D?QrRS;CYNhgctVP=k(t`*u_3)zdN8 z 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 literal 0 HcmV?d00001 diff --git a/app/icons/mstile-150x150.png b/app/icons/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..96b9d4e62b9f7715d4cdb3818905e6da71a24090 GIT binary patch literal 5098 zcmbtYS2!CE*H5dZ)TpW*L5UHyN|9K#*WV7Qy+ZBU#45E~BlfCMvq2EGH?6I;_ntLk z)-L|M-plXeyLvCqInO!gIpaCw=J!cULy3%pfdl{mkf|uk>i_`v$p1@^9^6?*>jnAl z#Dljo>M{Vpx7f$m77y=q7As{PbpXJZ0{{pL1pqGZOhH=!fTsWefHwyKU}*pVtxIO3 zw#1#|zNMOyJm5AW_E+1TM&zNQu0XW*fR^??c~RLR0|4+eRz+S0?lZf$fb!S-oz?T_ zpbzweCIvvr`mtZXIOhfbFa-aM*D}2^rY66pzkc#zDoPM%Q9TLC)5q4>EA6QniFx@T{mD|gdb zMGO9qjQsG2R8U8R2Z|_*KjDd~@a~$b$sUK8@)Y=U4ryT@Rb+|AtCBIPJ@_{ftgQ8H zx$5KO5bMwYKm-{>`FqcsLR0FJQPZ+9n22p|ZOI#JkOi~L#jLuEkG3iSPNww;%)~>S zj5T(s2_33d&S;UeVD?VCb1OsCa-uQi_>!B?Ifm2@f{%p}W)6s}=Gbb?a*-W;`vrBe z@}_N*)YMfoR?k#nn$z5nRJSP44sS4|cKxxnAR>U~tAfkRrq6W1t33<8x|f-y6+@lu zOja|CrOQEFo~4#F`7d72(kW`s|5_G1j58Pr0BUC7a5Wi<0-thyWgkX9Qpp}2S1?)U zHlbIqC!q`|lg1moGnsxnkua<4g2dKIF!^w+>modLvwceKA3)wU0OI+%Y@3fM)utnEAPp3i!X9&70VxG(7p~i-43A| z@L+~=AH`~oSUknzU`6aaP{hNAUGz`eGu^~?wSBed?wgTW+C~BNmv3=+!X@(*cY3A{ zDO2~f_(4E9l3e^#H(A_M8y&i{kup zc9V_Mwxlwd1C9%TAi_lKBl>I9o8WV4H~H(^Up&e*$aX2J)Vz0GaW8j;M2M{-4_vkS zoFo56)BXk1y5E<4TE@RD7ZgR=PYO@+>i`_r*NQC`|PDyWKEwN#e^W&GnM zo}gpR1{NAH$RQJL{+R5OPWSV`u9*`J^C(b0D!DPpX>T2aj0l+IU=}4_E z(NDV6fd~)TsqYzauW+7O&Orpya8%^vL9i5|L@LJ10}RhC<#fF5!?y-iZ+Kq6Z*_#b z0LH5#)BVK*c|#@2t@7RfeRNDudzPL-sNIf!gLLKIA^5OE*%%&h#=+<26HL<2l^;z4DF%;zJp5Q0as`D9 zo>g7Aws%<5j`fmWT{B`$^pX!fk{Y>7gi-yvqQ9|NLWdxdaYR;fuaQEQ)Z~Ki6qaII zu9k0%v_WbfHvvCbsK5o;Jsa)ANMnRzZY>`ECZ3npcat=^UpEzOl(}a0ym=s~VrWvB zvH{rj@H(72IL44D>6j&epl<9FQKnJRTYaMo;1oK3;ED6PdjD#8k7@QwTD#M;qr58Z z03O{RQqp6N&s^@|?ykpv(OQ1_vLk)Rc!%jSEWnwAcx#XXCBEN#9ZSzte+G5*D*YBa zSIVZvC}Z}u3ZlV;l;R{TO&@R?BoD*VQ=J*4v$KYLlTflY_xWY@rv3B7=Jg_!yiaq@ z$+2zK9uUcefZ_{5{kqvN!3yxQfLSc>Y`*;jdv^aP)6XS5AR{M$6|Lfl(ieN{sO zqD1XV&h@9KI4Pa@#CqYhWTUTRh6VBEQusWNLLT*}ktL>-PGeq9qtDAGAWr(8&t+t5 zIkww`=TR+?(^8xIaJhtHBaeu8%GU6qozJ!6*D!FrB5Pt=-<4xwWAHs?ZTn(#Fu%(y zHmYr$0zn_ZfSMP6ttA!%roCQmnpr|M$ui z{ktLPaC-3X{%QKEBYyz6K4yZQk}0iyt(0u{=S;;TzqB6DlXqON>DqC0>iycZCt;Yjq8uU&?Q!>TFLzDI?_%puEc=~RsQ1H) z#ana-y;7Gtrz zo#~BbSBWYDA_8Cu+8)AP82Z#pOU5&kbvVMX%X*yWNzxPHk@=7Svj zl$+T@@FGXTnST@lA`kSl;EDq7?5;|@-9BdW{#-*!aTQrhUm%zcc9qQ!fB4T^VJ0ei zYefzv7b(qetQtY^x)O%#BDY(xr|x4M2Va9x*5g` zm%pgt6zB}J{pftqJ4JVTg{L80#=>k$B*+RS$|79yS7^y@zv#)OKvv8>Kdue8^C(`Z z#CpBAxg@?62b-L-=rE8xKcf9T(!;6cyIEHY!}rb<5-SYc}dv&hM- zp3W}sH=rjB2o9a0cDBUQ&LiaTm!6rmX#^QXBV(7?m>>bXct=A{n&wi~*#bE|C92G` zMXauAaZH}wwe+Z1YH~*K=aDDj`_sMrH($7FMMmX1s>OC4=2cf*W2$J+ZOTdfBb4)LH;+l9 zX6VQMa>|l1`Xt&#=Q#|IWw&0>pfJ8eCQU1fO0@Z?6OW|kMeQRgtfw$#NakML#60b| z>}ytC6ed_3=jpg%%|QtEw3Ikz(i?*~djuvi55ml5oT5FGfIGc_6U#$UAQjQ}HD*oM zKys*ItRem-;%-Li`QT3M=ORurTT*%>ie}TrOhr>11Z}=f{5GA zQ(%F4)aAFTpKj)v~(w$Ntvt9<^4AUl%U>>q_&12RySS z)1|MoNpyt}cB-K9K%_&0Wm|;eNy_3`vV_i91|>s65{~{TM&eKHHnG!LGE>=_B`r$N zuw=UPGApZ02>Y9vaf;{FT!xOA*tq6ez)ul8C2oCK0l8(buI)bdjoS9}HFbyR$>#$l z{^2)Dg&z6W?(D#|BF1Eg*tSd^H?R7n=;<~_@cX<(it66FUE!>`(x&cvY@P&DAXxYW z7K!GIOt%(MqdF;oSWez#lxy+-hA2VtMH0Wc)iQv${u7W>-kn_kp3&h#N0(*0B+DgM z$ccvI7qv?~AyY<@iSK1O$8kiO;(_K#mvuylsz!`goDrK|2pd~&)cbXd%iFTU321Xti9E?=I*I>$% z*t!W@N_|$`JN3pCo6spT_4%&n@w*2GMKZl?85(h~YUr=t9e#+kFFIH#p8vom44Pf` zEAfup8(*8)StwXqlpdK)12g%X85P8!vvZs@A_*f3_~D?cf{5$25n4MHopVD>+XY9H z*yspRAhzU3i$sJRo>1vizyHthza0NAmV$|EKe5}?EFSYRVx!Gkhw5te6Gk9%!L9rZEgmJfWg=fmyL0rZ@8mgy zQ4uTJ?I+co`A$mZcUHS{udWw;BkR-bDyHcmHJzhG!+%wd1JpF#N!1NYRx9{5#Ffl? zF2=Hqw|F*P!`P&G6?fmj6 z*u&Xv{mPJ1*q{g+EjAHPgy~Oa4Uq+TenqK`zm4|ZeJ>Cd0A{;}-5@15Dp;1{C#h+c zw}8Er1CL@02ZwuCy_9q!O#UIgYNS(nnktr{fe;*ve;{+R>eVBc!}{u%dsuiUJ^CNB zLq#nP5BIc@IYF+cwJ*C28VRIV^Xn6lowI{D*E4er1rFMeaB-cU>bxdMh3+$HZxH_a zx*?d>^X7|I5d05E;=(qh56Lir_PkkDWwDc$)!YyZEa2j=KPFa13WZ-8tSFzK4dfT3 ziPnb%Y4ampi;v@VEQM4sbR5tP>#&7++P5@?9)zyknu4j8kfMS}Lr8H!(nNE=hsJYh zA1+}kgB{XdPUSv!9^OLg^+7PAZP*i?OVV^&ZG&=cEsZPQ$72@z;o-0nW81pO8WlZL zVHYM%&h3?H?RNy!_Xknwh`%6=LDd8}%AeiN^BR7Q* zyFtT6?@G@g5sAFd{FF(10bykWG$*(@9F-X#eV7x}1T40pXl5d_y8-?4nDxu8*DtY( z+csZr(Gi@1(U7IYds1Zbf}9{ZHq+37o>=hkyHLy73UE`+ zJUfyEAyJuoGQ^0)-FcZZMXVpxs%U>4>U!)3w~N|vNS7M3-S1`?Aim6> zS|lx-mUnzen6tj&R{?vYD-WZxai}kz@wBEk92#9?Z;O>D-~3~dxQY10-|w}*(pxb! zB1{nC6UwVX5o5TxY0Thjn+{h3Ep6g<)eOzYzkLuFn{CalraW0u-2k(`#=q$zh_-Lz zFAsEDejh4Kjen7aTY=cF{vF5jw3N?WR!T+(sT(ssLjSu}9uG6Z6c=e%fhLON@4$rv z+cGQXB(L&;2NCS?#jOmve;D#_@T(ayH|E;O_DwW9x&cKsrl=oHwuo7{%Wec_9|DgL z$KrfTl%f6l;RQu_c)p}zK9ga-^=zKyQiYv+oCqCoiA8+|Uu66nqMQA^M7t1DgV5$r zhf4m>n9To{;4A8e`SD>x!+F$`kUO*r?4j_+18L!54YP8yz7v3#0)kLp0b$;kLhzSD zFoBmaL1CUdE+9Z6loRxS0-W9qJr=P#AtIsgK;$9z_gso1F05}y%JvB(DrcOVJas^Ba? or^kCce{}*oiGBtt=cw`l@U)a3N3ySy?@9nv6g1?^Wz9eQ2YX(&ga7~l literal 0 HcmV?d00001 diff --git a/app/icons/safari-pinned-tab.svg b/app/icons/safari-pinned-tab.svg new file mode 100644 index 00000000..f00af1b9 --- /dev/null +++ b/app/icons/safari-pinned-tab.svg @@ -0,0 +1,48 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + + + + diff --git a/app/icons/site.webmanifest b/app/icons/site.webmanifest new file mode 100644 index 00000000..321ab7db --- /dev/null +++ b/app/icons/site.webmanifest @@ -0,0 +1,14 @@ +{ + "name": "RaspAP", + "short_name": "RaspAP", + "icons": [ + { + "src": "/dist/icons/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/app/js/bandwidthcharts.js b/app/js/bandwidthcharts.js new file mode 100644 index 00000000..bfede760 --- /dev/null +++ b/app/js/bandwidthcharts.js @@ -0,0 +1,92 @@ +(function($, _t) { + "use strict"; + + /** + * Create a Morris.js barchart. + */ + function CreateBarChart(placeholder, datasizeunits) { + var barchart = new Morris.Bar({ + element: placeholder, + xkey: 'date', + ykeys: ['rx', 'tx'], + labels: [_t['receive']+' '+datasizeunits.toUpperCase(), + _t['send']+' '+datasizeunits.toUpperCase()] + }); + + return barchart; + } + + /** + * Create a jquery bootstrap datatable. + */ + function CreateDataTable(placeholder, timeunits) { + $("#"+placeholder).append(''+ + '
daterxtx
'); + } + + /** + * Figure out which tab is selected and remove all existing charts and then + * construct the proper barchart. + */ + function ShowBandwidthChartHandler(e) { + // Remove all morrisjs charts + $('#divChartBandwidthhourly').empty(); + $('#divChartBandwidthdaily').empty(); + $('#divChartBandwidthmonthly').empty(); + // Remove all datatables + $('#divTableBandwidthhourly').empty(); + $('#divTableBandwidthdaily').empty(); + $('#divTableBandwidthmonthly').empty(); + // Construct ajax uri for getting the proper data. + var timeunit = $('ul#tabbarBandwidth li.active a').attr('href').substr(1); + var uri = 'ajax/bandwidth/get_bandwidth.php?'; + uri += 'inet='; + uri += encodeURIComponent($('#cbxInterface'+timeunit+' option:selected').text()); + uri += '&tu='; + uri += encodeURIComponent(timeunit.substr(0, 1)); + var datasizeunits = 'mb'; + uri += '&dsu='+encodeURIComponent(datasizeunits); + // Init. chart + var barchart = CreateBarChart('divChartBandwidth'+timeunit, datasizeunits); + // Init. datatable html + var datatable = CreateDataTable('divTableBandwidth'+timeunit, timeunit); + // Get data for chart + $.ajax({ + url: uri, + dataType: 'json', + beforeSend: function() { + $('#divLoaderBandwidth'+timeunit).removeClass('hidden'); + } + }).done(function(jsondata) { + $('#divLoaderBandwidth'+timeunit).addClass('hidden'); + barchart.setData(jsondata); + $('#tableBandwidth'+timeunit).DataTable({ + 'searching': false, + 'paging': false, + 'data': jsondata, + 'order': [[ 0, 'ASC' ]], + 'columns': [ + { 'data': 'date' }, + { 'data': 'rx', "title": _t['receive']+' '+datasizeunits.toUpperCase() }, + { 'data': 'tx', "title": _t['send']+' '+datasizeunits.toUpperCase() }] + }); + }).fail(function(xhr, textStatus) { + if (window.console) { + console.error('server error'); + } else { + alert("server error"); + } + }); + } + + $(document).ready(function() { + $('#tabbarBandwidth a[data-toggle="tab"]').on('shown.bs.tab', ShowBandwidthChartHandler); + $('#cbxInterfacehourly').on('change', ShowBandwidthChartHandler); + $('#cbxInterfacedaily').on('change', ShowBandwidthChartHandler); + $('#cbxInterfacemonthly').on('change', ShowBandwidthChartHandler); + ShowBandwidthChartHandler(); + }); + +})(jQuery, t); + diff --git a/app/js/bandwidthcharts.min.js b/app/js/bandwidthcharts.min.js new file mode 100644 index 00000000..400015dd --- /dev/null +++ b/app/js/bandwidthcharts.min.js @@ -0,0 +1,7 @@ +/*! + * RaspAP - RaspAP WiFi Configuration Portal v1.6.1 (https://github.com/billz/raspap-webgui) + * Copyright 2013-2019 RaspAP Developers + * Licensed under MIT (https://github.com/raspap-webgui/raspap-webgui/blob/master/LICENSE) + */ + +!function(r,i){"use strict";function t(t){r("#divChartBandwidthhourly").empty(),r("#divChartBandwidthdaily").empty(),r("#divChartBandwidthmonthly").empty(),r("#divTableBandwidthhourly").empty(),r("#divTableBandwidthdaily").empty(),r("#divTableBandwidthmonthly").empty();var e=r("ul#tabbarBandwidth li.active a").attr("href").substr(1),a="ajax/bandwidth/get_bandwidth.php?";a+="inet=",a+=encodeURIComponent(r("#cbxInterface"+e+" option:selected").text()),a+="&tu=",a+=encodeURIComponent(e.substr(0,1));var d="mb";a+="&dsu="+encodeURIComponent(d);var n=function(t,e){return new Morris.Bar({element:t,xkey:"date",ykeys:["rx","tx"],labels:[i.receive+" "+e.toUpperCase(),i.send+" "+e.toUpperCase()]})}("divChartBandwidth"+e,d);!function(t,e){r("#"+t).append('
daterxtx
')}("divTableBandwidth"+e,e);r.ajax({url:a,dataType:"json",beforeSend:function(){r("#divLoaderBandwidth"+e).removeClass("hidden")}}).done(function(t){r("#divLoaderBandwidth"+e).addClass("hidden"),n.setData(t),r("#tableBandwidth"+e).DataTable({searching:!1,paging:!1,data:t,order:[[0,"ASC"]],columns:[{data:"date"},{data:"rx",title:i.receive+" "+d.toUpperCase()},{data:"tx",title:i.send+" "+d.toUpperCase()}]})}).fail(function(t,e){window.console?console.error("server error"):alert("server error")})}r(document).ready(function(){r('#tabbarBandwidth a[data-toggle="tab"]').on("shown.bs.tab",t),r("#cbxInterfacehourly").on("change",t),r("#cbxInterfacedaily").on("change",t),r("#cbxInterfacemonthly").on("change",t),t()})}(jQuery,t); \ No newline at end of file diff --git a/app/js/custom.js b/app/js/custom.js new file mode 100644 index 00000000..d056ccdf --- /dev/null +++ b/app/js/custom.js @@ -0,0 +1,291 @@ +function msgShow(retcode,msg) { + if(retcode == 0) { + var alertType = 'success'; + } else if(retcode == 2 || retcode == 1) { + var alertType = 'danger'; + } + var htmlMsg = ''; + return htmlMsg; +} + +function createNetmaskAddr(bitCount) { + var mask=[]; + for(i=0;i<4;i++) { + var n = Math.min(bitCount, 8); + mask.push(256 - Math.pow(2, 8-n)); + bitCount -= n; + } + return mask.join('.'); +} + +function loadSummary(strInterface) { + $.post('/ajax/networking/get_ip_summary.php',{interface:strInterface},function(data){ + jsonData = JSON.parse(data); + console.log(jsonData); + if(jsonData['return'] == 0) { + $('#'+strInterface+'-summary').html(jsonData['output'].join('
')); + } else if(jsonData['return'] == 2) { + $('#'+strInterface+'-summary').append(''); + } + }); +} + +function getAllInterfaces() { + $.get('/ajax/networking/get_all_interfaces.php',function(data){ + jsonData = JSON.parse(data); + $.each(jsonData,function(ind,value){ + loadSummary(value) + }); + }); +} + +function setupTabs() { + $('a[data-toggle="tab"]').on('shown.bs.tab',function(e){ + var target = $(e.target).attr('href'); + if(!target.match('summary')) { + var int = target.replace("#",""); + loadCurrentSettings(int); + } + }); +} + +function loadCurrentSettings(strInterface) { + $.post('/ajax/networking/get_int_config.php',{interface:strInterface},function(data){ + jsonData = JSON.parse(data); + $.each(jsonData['output'],function(i,v) { + var int = v['interface']; + $.each(v,function(i2,v2) { + switch(i2) { + case "static": + if(v2 == 'true') { + $('#'+int+'-static').click(); + $('#'+int+'-nofailover').click(); + } else { + $('#'+int+'-dhcp').click(); + } + break; + case "failover": + if(v2 === 'true') { + $('#'+int+'-failover').click(); + } else { + $('#'+int+'-nofailover').click(); + } + break; + case "ip_address": + var arrIPNetmask = v2.split('/'); + $('#'+int+'-ipaddress').val(arrIPNetmask[0]); + $('#'+int+'-netmask').val(createNetmaskAddr(arrIPNetmask[1])); + break; + case "routers": + $('#'+int+'-gateway').val(v2); + break; + case "domain_name_server": + svrsDNS = v2.split(" "); + $('#'+int+'-dnssvr').val(svrsDNS[0]); + $('#'+int+'-dnssvralt').val(svrsDNS[1]); + break; + } + }); + }); + }); +} + +function saveNetworkSettings(int) { + + var frmInt = $('#frm-'+int).find(':input'); + var arrFormData = {}; + $.each(frmInt,function(i3,v3){ + if($(v3).attr('type') == 'radio') { + arrFormData[$(v3).attr('id')] = $(v3).prop('checked'); + } else { + arrFormData[$(v3).attr('id')] = $(v3).val(); + } + }); + arrFormData['interface'] = int; + $.post('/ajax/networking/save_int_config.php',arrFormData,function(data){ + //console.log(data); + var jsonData = JSON.parse(data); + $('#msgNetworking').html(msgShow(jsonData['return'],jsonData['output'])); + }); +} + +function applyNetworkSettings() { + var int = $(this).data('int'); + arrFormData = {}; + arrFormData['generate'] = ''; + $.post('/ajax/networking/gen_int_config.php',arrFormData,function(data){ + console.log(data); + var jsonData = JSON.parse(data); + $('#msgNetworking').html(msgShow(jsonData['return'],jsonData['output'])); + }); +} + +$(document).on("click", ".js-add-dhcp-static-lease", function(e) { + e.preventDefault(); + var container = $(".js-new-dhcp-static-lease"); + var mac = $("input[name=mac]", container).val().trim(); + var ip = $("input[name=ip]", container).val().trim(); + if (mac == "" || ip == "") { + return; + } + + var row = $("#js-dhcp-static-lease-row").html() + .replace("{{ mac }}", mac) + .replace("{{ ip }}", ip); + $(".js-dhcp-static-lease-container").append(row); + + $("input[name=mac]", container).val(""); + $("input[name=ip]", container).val(""); +}); + +$(document).on("click", ".js-remove-dhcp-static-lease", function(e) { + e.preventDefault(); + $(this).parents(".js-dhcp-static-lease-row").remove(); +}); + +$(document).on("submit", ".js-dhcp-settings-form", function(e) { + $(".js-add-dhcp-static-lease").trigger("click"); +}); + +function setupBtns() { + $('#btnSummaryRefresh').click(function(){getAllInterfaces();}); + + $('.intsave').click(function(){ + var int = $(this).data('int'); + saveNetworkSettings(int); + }); + + $('.intapply').click(function(){ + applyNetworkSettings(); + }); +} + +function setCSRFTokenHeader(event, xhr, settings) { + var csrfToken = $('meta[name=csrf_token]').attr('content'); + if (/^(POST|PATCH|PUT|DELETE)$/i.test(settings.type)) { + xhr.setRequestHeader("X-CSRF-Token", csrfToken); + } +} + +function contentLoaded() { + pageCurrent = window.location.href.split("?")[1].split("=")[1]; + pageCurrent = pageCurrent.replace("#",""); + $('#side-menu').metisMenu(); + switch(pageCurrent) { + case "network_conf": + getAllInterfaces(); + setupTabs(); + setupBtns(); + break; + } +} + +function loadWifiStations(refresh) { + return function() { + var complete = function() { $(this).removeClass('loading-spinner'); } + var qs = refresh === true ? '?refresh' : ''; + $('.js-wifi-stations') + .addClass('loading-spinner') + .empty() + .load('/ajax/networking/wifi_stations.php'+qs, complete); + }; +} + +$(".js-reload-wifi-stations").on("click", loadWifiStations(true)); + +$(document).on("click", ".js-toggle-password", function(e) { + var button = $(e.target) + var field = $(button.data("target")); + if (field.is(":input")) { + e.preventDefault(); + + if (!button.data("__toggle-with-initial")) { + button.data("__toggle-with-initial", button.text()) + } + + if (field.attr("type") === "password") { + button.text(button.data("toggle-with")); + field.attr("type", "text"); + } else { + button.text(button.data("__toggle-with-initial")); + field.attr("type", "password"); + } + } +}); + +$(document).on("keyup", ".js-validate-psk", function(e) { + var field = $(e.target); + var colors = field.data("colors").split(","); + var target = $(field.data("target")); + if (field.val().length < 8 || field.val().length > 63) { + field.css("backgroundColor", colors[0]); + target.attr("disabled", true); + } else { + field.css("backgroundColor", colors[1]); + target.attr("disabled", false); + } +}); + +$(function() { + $('#theme-select').change(function() { + var theme = themes[$( "#theme-select" ).val() ]; + set_theme(theme); + }); +}); + +function set_theme(theme) { + $('link[title="main"]').attr('href', 'app/css/' + theme); + + // persist selected theme in cookie + setCookie('theme',theme,90); +} + +function setCookie(cname, cvalue, exdays) { + var d = new Date(); + d.setTime(d.getTime() + (exdays*24*60*60*1000)); + var expires = "expires="+ d.toUTCString(); + document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; +} + +var themes = { + "default": "custom.css", + "hackernews" : "hackernews.css", + "terminal" : "terminal.css", +} + +//Loads the correct sidebar on window load, +//collapses the sidebar on window resize. +// Sets the min-height of #page-wrapper to window size +$(function() { + $(window).bind("load resize", function() { + topOffset = 50; + width = (this.window.innerWidth > 0) ? this.window.innerWidth : this.screen.width; + if (width < 768) { + $('div.navbar-collapse').addClass('collapse'); + topOffset = 100; // 2-row-menu + } else { + $('div.navbar-collapse').removeClass('collapse'); + } + + height = ((this.window.innerHeight > 0) ? this.window.innerHeight : this.screen.height) - 1; + height = height - topOffset; + if (height < 1) height = 1; + if (height > topOffset) { + $("#page-wrapper").css("min-height", (height) + "px"); + } + }); + + var url = window.location; + var element = $('ul.nav a').filter(function() { + return this.href == url || url.href.indexOf(this.href) == 0; + }).addClass('active').parent().parent().addClass('in').parent(); + if (element.is('li')) { + element.addClass('active'); + } +}); + + +$(document) + .ajaxSend(setCSRFTokenHeader) + .ready(contentLoaded) + .ready(loadWifiStations()); diff --git a/app/js/custom.min.js b/app/js/custom.min.js new file mode 100644 index 00000000..67444fb6 --- /dev/null +++ b/app/js/custom.min.js @@ -0,0 +1,7 @@ +/*! + * RaspAP - RaspAP WiFi Configuration Portal v1.6.1 (https://github.com/billz/raspap-webgui) + * Copyright 2013-2019 RaspAP Developers + * Licensed under MIT (https://github.com/raspap-webgui/raspap-webgui/blob/master/LICENSE) + */ + +function msgShow(t,a){if(0==t)var e="success";else if(2==t||1==t)e="danger";return'"}function createNetmaskAddr(t){var a=[];for(i=0;i<4;i++){var e=Math.min(t,8);a.push(256-Math.pow(2,8-e)),t-=e}return a.join(".")}function loadSummary(a){$.post("/ajax/networking/get_ip_summary.php",{interface:a},function(t){jsonData=JSON.parse(t),console.log(jsonData),0==jsonData.return?$("#"+a+"-summary").html(jsonData.output.join("
")):2==jsonData.return&&$("#"+a+"-summary").append('")})}function getAllInterfaces(){$.get("/ajax/networking/get_all_interfaces.php",function(t){jsonData=JSON.parse(t),$.each(jsonData,function(t,a){loadSummary(a)})})}function setupTabs(){$('a[data-toggle="tab"]').on("shown.bs.tab",function(t){var a=$(t.target).attr("href");a.match("summary")||loadCurrentSettings(a.replace("#",""))})}function loadCurrentSettings(t){$.post("/ajax/networking/get_int_config.php",{interface:t},function(t){jsonData=JSON.parse(t),$.each(jsonData.output,function(t,a){var n=a.interface;$.each(a,function(t,a){switch(t){case"static":"true"==a?($("#"+n+"-static").click(),$("#"+n+"-nofailover").click()):$("#"+n+"-dhcp").click();break;case"failover":"true"===a?$("#"+n+"-failover").click():$("#"+n+"-nofailover").click();break;case"ip_address":var e=a.split("/");$("#"+n+"-ipaddress").val(e[0]),$("#"+n+"-netmask").val(createNetmaskAddr(e[1]));break;case"routers":$("#"+n+"-gateway").val(a);break;case"domain_name_server":svrsDNS=a.split(" "),$("#"+n+"-dnssvr").val(svrsDNS[0]),$("#"+n+"-dnssvralt").val(svrsDNS[1])}})})})}function saveNetworkSettings(t){var a=$("#frm-"+t).find(":input"),e={};$.each(a,function(t,a){"radio"==$(a).attr("type")?e[$(a).attr("id")]=$(a).prop("checked"):e[$(a).attr("id")]=$(a).val()}),e.interface=t,$.post("/ajax/networking/save_int_config.php",e,function(t){var a=JSON.parse(t);$("#msgNetworking").html(msgShow(a.return,a.output))})}function applyNetworkSettings(){$(this).data("int");arrFormData={generate:""},$.post("/ajax/networking/gen_int_config.php",arrFormData,function(t){console.log(t);var a=JSON.parse(t);$("#msgNetworking").html(msgShow(a.return,a.output))})}function setupBtns(){$("#btnSummaryRefresh").click(function(){getAllInterfaces()}),$(".intsave").click(function(){saveNetworkSettings($(this).data("int"))}),$(".intapply").click(function(){applyNetworkSettings()})}function setCSRFTokenHeader(t,a,e){var n=$("meta[name=csrf_token]").attr("content");/^(POST|PATCH|PUT|DELETE)$/i.test(e.type)&&a.setRequestHeader("X-CSRF-Token",n)}function contentLoaded(){switch(pageCurrent=window.location.href.split("?")[1].split("=")[1],pageCurrent=pageCurrent.replace("#",""),$("#side-menu").metisMenu(),pageCurrent){case"network_conf":getAllInterfaces(),setupTabs(),setupBtns()}}function loadWifiStations(a){return function(){var t=!0===a?"?refresh":"";$(".js-wifi-stations").addClass("loading-spinner").empty().load("/ajax/networking/wifi_stations.php"+t,function(){$(this).removeClass("loading-spinner")})}}$(document).on("click",".js-add-dhcp-static-lease",function(t){t.preventDefault();var a=$(".js-new-dhcp-static-lease"),e=$("input[name=mac]",a).val().trim(),n=$("input[name=ip]",a).val().trim();if(""!=e&&""!=n){var i=$("#js-dhcp-static-lease-row").html().replace("{{ mac }}",e).replace("{{ ip }}",n);$(".js-dhcp-static-lease-container").append(i),$("input[name=mac]",a).val(""),$("input[name=ip]",a).val("")}}),$(document).on("click",".js-remove-dhcp-static-lease",function(t){t.preventDefault(),$(this).parents(".js-dhcp-static-lease-row").remove()}),$(document).on("submit",".js-dhcp-settings-form",function(t){$(".js-add-dhcp-static-lease").trigger("click")}),$(".js-reload-wifi-stations").on("click",loadWifiStations(!0)),$(document).on("click",".js-toggle-password",function(t){var a=$(t.target),e=$(a.data("target"));e.is(":input")&&(t.preventDefault(),a.data("__toggle-with-initial")||a.data("__toggle-with-initial",a.text()),"password"===e.attr("type")?(a.text(a.data("toggle-with")),e.attr("type","text")):(a.text(a.data("__toggle-with-initial")),e.attr("type","password")))}),$(document).on("keyup",".js-validate-psk",function(t){var a=$(t.target),e=a.data("colors").split(","),n=$(a.data("target"));a.val().length<8||63