@@ -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"; | |||
} |
@@ -5,6 +5,7 @@ | |||
font-size: 17px; | |||
} | |||
.d3evolution .y.label { | |||
font-size: 11px; | |||
font-weight: normal; | |||
} | |||
.d3evolution .grid line { |
@@ -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"; | |||
} |
@@ -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; | |||
} |
@@ -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">↕ 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">↕ 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>↕ 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="">↕ 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> |
@@ -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> <span class=\"label label-success\">Write</span>"; | |||
? "<span class=\"badge badge-secondary\">Read</span>" | |||
: "<span class=\"badge badge-secondary\">Read</span> <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); |
@@ -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: { |
@@ -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) |
@@ -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 () { |
@@ -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(); |
@@ -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: { |
@@ -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" + |