瀏覽代碼

[WebUI] Migrate to Bootstrap 4.5

tags/2.6
moisseev 3 年之前
父節點
當前提交
fb28a563f9

+ 60
- 0
interface/css/FooTable.Glyphicons.css 查看文件

@@ -0,0 +1,60 @@
/* Glyphicons Icons - We're not actually using Glyphicons classes but instead provide a simple mapping from Glyphicons to FooTable class names. */
.fooicon {
position: relative;
top: 1px;
display: inline-block;
font-family: 'Glyphicons Halflings' !important; /* stylelint-disable-line font-family-no-missing-generic-family-keyword */
font-style: normal;
font-weight: 400;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.fooicon::before,
.fooicon::after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.fooicon-loader::before {
content: "\e030";
}
.fooicon-plus::before {
content: "\2b";
}
.fooicon-minus::before {
content: "\2212";
}
.fooicon-search::before {
content: "\e003";
}
.fooicon-remove::before {
content: "\e014";
}
.fooicon-sort::before {
content: "\e150";
}
.fooicon-sort-asc::before {
content: "\e155";
}
.fooicon-sort-desc::before {
content: "\e156";
}
.fooicon-pencil::before {
content: "\270f";
}
.fooicon-trash::before {
content: "\e020";
}
.fooicon-eye-close::before {
content: "\e106";
}
.fooicon-flash::before {
content: "\e162";
}
.fooicon-cog::before {
content: "\e019";
}
.fooicon-stats::before {
content: "\e185";
}

+ 4
- 3
interface/css/bootstrap.min.css
文件差異過大導致無法顯示
查看文件


+ 1
- 0
interface/css/d3evolution.css 查看文件

@@ -5,6 +5,7 @@
font-size: 17px;
}
.d3evolution .y.label {
font-size: 11px;
font-weight: normal;
}
.d3evolution .grid line {

+ 805
- 0
interface/css/font-glyphicons.css 查看文件

@@ -0,0 +1,805 @@
/* https://gist.github.com/itchief/e3aa0888c959ee367cd69f5d83ff06f9 */

@font-face {
font-family: "Glyphicons Halflings";
src: url("../fonts/glyphicons-halflings-regular.eot");
src: url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg");
}
.glyphicon {
position: relative;
top: 1px;
display: inline-block;
font-family: "Glyphicons Halflings"; /* stylelint-disable-line font-family-no-missing-generic-family-keyword */
font-style: normal;
font-weight: 400;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.glyphicon-asterisk::before {
content: "\002a";
}
.glyphicon-plus::before {
content: "\002b";
}
.glyphicon-euro::before,
.glyphicon-eur::before {
content: "\20ac";
}
.glyphicon-minus::before {
content: "\2212";
}
.glyphicon-cloud::before {
content: "\2601";
}
.glyphicon-envelope::before {
content: "\2709";
}
.glyphicon-pencil::before {
content: "\270f";
}
.glyphicon-glass::before {
content: "\e001";
}
.glyphicon-music::before {
content: "\e002";
}
.glyphicon-search::before {
content: "\e003";
}
.glyphicon-heart::before {
content: "\e005";
}
.glyphicon-star::before {
content: "\e006";
}
.glyphicon-star-empty::before {
content: "\e007";
}
.glyphicon-user::before {
content: "\e008";
}
.glyphicon-film::before {
content: "\e009";
}
.glyphicon-th-large::before {
content: "\e010";
}
.glyphicon-th::before {
content: "\e011";
}
.glyphicon-th-list::before {
content: "\e012";
}
.glyphicon-ok::before {
content: "\e013";
}
.glyphicon-remove::before {
content: "\e014";
}
.glyphicon-zoom-in::before {
content: "\e015";
}
.glyphicon-zoom-out::before {
content: "\e016";
}
.glyphicon-off::before {
content: "\e017";
}
.glyphicon-signal::before {
content: "\e018";
}
.glyphicon-cog::before {
content: "\e019";
}
.glyphicon-trash::before {
content: "\e020";
}
.glyphicon-home::before {
content: "\e021";
}
.glyphicon-file::before {
content: "\e022";
}
.glyphicon-time::before {
content: "\e023";
}
.glyphicon-road::before {
content: "\e024";
}
.glyphicon-download-alt::before {
content: "\e025";
}
.glyphicon-download::before {
content: "\e026";
}
.glyphicon-upload::before {
content: "\e027";
}
.glyphicon-inbox::before {
content: "\e028";
}
.glyphicon-play-circle::before {
content: "\e029";
}
.glyphicon-repeat::before {
content: "\e030";
}
.glyphicon-refresh::before {
content: "\e031";
}
.glyphicon-list-alt::before {
content: "\e032";
}
.glyphicon-lock::before {
content: "\e033";
}
.glyphicon-flag::before {
content: "\e034";
}
.glyphicon-headphones::before {
content: "\e035";
}
.glyphicon-volume-off::before {
content: "\e036";
}
.glyphicon-volume-down::before {
content: "\e037";
}
.glyphicon-volume-up::before {
content: "\e038";
}
.glyphicon-qrcode::before {
content: "\e039";
}
.glyphicon-barcode::before {
content: "\e040";
}
.glyphicon-tag::before {
content: "\e041";
}
.glyphicon-tags::before {
content: "\e042";
}
.glyphicon-book::before {
content: "\e043";
}
.glyphicon-bookmark::before {
content: "\e044";
}
.glyphicon-print::before {
content: "\e045";
}
.glyphicon-camera::before {
content: "\e046";
}
.glyphicon-font::before {
content: "\e047";
}
.glyphicon-bold::before {
content: "\e048";
}
.glyphicon-italic::before {
content: "\e049";
}
.glyphicon-text-height::before {
content: "\e050";
}
.glyphicon-text-width::before {
content: "\e051";
}
.glyphicon-align-left::before {
content: "\e052";
}
.glyphicon-align-center::before {
content: "\e053";
}
.glyphicon-align-right::before {
content: "\e054";
}
.glyphicon-align-justify::before {
content: "\e055";
}
.glyphicon-list::before {
content: "\e056";
}
.glyphicon-indent-left::before {
content: "\e057";
}
.glyphicon-indent-right::before {
content: "\e058";
}
.glyphicon-facetime-video::before {
content: "\e059";
}
.glyphicon-picture::before {
content: "\e060";
}
.glyphicon-map-marker::before {
content: "\e062";
}
.glyphicon-adjust::before {
content: "\e063";
}
.glyphicon-tint::before {
content: "\e064";
}
.glyphicon-edit::before {
content: "\e065";
}
.glyphicon-share::before {
content: "\e066";
}
.glyphicon-check::before {
content: "\e067";
}
.glyphicon-move::before {
content: "\e068";
}
.glyphicon-step-backward::before {
content: "\e069";
}
.glyphicon-fast-backward::before {
content: "\e070";
}
.glyphicon-backward::before {
content: "\e071";
}
.glyphicon-play::before {
content: "\e072";
}
.glyphicon-pause::before {
content: "\e073";
}
.glyphicon-stop::before {
content: "\e074";
}
.glyphicon-forward::before {
content: "\e075";
}
.glyphicon-fast-forward::before {
content: "\e076";
}
.glyphicon-step-forward::before {
content: "\e077";
}
.glyphicon-eject::before {
content: "\e078";
}
.glyphicon-chevron-left::before {
content: "\e079";
}
.glyphicon-chevron-right::before {
content: "\e080";
}
.glyphicon-plus-sign::before {
content: "\e081";
}
.glyphicon-minus-sign::before {
content: "\e082";
}
.glyphicon-remove-sign::before {
content: "\e083";
}
.glyphicon-ok-sign::before {
content: "\e084";
}
.glyphicon-question-sign::before {
content: "\e085";
}
.glyphicon-info-sign::before {
content: "\e086";
}
.glyphicon-screenshot::before {
content: "\e087";
}
.glyphicon-remove-circle::before {
content: "\e088";
}
.glyphicon-ok-circle::before {
content: "\e089";
}
.glyphicon-ban-circle::before {
content: "\e090";
}
.glyphicon-arrow-left::before {
content: "\e091";
}
.glyphicon-arrow-right::before {
content: "\e092";
}
.glyphicon-arrow-up::before {
content: "\e093";
}
.glyphicon-arrow-down::before {
content: "\e094";
}
.glyphicon-share-alt::before {
content: "\e095";
}
.glyphicon-resize-full::before {
content: "\e096";
}
.glyphicon-resize-small::before {
content: "\e097";
}
.glyphicon-exclamation-sign::before {
content: "\e101";
}
.glyphicon-gift::before {
content: "\e102";
}
.glyphicon-leaf::before {
content: "\e103";
}
.glyphicon-fire::before {
content: "\e104";
}
.glyphicon-eye-open::before {
content: "\e105";
}
.glyphicon-eye-close::before {
content: "\e106";
}
.glyphicon-warning-sign::before {
content: "\e107";
}
.glyphicon-plane::before {
content: "\e108";
}
.glyphicon-calendar::before {
content: "\e109";
}
.glyphicon-random::before {
content: "\e110";
}
.glyphicon-comment::before {
content: "\e111";
}
.glyphicon-magnet::before {
content: "\e112";
}
.glyphicon-chevron-up::before {
content: "\e113";
}
.glyphicon-chevron-down::before {
content: "\e114";
}
.glyphicon-retweet::before {
content: "\e115";
}
.glyphicon-shopping-cart::before {
content: "\e116";
}
.glyphicon-folder-close::before {
content: "\e117";
}
.glyphicon-folder-open::before {
content: "\e118";
}
.glyphicon-resize-vertical::before {
content: "\e119";
}
.glyphicon-resize-horizontal::before {
content: "\e120";
}
.glyphicon-hdd::before {
content: "\e121";
}
.glyphicon-bullhorn::before {
content: "\e122";
}
.glyphicon-bell::before {
content: "\e123";
}
.glyphicon-certificate::before {
content: "\e124";
}
.glyphicon-thumbs-up::before {
content: "\e125";
}
.glyphicon-thumbs-down::before {
content: "\e126";
}
.glyphicon-hand-right::before {
content: "\e127";
}
.glyphicon-hand-left::before {
content: "\e128";
}
.glyphicon-hand-up::before {
content: "\e129";
}
.glyphicon-hand-down::before {
content: "\e130";
}
.glyphicon-circle-arrow-right::before {
content: "\e131";
}
.glyphicon-circle-arrow-left::before {
content: "\e132";
}
.glyphicon-circle-arrow-up::before {
content: "\e133";
}
.glyphicon-circle-arrow-down::before {
content: "\e134";
}
.glyphicon-globe::before {
content: "\e135";
}
.glyphicon-wrench::before {
content: "\e136";
}
.glyphicon-tasks::before {
content: "\e137";
}
.glyphicon-filter::before {
content: "\e138";
}
.glyphicon-briefcase::before {
content: "\e139";
}
.glyphicon-fullscreen::before {
content: "\e140";
}
.glyphicon-dashboard::before {
content: "\e141";
}
.glyphicon-paperclip::before {
content: "\e142";
}
.glyphicon-heart-empty::before {
content: "\e143";
}
.glyphicon-link::before {
content: "\e144";
}
.glyphicon-phone::before {
content: "\e145";
}
.glyphicon-pushpin::before {
content: "\e146";
}
.glyphicon-usd::before {
content: "\e148";
}
.glyphicon-gbp::before {
content: "\e149";
}
.glyphicon-sort::before {
content: "\e150";
}
.glyphicon-sort-by-alphabet::before {
content: "\e151";
}
.glyphicon-sort-by-alphabet-alt::before {
content: "\e152";
}
.glyphicon-sort-by-order::before {
content: "\e153";
}
.glyphicon-sort-by-order-alt::before {
content: "\e154";
}
.glyphicon-sort-by-attributes::before {
content: "\e155";
}
.glyphicon-sort-by-attributes-alt::before {
content: "\e156";
}
.glyphicon-unchecked::before {
content: "\e157";
}
.glyphicon-expand::before {
content: "\e158";
}
.glyphicon-collapse-down::before {
content: "\e159";
}
.glyphicon-collapse-up::before {
content: "\e160";
}
.glyphicon-log-in::before {
content: "\e161";
}
.glyphicon-flash::before {
content: "\e162";
}
.glyphicon-log-out::before {
content: "\e163";
}
.glyphicon-new-window::before {
content: "\e164";
}
.glyphicon-record::before {
content: "\e165";
}
.glyphicon-save::before {
content: "\e166";
}
.glyphicon-open::before {
content: "\e167";
}
.glyphicon-saved::before {
content: "\e168";
}
.glyphicon-import::before {
content: "\e169";
}
.glyphicon-export::before {
content: "\e170";
}
.glyphicon-send::before {
content: "\e171";
}
.glyphicon-floppy-disk::before {
content: "\e172";
}
.glyphicon-floppy-saved::before {
content: "\e173";
}
.glyphicon-floppy-remove::before {
content: "\e174";
}
.glyphicon-floppy-save::before {
content: "\e175";
}
.glyphicon-floppy-open::before {
content: "\e176";
}
.glyphicon-credit-card::before {
content: "\e177";
}
.glyphicon-transfer::before {
content: "\e178";
}
.glyphicon-cutlery::before {
content: "\e179";
}
.glyphicon-header::before {
content: "\e180";
}
.glyphicon-compressed::before {
content: "\e181";
}
.glyphicon-earphone::before {
content: "\e182";
}
.glyphicon-phone-alt::before {
content: "\e183";
}
.glyphicon-tower::before {
content: "\e184";
}
.glyphicon-stats::before {
content: "\e185";
}
.glyphicon-sd-video::before {
content: "\e186";
}
.glyphicon-hd-video::before {
content: "\e187";
}
.glyphicon-subtitles::before {
content: "\e188";
}
.glyphicon-sound-stereo::before {
content: "\e189";
}
.glyphicon-sound-dolby::before {
content: "\e190";
}
.glyphicon-sound-5-1::before {
content: "\e191";
}
.glyphicon-sound-6-1::before {
content: "\e192";
}
.glyphicon-sound-7-1::before {
content: "\e193";
}
.glyphicon-copyright-mark::before {
content: "\e194";
}
.glyphicon-registration-mark::before {
content: "\e195";
}
.glyphicon-cloud-download::before {
content: "\e197";
}
.glyphicon-cloud-upload::before {
content: "\e198";
}
.glyphicon-tree-conifer::before {
content: "\e199";
}
.glyphicon-tree-deciduous::before {
content: "\e200";
}
.glyphicon-cd::before {
content: "\e201";
}
.glyphicon-save-file::before {
content: "\e202";
}
.glyphicon-open-file::before {
content: "\e203";
}
.glyphicon-level-up::before {
content: "\e204";
}
.glyphicon-copy::before {
content: "\e205";
}
.glyphicon-paste::before {
content: "\e206";
}
.glyphicon-alert::before {
content: "\e209";
}
.glyphicon-equalizer::before {
content: "\e210";
}
.glyphicon-king::before {
content: "\e211";
}
.glyphicon-queen::before {
content: "\e212";
}
.glyphicon-pawn::before {
content: "\e213";
}
.glyphicon-bishop::before {
content: "\e214";
}
.glyphicon-knight::before {
content: "\e215";
}
.glyphicon-baby-formula::before {
content: "\e216";
}
.glyphicon-tent::before {
content: "\26fa";
}
.glyphicon-blackboard::before {
content: "\e218";
}
.glyphicon-bed::before {
content: "\e219";
}
.glyphicon-apple::before {
content: "\f8ff";
}
.glyphicon-erase::before {
content: "\e221";
}
.glyphicon-hourglass::before {
content: "\231b";
}
.glyphicon-lamp::before {
content: "\e223";
}
.glyphicon-duplicate::before {
content: "\e224";
}
.glyphicon-piggy-bank::before {
content: "\e225";
}
.glyphicon-scissors::before {
content: "\e226";
}
.glyphicon-bitcoin::before {
content: "\e227";
}
.glyphicon-btc::before {
content: "\e227";
}
.glyphicon-xbt::before {
content: "\e227";
}
.glyphicon-yen::before {
content: "\00a5";
}
.glyphicon-jpy::before {
content: "\00a5";
}
.glyphicon-ruble::before {
content: "\20bd";
}
.glyphicon-rub::before {
content: "\20bd";
}
.glyphicon-scale::before {
content: "\e230";
}
.glyphicon-ice-lolly::before {
content: "\e231";
}
.glyphicon-ice-lolly-tasted::before {
content: "\e232";
}
.glyphicon-education::before {
content: "\e233";
}
.glyphicon-option-horizontal::before {
content: "\e234";
}
.glyphicon-option-vertical::before {
content: "\e235";
}
.glyphicon-menu-hamburger::before {
content: "\e236";
}
.glyphicon-modal-window::before {
content: "\e237";
}
.glyphicon-oil::before {
content: "\e238";
}
.glyphicon-grain::before {
content: "\e239";
}
.glyphicon-sunglasses::before {
content: "\e240";
}
.glyphicon-text-size::before {
content: "\e241";
}
.glyphicon-text-color::before {
content: "\e242";
}
.glyphicon-text-background::before {
content: "\e243";
}
.glyphicon-object-align-top::before {
content: "\e244";
}
.glyphicon-object-align-bottom::before {
content: "\e245";
}
.glyphicon-object-align-horizontal::before {
content: "\e246";
}
.glyphicon-object-align-left::before {
content: "\e247";
}
.glyphicon-object-align-vertical::before {
content: "\e248";
}
.glyphicon-object-align-right::before {
content: "\e249";
}
.glyphicon-triangle-right::before {
content: "\e250";
}
.glyphicon-triangle-left::before {
content: "\e251";
}
.glyphicon-triangle-bottom::before {
content: "\e252";
}
.glyphicon-triangle-top::before {
content: "\e253";
}
.glyphicon-console::before {
content: "\e254";
}
.glyphicon-superscript::before {
content: "\e255";
}
.glyphicon-subscript::before {
content: "\e256";
}
.glyphicon-menu-left::before {
content: "\e257";
}
.glyphicon-menu-right::before {
content: "\e258";
}
.glyphicon-menu-down::before {
content: "\e259";
}
.glyphicon-menu-up::before {
content: "\e260";
}

+ 0
- 1
interface/css/footable.bootstrap.min.css
文件差異過大導致無法顯示
查看文件


+ 1
- 0
interface/css/footable.standalone.min.css
文件差異過大導致無法顯示
查看文件


+ 78
- 40
interface/css/rspamd.css 查看文件

@@ -23,6 +23,58 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/

/* bootstrap 4 overrides */
:root {
font-size: 14px;
}
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.navbar {
padding-top: 0;
padding-bottom: 0;
margin-bottom: 20px;
}
.nav-pills .nav-link.active {
background-color: #e7e7e7;
}
.danger > td {
background-color: #fbe9e5;
}
.success > td {
background-color: #eef9e7;
}

/* bootstrap 4 additionals */
.btn-group-xs > .btn,
.btn-xs {
padding: .06rem .3rem;
font-size: .875rem;
line-height: 1.5;
border-radius: .2rem;
}
.btn.disabled,
.btn[disabled],
fieldset[disabled] .btn {
cursor: not-allowed;
}

/* Tweak FooTable for Bootstrap 4 */
.footable .dropdown-toggle::after {
content: none;
}
.footable .btn-outline-secondary {
border-color: rgb(108, 117, 125);
}
.footable .btn-group > .btn:not(:first-child),
.footable .btn-group > .btn-group:not(:first-child) > .btn {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.footable .input-sm {
height: 30px;
}

a {
outline: none;
}
@@ -39,9 +91,9 @@ textarea {
.navbar-brand > img {
height: 50px;
}
.btn-group > .btn.btn-default.radius-right {
border-top-right-radius: 4px !important;
border-bottom-right-radius: 4px !important;
.btn-group > .btn.radius-right {
border-top-right-radius: .25rem !important;
border-bottom-right-radius: .25rem !important;
}
.chart-content {
text-align: center;
@@ -86,12 +138,7 @@ table#symbolsTable input[type="number"] {
padding: 8px;
}
.alert {
position: relative;
padding: 8px 0 8px;
margin: 0 0 4px;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
background-color: #fcf8e3;
border-bottom: 1px solid #fbeed5;
margin-bottom: 4px;
}
.alert.alert-modal {
top: 0;
@@ -107,12 +154,6 @@ table#symbolsTable input[type="number"] {
.alert h4 {
margin: 0;
}
.alert .close {
position: relative;
top: 0;
right: 9px;
line-height: 20px;
}
.alert-success {
color: #468847;
background: #dff0d8;
@@ -251,7 +292,7 @@ table#symbolsTable input[type="number"] {
margin: 0 10px 10px 0;
padding: 0 10px;
}
.stat-box:not(.pull-right) {
.stat-box:not(.float-right) {
min-width: 90px;
}
.stat-box .widget {
@@ -288,6 +329,7 @@ table#symbolsTable input[type="number"] {
font-size: 26px;
margin-bottom: 3px;
margin-top: 6px;
font-weight: 700;
}
.nomargin {
margin: 0 !important;
@@ -451,10 +493,10 @@ td.maps-cell {
}

.scorebar-spam {
background-color: rgba(240, 0, 0, 0.1);
background-color: rgba(240, 0, 0, 0.1) !important;
}
.scorebar-ham {
background: rgba(100, 230, 80, 0.1);
background: rgba(100, 230, 80, 0.1) !important;
}

input.radio {
@@ -475,29 +517,12 @@ input.radio {
height: 1px;
}

/* Form element background for validation states */
.has-error .form-control {
background-color: #fbe9e5;
}
.has-success .form-control {
background-color: #eef9e7;
}

/* Bootstrap 4 spacing */
.mb-0 {
margin-bottom: 0 !important;
}

/* Custom sizing */
.w-1 {
width: 1% !important;
}

#row-main {
margin-top: -12px;
margin-bottom: -12px;
display: flex;
flex-wrap: wrap;
clear: both;
/* necessary to hide collapsed sidebar */
overflow-x: hidden;
}
@@ -544,6 +569,13 @@ input.radio {
width: 20px;
border-bottom: none;
}
.sidebar-nav .nav-link,
.sidebar-nav .nav-link:hover {
border: 1px solid #ddd;
border-bottom: none;
padding-left: 1rem;
padding-right: 1rem;
}
#sidebar-tab-left > a,
#sidebar-tab-right > a {
background-color: #ffe;
@@ -560,14 +592,16 @@ input.radio {
}
@media (min-width: 992px) {
.sidebar-nav {
margin-left: -2px;
margin-right: -2px;
margin-left: -1px;
margin-right: -1px;
display: block;
}
#content {
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
}
#sidebar-tab-left {
display: flex;
transform: translateX(-50%) rotate(90deg) translate(50%, -50%);
}
#sidebar-tab-right {
@@ -577,8 +611,8 @@ input.radio {
}
@media (max-width: 991.98px) {
.sidebar-nav {
margin-top: -2px;
margin-bottom: -2px;
margin-top: -1px;
margin-bottom: -1px;
}
#content {
border-top: 1px solid #ddd;
@@ -589,3 +623,7 @@ input.radio {
right: 0;
}
}

#navBar .navbar-nav .nav-link {
padding: 15px;
}

+ 142
- 146
interface/index.html 查看文件

@@ -15,7 +15,9 @@
<meta name="msapplication-TileColor" content="#2b5797">

<link href="./css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="./css/footable.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="./css/font-glyphicons.css">
<link rel="stylesheet" type="text/css" href="./css/footable.standalone.min.css"/>
<link rel="stylesheet" type="text/css" href="./css/FooTable.Glyphicons.css"/>
<link rel="stylesheet" type="text/css" href="./css/d3evolution.css">
<link rel="stylesheet" type="text/css" href="./css/nprogress.css"/>
<link href="./css/rspamd.css" rel="stylesheet">
@@ -23,51 +25,49 @@

<body>

<nav class="navbar navbar-default" id="navBar">
<div class="container-fluid">
<div class="navbar-header navbar-brand">
<img src="./img/rspamd_logo_navbar.png" alt="Rspamd">
</div>
<form class="navbar-form navbar-left">
<select id="selSrv" class="form-control"></select>
</form>
<ul class="nav navbar-nav nav-pills nav-tabs-sticky" role="tablist">
<li role="presentation"><a id="status_nav" aria-controls="status" role="tab" href="#status" data-toggle="tab">Status</a></li>

<li role="presentation"><a id="throughput_nav" aria-controls="throughput" role="tab" href="#throughput" data-toggle="tab">Throughput</a></li>

<li role="presentation"><a id="configuration_nav" aria-controls="configuration" role="tab" href="#configuration" data-toggle="tab">Configuration</a></li>
<li role="presentation"><a id="symbols_nav" aria-controls="symbols" role="tab" href="#symbols" data-toggle="tab">Symbols</a></li>
<li role="presentation"><a id="scan_nav" aria-controls="scan" role="tab" href="#scan" data-toggle="tab">Scan<span class="learn" style="display: none;">/Learn</span></a></li>
<li role="presentation"><a id="selectors_nav" aria-controls="selectors" role="tab" href="#selectors" data-toggle="tab" style="display: none;">Test selectors</a></li>
<li role="presentation"><a id="history_nav" aria-controls="history" role="tab" href="#history" data-toggle="tab">History</a></li>
</ul>
<form class="navbar-form navbar-right" style="display: none;">
<div class="btn-group">
<a href="#" class="btn btn-default" role="button" data-toggle="button" id="refresh" style="display: none;"><i class="glyphicon glyphicon-refresh glyphicon-spin"></i> Refresh</a>
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown" id="autoRefresh">
<span id="countdown">--:--</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li class="preset"><a href="#" data-value=null>Disable</a></li>
<li class="preset divider" role="separator"></li>
<li class="preset active"><a href="#" data-value="10000">10 seconds</a></li>
<li class="preset"><a href="#" data-value="30000">30 seconds</a></li>
<li class="preset divider" role="separator"></li>
<li class="preset"><a href="#" data-value="60000">1 minute</a></li>
<li class="preset"><a href="#" data-value="600000">10 minutes</a></li>
<li class="preset"><a href="#" data-value="1800000">30 minutes</a></li>
<li class="preset divider" role="separator"></li>
<li class="preset"><a href="#" data-value="3600000">1 hour</a></li>

<li class="dynamic"><a href="#" data-value=null>Disable</a></li>
<li class="dynamic divider" role="separator"></li>
<li class="dynamic active"><a href="#" id="dynamic-item" data-value="3600000">1 hour</a></li>
</ul>
</div>
<a href="#" class="btn btn-default" role="button" data-toggle="button" id="disconnect"><i class="glyphicon glyphicon-off"></i> Disconnect</a>
</form>
<nav class="navbar navbar-light bg-light navbar-expand-md" id="navBar">
<form class="form-inline mr-auto">
<div class="navbar-header navbar-brand">
<img src="./img/rspamd_logo_navbar.png" alt="Rspamd">
</div>
<select id="selSrv" class="form-control"></select>
</form>
<ul class="nav navbar-nav nav-pills nav-tabs-sticky" role="tablist">
<li role="presentation" class="nav-item"><a id="status_nav" aria-controls="status" role="tab" href="#status" data-toggle="tab" class="nav-link">Status</a></li>

<li role="presentation" class="nav-item"><a id="throughput_nav" aria-controls="throughput" role="tab" href="#throughput" data-toggle="tab" class="nav-link">Throughput</a></li>

<li role="presentation" class="nav-item"><a id="configuration_nav" aria-controls="configuration" role="tab" href="#configuration" data-toggle="tab" class="nav-link">Configuration</a></li>
<li role="presentation" class="nav-item"><a id="symbols_nav" aria-controls="symbols" role="tab" href="#symbols" data-toggle="tab" class="nav-link">Symbols</a></li>
<li role="presentation" class="nav-item"><a id="scan_nav" aria-controls="scan" role="tab" href="#scan" data-toggle="tab" class="nav-link">Scan<span class="learn" style="display: none;">/Learn</span></a></li>
<li role="presentation" class="nav-item"><a id="selectors_nav" aria-controls="selectors" role="tab" href="#selectors" data-toggle="tab" class="nav-link" style="display: none;">Test selectors</a></li>
<li role="presentation" class="nav-item"><a id="history_nav" aria-controls="history" role="tab" href="#history" data-toggle="tab" class="nav-link">History</a></li>
</ul>
<form class="form-inline ml-auto" id="navbar-btn-form" style="display: none;">
<div class="btn-group">
<a href="#" class="btn btn-outline-secondary" role="button" data-toggle="button" id="refresh" style="display: none;"><i class="glyphicon glyphicon-refresh glyphicon-spin"></i> Refresh</a>
<button class="btn btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" id="autoRefresh">
<span id="countdown">--:--</span>
</button>
<div class="dropdown-menu">
<a class="dropdown-item preset" href="#" data-value=null>Disable</a>
<div class="dropdown-divider preset" role="separator"></div>
<a class="dropdown-item preset active" href="#" data-value="10000">10 seconds</a>
<a class="dropdown-item preset" href="#" data-value="30000">30 seconds</a>
<div class="dropdown-divider preset" role="separator"></div>
<a class="dropdown-item preset" href="#" data-value="60000">1 minute</a>
<a class="dropdown-item preset" href="#" data-value="600000">10 minutes</a>
<a class="dropdown-item preset" href="#" data-value="1800000">30 minutes</a>
<div class="dropdown-divider preset" role="separator"></div>
<a class="dropdown-item preset" href="#" data-value="3600000">1 hour</a>

<a class="dropdown-item dynamic" href="#" data-value=null>Disable</a>
<div class="dropdown-divider dynamic" role="separator"></div>
<a class="dropdown-item dynamic active" href="#" id="dynamic-item" data-value="3600000">1 hour</a>
</div>
</div>
<a href="#" class="btn btn-outline-secondary ml-2" role="button" data-toggle="button" id="disconnect"><i class="glyphicon glyphicon-off"></i> Disconnect</a>
</form>
</nav>

<div class="notification-area"></div>
@@ -79,7 +79,7 @@
<div class="tab-content">
<div class="tab-pane active" id="status">
<div class="row">
<div class="col-md-12">
<div class="col-lg-12">
<div class="widget-box widget-plain">
<ul id="statWidgets" class="stat-boxes" style="display: none;">
</ul>
@@ -87,14 +87,14 @@
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="col-lg-6">
<div class="widget-box">
<div class="widget-title">
<span class="icon"><i class="glyphicon glyphicon-tasks"></i></span>
<h5>Servers</h5>
</div>
<div class="widget-content nopadding table-responsive">
<table class="table table-hover table-bordered text-nowrap mb-0" id="clusterTable">
<table class="table table-sm table-hover table-bordered text-nowrap mb-0" id="clusterTable">
<thead>
<tr>
<th></th>
@@ -110,7 +110,7 @@
</div>
</div>
</div>
<div class="col-md-6">
<div class="col-lg-6">
<div class="widget-box">
<div class="widget-title">
<span class="icon"><i class="glyphicon glyphicon-signal"></i></span>
@@ -211,7 +211,7 @@
<span class="icon"><i class="glyphicon glyphicon-list"></i></span><h5>Lists</h5>
</div>
<div class="widget-content nopadding">
<table class="table table-condensed table-hover" id="listMaps">
<table class="table table-sm table-hover" id="listMaps">
</table>
</div>
</div>
@@ -219,14 +219,14 @@

<div class="tab-pane" id="symbols">
<div class="widget-box">
<div class="widget-title">
<div class="buttons pull-right">
<div class="widget-title d-flex">
<span class="icon"><i class="glyphicon glyphicon-tasks"></i></span>
<h5 class="ml-0">Symbols and rules</h5>
<div class="buttons align-self-center ml-auto mr-1">
<button class="btn btn-info btn-sm" id="updateSymbols">
<i class="glyphicon glyphicon-refresh"></i> Update
</button>
</div>
<span class="icon"><i class="glyphicon glyphicon-tasks"></i></span>
<h5>Symbols and rules</h5>
</div>
<div class="widget-content nopadding">
<table class="table table-hover" id="symbolsTable"></table>
@@ -243,13 +243,13 @@
<div class="widget-content">
<h5>Message source:</h5>
<div class="row">
<form class="col-md-12" id="scanForm">
<form class="col-lg-12" id="scanForm">
<div class="form-group">
<textarea class="form-control" id="scanMsgSource" rows="10" placeholder="Paste raw message source"></textarea>
</div>
<div class="form-group">
<button type="submit" class="btn btn-default btn-primary" data-upload="scan"><i class="glyphicon glyphicon-search"></i> Scan message</button>
<button class="btn btn-default pull-right" id="scanClean"><i class="glyphicon glyphicon-trash"></i> Clean form</button>
<button type="submit" class="btn btn-primary" data-upload="scan"><i class="glyphicon glyphicon-search"></i> Scan message</button>
<button class="btn btn-secondary float-right" id="scanClean"><i class="glyphicon glyphicon-trash"></i> Clean form</button>
</div>
</form>
</div>
@@ -262,10 +262,10 @@
</div>
<div class="widget-content">
<div class="row">
<div class="col-md-6">
<div class="well well-sm">
<div class="col-lg-6">
<div class="card bg-light card-body mb-3 card bg-faded p-2 mb-3">
<h5>Learn Bayessian classifier:</h5>
<form class="form-inline">
<h5>Learn Bayessian classifier:</h5>
<div class="form-group">
<div class="btn-group">
<button class="btn btn-success" type="button" data-upload="ham" disabled><i class="glyphicon glyphicon-thumbs-up"></i> Upload HAM</button>
@@ -275,19 +275,19 @@
</form>
</div>
</div>
<div class="col-md-6">
<div class="well well-sm">
<div class="col-lg-6">
<div class="card bg-light card-body mb-3 card bg-faded p-2 mb-3">
<h5>Learn Fuzzy storage:</h5>
<form class="form-inline">
<h5>Learn Fuzzy storage:</h5>
<div class="form-group">
<label for="fuzzyFlagText">Flag:</label>
<input name="fuzzyFlagText" id="fuzzyFlagText" class="form-control" type="number" value="1"/>
<input name="fuzzyFlagText" id="fuzzyFlagText" class="form-control ml-1" type="number" value="1"/>
</div>
<div class="form-group">
<div class="form-group ml-2">
<label for="fuzzyWeightText">Weight:</label>
<input name="fuzzyWeightText" id="fuzzyWeightText" class="form-control" type="number" value="1"/>
<input name="fuzzyWeightText" id="fuzzyWeightText" class="form-control ml-1" type="number" value="1"/>
</div>
<button class="btn btn-warning" data-upload="fuzzy" disabled><i class="glyphicon glyphicon-upload"></i> Upload FUZZY</button>
<button class="btn btn-warning ml-2" data-upload="fuzzy" disabled><i class="glyphicon glyphicon-upload"></i> Upload FUZZY</button>
</form>
</div>
</div>
@@ -296,22 +296,22 @@
</div>

<div class="widget-box">
<div class="widget-title">
<div id="scanResult" class="form-inline widget-title-form input-group-sm pull-right buttons">
<div class="widget-title d-flex">
<span class="icon"><i class="glyphicon glyphicon-eye-open"></i></span>
<h5 class="ml-0">Scan results history</h5>
<div id="scanResult" class="form-inline widget-title-form input-group-sm buttons align-self-center ml-auto mr-1">
<label for="selSymOrder_scan">Symbols order:</label>
<select id="selSymOrder_scan" class="form-control">
<select id="selSymOrder_scan" class="form-control ml-1">
<option value="magnitude" selected>Score magnitude</option>
<option value="score">Score value</option>
<option value="name">Name</option>
</select>
<label for="scan_page_size">Rows per page:</label>
<input id="scan_page_size" class="form-control" value="25" min="1" type="number">
<button class="btn btn-default btn-sm" id="cleanScanHistory">
<label for="scan_page_size" class="ml-2">Rows per page:</label>
<input id="scan_page_size" class="form-control ml-1" value="25" min="1" type="number">
<button class="btn btn-secondary btn-sm ml-2" id="cleanScanHistory">
<i class="glyphicon glyphicon-trash"></i> Clean history
</button>
</div>
<span class="icon"><i class="glyphicon glyphicon-eye-open"></i></span>
<h5>Scan results history</h5>
</div>
<div class="widget-content nopadding">
<div id="scanLog">
@@ -329,65 +329,69 @@
</div>
<div class="widget-content">
<div class="row" id="row-main">
<div class="col-md-3 sidebar" id="sidebar-left">
<div class="col-lg-3 sidebar" id="sidebar-left">
<div class="nopadding table-responsive">
<table class="table table-condensed small table-striped table-hover table-bordered" id="selectorsTable-extractors">
<table class="table table-sm small table-striped table-hover table-bordered" id="selectorsTable-extractors">
<thead><tr><th>Name</th><th>Description</th></tr></thead>
<tbody/>
</table>
</div>
</div>

<div class="col-md-6 col-xs-12" id="content">
<div class="col-lg-6 col-12" id="content">

<div class="row">
<ul class="nav nav-tabs sidebar-nav">
<li class="active text-nowrap" id="sidebar-tab-left">
<a><div id="sidebar-tab-text-left">&#x2195;&ensp;List of extractors</div></a>
<div class="row navbar-light">
<ul class="nav navbar-nav nav-tabs sidebar-nav">
<li class="active text-nowrap nav-item" id="sidebar-tab-left">
<a class="nav-link" href=""><div id="sidebar-tab-text-left">&#x2195;&ensp;List of extractors</div></a>
</li>
</ul>

<div class="col-xs-12">
<form class="col-xs-12">
<div class="form-group row">
<div class="form-group">
<label for="selectorsMsgArea">Message source:</label>
<textarea class="form-control" id="selectorsMsgArea" rows="9" placeholder="Paste raw message source"></textarea>
</div>
<div class="form-group">
<button class="btn btn-default pull-right" id="selectorsMsgClean"><i class="glyphicon glyphicon-trash"></i> Clean form</button>
</div>
</div>

<div class="form-group row">
<div class="form-group has-feedback">
<label for="selectorsSelArea">Selector(s):</label>
<textarea class="form-control" id="selectorsSelArea" rows="1" placeholder="extractor.transform(arg);extractor.transform(arg);..."></textarea>
<span id="selector-feedback-icon" class="glyphicon form-control-feedback"></span>
</div>
<div class="form-group">
<button type="submit" class="btn btn-default btn-primary" id="selectorsChkMsgBtn"><i class="glyphicon glyphicon-search"></i> Check message</button>
<button class="btn btn-default pull-right" id="selectorsClean"><i class="glyphicon glyphicon-trash"></i> Clean form</button>
<div class="col-lg col-12">
<div class="row">
<form class="col-12">
<div class="row pt-3">
<div class="col">
<div class="form-group">
<label for="selectorsMsgArea">Message source:</label>
<textarea class="form-control" id="selectorsMsgArea" rows="9" placeholder="Paste raw message source"></textarea>
</div>
<button class="btn btn-secondary float-right" id="selectorsMsgClean"><i class="glyphicon glyphicon-trash"></i> Clean form</button>
</div>
</div>
<div class="row pt-3">
<div class="col">
<div class="form-group">
<label for="selectorsSelArea">Selector(s):</label>
<textarea class="form-control" id="selectorsSelArea" rows="1" placeholder="extractor.transform(arg);extractor.transform(arg);..."></textarea>
</div>
<button type="submit" class="btn btn-primary" id="selectorsChkMsgBtn"><i class="glyphicon glyphicon-search"></i> Check message</button>
<button class="btn btn-secondary float-right" id="selectorsClean"><i class="glyphicon glyphicon-trash"></i> Clean form</button>
</div>
</div>
<div class="row pt-3">
<div class="col">
<div class="form-group">
<label for="selectorsResArea">Result:</label>
<textarea class="form-control" id="selectorsResArea" rows="5" readonly></textarea>
</div>
</div>
</div>
</form>
</div>
</div>
<div class="form-group row">
<label for="selectorsResArea">Result:</label>
<textarea class="form-control" id="selectorsResArea" rows="5" readonly></textarea>
</div>
</form>
</div>

<ul class="nav nav-tabs sidebar-nav">
<li class="active text-nowrap" id="sidebar-tab-right">
<a>&#x2195;&ensp;List of transforms</a>
<ul class="nav navbar-nav nav-tabs sidebar-nav">
<li class="active text-nowrap nav-item" id="sidebar-tab-right">
<a class="nav-link" href="">&#x2195;&ensp;List of transforms</a>
</li>
</ul>
</div>
</div>

<div class="col-md-3 sidebar" id="sidebar-right">
<div class="col-lg-3 sidebar" id="sidebar-right">
<div class="nopadding table-responsive">
<table class="table table-condensed small table-striped table-hover table-bordered" id="selectorsTable-transforms">
<table class="table table-sm small table-striped table-hover table-bordered" id="selectorsTable-transforms">
<thead><tr><th>Name</th><th>Description</th></tr></thead>
<tbody/>
</table>
@@ -401,25 +405,25 @@
<div class="tab-pane" id="history">

<div class="widget-box">
<div class="widget-title">
<div class="form-inline widget-title-form input-group-sm pull-right buttons">
<label for="selSymOrder_history">Symbols order:</label>
<select id="selSymOrder_history" class="form-control">
<option value="magnitude" selected>Score magnitude</option>
<option value="score">Score value</option>
<option value="name">Name</option>
</select>
<label for="history_page_size">Rows per page:</label>
<input id="history_page_size" class="form-control" value="25" min="1" type="number">
<button class="btn btn-danger btn-sm" id="resetHistory">
<div class="widget-title d-flex">
<span class="icon"><i class="glyphicon glyphicon-eye-open"></i></span>
<h5 class="ml-0">History</h5>
<div class="form-inline widget-title-form input-group-sm buttons align-self-center ml-auto mr-1">
<label for="selSymOrder_history">Symbols order:</label>
<select id="selSymOrder_history" class="form-control ml-1">
<option value="magnitude" selected>Score magnitude</option>
<option value="score">Score value</option>
<option value="name">Name</option>
</select>
<label for="history_page_size" class="ml-2">Rows per page:</label>
<input id="history_page_size" class="form-control ml-1" value="25" min="1" type="number">
<button class="btn btn-danger btn-sm ml-2" id="resetHistory">
<i class="glyphicon glyphicon-remove-circle"></i> Reset
</button>
<button class="btn btn-info btn-sm" id="updateHistory">
<button class="btn btn-info btn-sm ml-2" id="updateHistory">
<i class="glyphicon glyphicon-refresh"></i> Update
</button>
</div>
<span class="icon"><i class="glyphicon glyphicon-eye-open"></i></span>
<h5>History</h5>
</div>
<div class="widget-content nopadding">
<div id="historyLog">
@@ -428,14 +432,14 @@
</div>
</div>
<div class="widget-box" id="errors-history">
<div class="widget-title">
<div class="buttons pull-right">
<div class="widget-title d-flex">
<span class="icon"><i class="glyphicon glyphicon-eye-open"></i></span>
<h5 class="ml-0">Errors</h5>
<div class="buttons align-self-center ml-auto mr-1">
<button class="btn btn-info btn-sm" id="updateErrors">
<i class="glyphicon glyphicon-refresh"></i> Update
</button>
</div>
<span class="icon"><i class="glyphicon glyphicon-eye-open"></i></span>
<h5>Errors</h5>
</div>
<div class="widget-content nopadding">
<table class="table table-hover" id="errorsLog"></table>
@@ -454,12 +458,12 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 id="modalTitle"></h3>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
</div>
<div class="modal-body" id="modalBody"></div>
<div class="modal-footer">
<button class="btn btn-default" data-dismiss="modal" aria-hidden="true" id="modalClose">Close</button>
<button class="btn btn-secondary" data-dismiss="modal" aria-hidden="true" id="modalClose">Close</button>
<button class="btn btn-primary" id="modalSave">Save changes</button>
<button class="btn btn-primary" id="modalSaveAll">Save on cluster</button>
</div>
@@ -476,24 +480,16 @@
</div>
<div class="modal-body" id="connectBody">
<form id="connectForm">
<!--
<div class="form-group">
<label class="control-label" for="connectHost">Hostname</label>
<div class="controls">
<input class=col-md-2" type="text" id="connectHost" placeholder="Hostname" tabindex="1">
</div>
</div>
-->
<div class="form-group">
<div class="input-group">
<input class="form-control"
type="password"
id="connectPassword"
placeholder="Password"
tabindex="1" data-cip-id="connectPassword">
<span class="input-group-btn">
<button type="submit" id="connectButton" class="btn btn-primary" tabindex="1">Connect</button>
</span>
data-cip-id="connectPassword">
<div class="input-group-append">
<button type="submit" id="connectButton" class="btn btn-primary">Connect</button>
</div>
</div>
</div>
</form>

+ 5
- 5
interface/js/app/config.js 查看文件

@@ -65,8 +65,8 @@ define(["jquery"],
items.push({
idx: idx,
html: "<div class=\"form-group\">" +
"<label class=\"control-label col-sm-2\">" + label + "</label>" +
"<div class=\"controls slider-controls col-sm-10\">" +
"<label class=\"control-label col-md-2 float-left\">" + label + "</label>" +
"<div class=\"controls slider-controls col-md-10\">" +
"<input class=\"action-scores form-control\" data-id=\"action\" type=\"number\" value=\"" + item.value + "\">" +
"</div>" +
"</div>"
@@ -146,10 +146,10 @@ define(["jquery"],

$.each(data, function (i, item) {
var label = (item.editable === false || rspamd.read_only)
? "<span class=\"label label-default\">Read</span>"
: "<span class=\"label label-default\">Read</span>&nbsp;<span class=\"label label-success\">Write</span>";
? "<span class=\"badge badge-secondary\">Read</span>"
: "<span class=\"badge badge-secondary\">Read</span>&nbsp;<span class=\"badge badge-success\">Write</span>";
var $tr = $("<tr>");
$("<td class=\"col-md-2 maps-cell\">" + label + "</td>").appendTo($tr);
$("<td class=\"col-lg-2 maps-cell\">" + label + "</td>").appendTo($tr);
var $span = $("<span class=\"map-link\" data-toggle=\"modal\" data-target=\"#modalDialog\">" + item.uri + "</span>").data("item", item);
$span.wrap("<td>").parent().appendTo($tr);
$("<td>" + item.description + "</td>").appendTo($tr);

+ 7
- 4
interface/js/app/history.js 查看文件

@@ -138,10 +138,13 @@ define(["jquery", "footable"],
name: "symbols",
title: "Symbols<br /><br />" +
'<span style="font-weight:normal;">Sort by:</span><br />' +
'<div class="btn-group btn-group-xs btn-sym-order-history" data-toggle="buttons">' +
'<button type="button" class="btn btn-default btn-sym-history-magnitude" value="magnitude">Magnitude</button>' +
'<button type="button" class="btn btn-default btn-sym-history-score" value="score">Value</button>' +
'<button type="button" class="btn btn-default btn-sym-history-name" value="name">Name</button>' +
'<div class="btn-group btn-group-toggle btn-group-xs btn-sym-order-history" data-toggle="buttons">' +
'<label type="button" class="btn btn-outline-secondary btn-sym-history-magnitude">' +
'<input type="radio" value="magnitude">Magnitude</label>' +
'<label type="button" class="btn btn-outline-secondary btn-sym-history-score">' +
'<input type="radio" value="score">Value</label>' +
'<label type="button" class="btn btn-outline-secondary btn-sym-history-name">' +
'<input type="radio" value="name">Name</label>' +
"</div>",
breakpoints: "all",
style: {

+ 16
- 16
interface/js/app/rspamd.js 查看文件

@@ -91,11 +91,11 @@ function ($, D3pie, visibility, NProgress, stickyTabs, tab_stat, tab_graph, tab_
stopTimers();

if (tab_id === "#refresh") {
tab_id = "#" + $(".navbar-nav .active > a").attr("id");
tab_id = "#" + $(".nav-link.active").attr("id");
}

$("#autoRefresh").hide();
$(".btn-group .btn:visible").last().addClass("radius-right");
$("#refresh").addClass("radius-right");

function setAutoRefresh(refreshInterval, timer, callback) {
function countdown(interval) {
@@ -114,7 +114,7 @@ function ($, D3pie, visibility, NProgress, stickyTabs, tab_stat, tab_graph, tab_
});
}

$(".btn-group .btn:visible").last().removeClass("radius-right");
$("#refresh").removeClass("radius-right");
$("#autoRefresh").show();

countdown(refreshInterval);
@@ -134,7 +134,7 @@ function ($, D3pie, visibility, NProgress, stickyTabs, tab_stat, tab_graph, tab_
switch (tab_id) {
case "#status_nav":
(function () {
var refreshInterval = $(".dropdown-menu li.active.preset a").data("value");
var refreshInterval = $(".dropdown-menu a.active.preset").data("value");
setAutoRefresh(refreshInterval, "status",
function () { return tab_stat.statWidgets(ui, graphs, checked_server); });
if (refreshInterval) tab_stat.statWidgets(ui, graphs, checked_server);
@@ -152,7 +152,7 @@ function ($, D3pie, visibility, NProgress, stickyTabs, tab_stat, tab_graph, tab_
var refreshInterval = step[selData] || 3600000;
$("#dynamic-item").text((refreshInterval / 60000) + " min");

if (!$(".dropdown-menu li.active.dynamic a").data("value")) {
if (!$(".dropdown-menu a.active.dynamic").data("value")) {
refreshInterval = null;
}
setAutoRefresh(refreshInterval, "throughput",
@@ -287,7 +287,7 @@ function ($, D3pie, visibility, NProgress, stickyTabs, tab_stat, tab_graph, tab_
$("#selectors_nav").show();
}

var buttons = $("#navBar form.navbar-right");
var buttons = $("#navbar-btn-form");
$("#mainUI").show();
$(buttons).show();
$(".nav-tabs-sticky").stickyTabs({initialTab:"#status_nav"});
@@ -412,19 +412,19 @@ function ($, D3pie, visibility, NProgress, stickyTabs, tab_stat, tab_graph, tab_
var tab_id = "#" + $(e.target).attr("id");
tabClick(tab_id);
});
$(".dropdown-menu li a").click(function (e) {
$(".dropdown-menu a").click(function (e) {
e.preventDefault();
var classList = $(this).parent().attr("class");
var classList = $(this).attr("class");
var menuClass = (/\b(?:dynamic|preset)\b/).exec(classList)[0];
$(".dropdown-menu li.active." + menuClass).removeClass("active");
$(this).parent("li").addClass("active");
$(".dropdown-menu a.active." + menuClass).removeClass("active");
$(this).addClass("active");
tabClick("#refresh");
});

$("#selSrv").change(function () {
checked_server = this.value;
$("#selSrv [value=\"" + checked_server + "\"]").prop("checked", true);
tabClick("#" + $("#navBar ul li.active > a").attr("id"));
tabClick("#" + $("#navBar > ul > .nav-item > .nav-link.active").attr("id"));
});

// Radio buttons
@@ -692,7 +692,7 @@ function ($, D3pie, visibility, NProgress, stickyTabs, tab_stat, tab_graph, tab_
$("#" + table + "_page_size").change(function () {
set_page_size(table, this.value, function (n) { tables[table].pageSize(n); });
});
$(document).on("click", ".btn-sym-order-" + table + " button", function () {
$(document).on("click", ".btn-sym-order-" + table + " input", function () {
var order = this.value;
$("#selSymOrder_" + table).val(order);
change_symbols_order(order);
@@ -857,13 +857,13 @@ function ($, D3pie, visibility, NProgress, stickyTabs, tab_stat, tab_graph, tab_
}

if (item.action === "clean" || item.action === "no action") {
item.action = "<div style='font-size:11px' class='label label-success'>" + item.action + "</div>";
item.action = "<div style='font-size:11px' class='badge badge-success'>" + item.action + "</div>";
} else if (item.action === "rewrite subject" || item.action === "add header" || item.action === "probable spam") {
item.action = "<div style='font-size:11px' class='label label-warning'>" + item.action + "</div>";
item.action = "<div style='font-size:11px' class='badge badge-warning'>" + item.action + "</div>";
} else if (item.action === "spam" || item.action === "reject") {
item.action = "<div style='font-size:11px' class='label label-danger'>" + item.action + "</div>";
item.action = "<div style='font-size:11px' class='badge badge-danger'>" + item.action + "</div>";
} else {
item.action = "<div style='font-size:11px' class='label label-info'>" + item.action + "</div>";
item.action = "<div style='font-size:11px' class='badge badge-info'>" + item.action + "</div>";
}

var score_content = (item.score < item.required_score)

+ 9
- 16
interface/js/app/selectors.js 查看文件

@@ -6,7 +6,7 @@ define(["jquery"],
function enable_disable_check_btn() {
$("#selectorsChkMsgBtn").prop("disabled", (
$.trim($("#selectorsMsgArea").val()).length === 0 ||
!$("#selectorsSelArea").parent().hasClass("has-success")
!$("#selectorsSelArea").hasClass("is-valid")
));
}

@@ -36,13 +36,7 @@ define(["jquery"],

function checkSelectors(rspamd) {
function toggle_form_group_class(remove, add) {
var icon = {
error: "remove",
success: "ok"
};
$("#selectorsSelArea").parent().removeClass("has-" + remove).addClass("has-" + add);
$("#selector-feedback-icon")
.removeClass("glyphicon-" + icon[remove]).addClass("glyphicon-" + icon[add]).show();
$("#selectorsSelArea").removeClass("is-" + remove).addClass("is-" + add);
enable_disable_check_btn();
}
var selector = $("#selectorsSelArea").val();
@@ -51,16 +45,15 @@ define(["jquery"],
method: "GET",
success: function (json) {
if (json[0].data.success) {
toggle_form_group_class("error", "success");
toggle_form_group_class("invalid", "valid");
} else {
toggle_form_group_class("success", "error");
toggle_form_group_class("valid", "invalid");
}
},
server: get_server(rspamd)
});
} else {
$("#selectorsSelArea").parent().removeClass("has-error has-success");
$("#selector-feedback-icon").hide();
$("#selectorsSelArea").removeClass("is-valid is-invalid");
enable_disable_check_btn();
}
}
@@ -99,19 +92,19 @@ define(["jquery"],
ui.setup = function (rspamd) {
function toggleSidebar(side) {
$("#sidebar-" + side).toggleClass("collapsed");
var contentClass = "col-md-6";
var contentClass = "col-lg-6";
var openSidebarsCount = $("#sidebar-left").hasClass("collapsed") +
$("#sidebar-right").hasClass("collapsed");
switch (openSidebarsCount) {
case 1:
contentClass = "col-md-9";
contentClass = "col-lg-9";
break;
case 2:
contentClass = "col-md-12";
contentClass = "col-lg-12";
break;
default:
}
$("#content").removeClass("col-md-12 col-md-9 col-md-6")
$("#content").removeClass("col-lg-12 col-lg-9 col-lg-6")
.addClass(contentClass);
}
$("#sidebar-tab-left>a").click(function () {

+ 2
- 2
interface/js/app/stats.js 查看文件

@@ -100,8 +100,8 @@ define(["jquery", "d3pie"],
$.each(stat_w, function (i, item) {
$(item).appendTo(widgets);
});
$("#statWidgets .left,#statWidgets .right").wrapAll("<li class=\"stat-box pull-right\"><div class=\"widget\"></div></li>");
$("#statWidgets").find("li.pull-right").appendTo("#statWidgets");
$("#statWidgets .left,#statWidgets .right").wrapAll("<li class=\"stat-box float-right\"><div class=\"widget\"></div></li>");
$("#statWidgets").find("li.float-right").appendTo("#statWidgets");

$("#clusterTable tbody").empty();
$("#selSrv").empty();

+ 7
- 4
interface/js/app/upload.js 查看文件

@@ -91,10 +91,13 @@ define(["jquery"],
name: "symbols",
title: "Symbols<br /><br />" +
'<span style="font-weight:normal;">Sort by:</span><br />' +
'<div class="btn-group btn-group-xs btn-sym-order-scan" data-toggle="buttons">' +
'<button type="button" class="btn btn-default btn-sym-scan-magnitude" value="magnitude">Magnitude</button>' +
'<button type="button" class="btn btn-default btn-sym-scan-score" value="score">Value</button>' +
'<button type="button" class="btn btn-default btn-sym-scan-name" value="name">Name</button>' +
'<div class="btn-group btn-group-toggle btn-group-xs btn-sym-order-scan" data-toggle="buttons">' +
'<label type="button" class="btn btn-outline-secondary btn-sym-scan-magnitude">' +
'<input type="radio" value="magnitude">Magnitude</label>' +
'<label type="button" class="btn btn-outline-secondary btn-sym-scan-score">' +
'<input type="radio" value="score">Value</label>' +
'<label type="button" class="btn btn-outline-secondary btn-sym-scan-name">' +
'<input type="radio" value="name">Name</label>' +
"</div>",
breakpoints: "all",
style: {

+ 7
- 0
interface/js/lib/bootstrap.bundle.min.js
文件差異過大導致無法顯示
查看文件


+ 0
- 6
interface/js/lib/bootstrap.min.js
文件差異過大導致無法顯示
查看文件


+ 2
- 2
interface/js/main.js 查看文件

@@ -6,7 +6,7 @@ requirejs.config({
app: "../app",
jquery: "jquery-3.4.1.min",
visibility: "visibility.min",
bootstrap: "bootstrap.min",
bootstrap: "bootstrap.bundle.min",
d3: "d3.min",
d3evolution: "d3evolution.min",
d3pie: "d3pie.min",
@@ -40,7 +40,7 @@ requirejs.onError = function (e) {
document.getElementsByClassName("notification-area")[0].innerHTML =
"<div class=\"alert alert-error\">" +
"<strong>Module loading error: " + e.requireType + ", module: " + e.requireModules + "</strong>" +
"<button type=\"button\" class=\"btn btn-info btn-xs pull-right\" " +
"<button type=\"button\" class=\"btn btn-info btn-xs float-right\" " +
"onClick=\"window.location.reload(); this.parentNode.parentNode.removeChild(this.parentNode);\" " +
"title=\"Reload current page\">" +
"<i class=\"glyphicon glyphicon-repeat\"></i> Reload" +

Loading…
取消
儲存