| Major UI cleanup, still much more to go - warvox - VoIP based wardialing tool, … | |
| Log | |
| Files | |
| Refs | |
| README | |
| --- | |
| commit e1547bc2058230f93ae14da36e96917886d42647 | |
| parent c076798b456974f4d6a4992f2ff8256183424a45 | |
| Author: HD Moore <[email protected]> | |
| Date: Sat, 29 Dec 2012 14:26:58 -0600 | |
| Major UI cleanup, still much more to go | |
| Diffstat: | |
| M Gemfile | 9 ++++++--- | |
| M Gemfile.lock | 5 ++++- | |
| M app/assets/images/logo.png | 0 | |
| A app/assets/images/logo_light.png | 0 | |
| M app/assets/javascripts/application… | 2 ++ | |
| M app/assets/javascripts/highcharts.… | 2 +- | |
| A app/assets/javascripts/html5.js | 4 ++++ | |
| D app/assets/stylesheets/application… | 7 ------- | |
| M app/assets/stylesheets/application… | 3 +++ | |
| M app/assets/stylesheets/bootstrap_a… | 160 +++++++++++++++++++++++++++… | |
| D app/assets/stylesheets/global.css | 555 -----------------------------… | |
| D app/assets/stylesheets/ie7.css | 3 --- | |
| M app/controllers/dial_jobs_controll… | 22 +--------------------- | |
| M app/controllers/dial_results_contr… | 14 ++------------ | |
| M app/tabs/tabulous.rb | 30 +++++++++++++++--------------- | |
| M app/views/analyze/index.html.erb | 32 +++++++++++++++++++++++------… | |
| M app/views/analyze/view.html.erb | 7 +++++-- | |
| M app/views/analyze/view_matches.htm… | 10 +++++++--- | |
| M app/views/dial_jobs/index.html.erb | 64 +++++++++--------------------… | |
| M app/views/dial_results/index.html.… | 52 ++++++++++++++++++++-------… | |
| M app/views/dial_results/view.html.e… | 16 +++++++++++++++- | |
| M app/views/home/about.html.erb | 76 ++++++++++++++++-------------… | |
| M app/views/home/index.html.erb | 22 +++++++++++++++++++--- | |
| M app/views/layouts/application.html… | 51 ++++++++++++---------------… | |
| M app/views/providers/index.html.erb | 63 ++++++++++-------------------… | |
| M app/views/shared/graphs/_call_resu… | 57 ++++++++++++++++-----------… | |
| M app/views/shared/graphs/_lines_by_… | 56 +++++++++++++++------------… | |
| M config/environments/development.rb | 2 ++ | |
| A lib/templates/erb/scaffold/_form.h… | 11 +++++++++++ | |
| M public/robots.txt | 7 ++----- | |
| 30 files changed, 449 insertions(+), 893 deletions(-) | |
| --- | |
| diff --git a/Gemfile b/Gemfile | |
| @@ -5,6 +5,9 @@ gem 'thin' | |
| gem 'rails', '3.2.8' | |
| gem 'pg', '0.11' | |
| +gem 'jquery-rails' | |
| +gem 'jquery-datatables-rails' | |
| + | |
| # Integer array support (until Rails 4.0 is released) | |
| # Git version required to work around this bug: https://github.com/dockyard/po… | |
| gem 'postgres_ext', :git => 'git://github.com/dockyard/postgres_ext.git' | |
| @@ -20,11 +23,11 @@ group :assets do | |
| gem 'uglifier', '>= 1.0.3' | |
| end | |
| -gem "less-rails" | |
| -gem "twitter-bootstrap-rails" | |
| +gem 'twitter-bootstrap-rails' | |
| gem 'formtastic-bootstrap' | |
| gem 'tabulous' | |
| -gem 'jquery-rails' | |
| +gem "therubyracer", :group => :assets, :platform => :ruby | |
| + | |
| gem 'will_paginate', '~> 3.0' | |
| gem 'dynamic_form' | |
| diff --git a/Gemfile.lock b/Gemfile.lock | |
| @@ -61,6 +61,8 @@ GEM | |
| hike (1.2.1) | |
| i18n (0.6.1) | |
| journey (1.0.4) | |
| + jquery-datatables-rails (1.11.1) | |
| + jquery-rails | |
| jquery-rails (2.1.4) | |
| railties (>= 3.0, < 5.0) | |
| thor (>= 0.14, < 2.0) | |
| @@ -148,15 +150,16 @@ DEPENDENCIES | |
| coffee-rails (~> 3.2.1) | |
| dynamic_form | |
| formtastic-bootstrap | |
| + jquery-datatables-rails | |
| jquery-rails | |
| kissfft | |
| - less-rails | |
| librex | |
| pg (= 0.11) | |
| postgres_ext! | |
| rails (= 3.2.8) | |
| sass-rails (~> 3.2.3) | |
| tabulous | |
| + therubyracer | |
| thin | |
| twitter-bootstrap-rails | |
| uglifier (>= 1.0.3) | |
| diff --git a/app/assets/images/logo.png b/app/assets/images/logo.png | |
| Binary files differ. | |
| diff --git a/app/assets/images/logo_light.png b/app/assets/images/logo_light.png | |
| Binary files differ. | |
| diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/app… | |
| @@ -4,4 +4,6 @@ | |
| //= require jquery_ujs | |
| //= require twitter/bootstrap | |
| //= require jquery.lightbox-0.5 | |
| +//= require dataTables/jquery.dataTables | |
| +//= require dataTables/jquery.dataTables.bootstrap | |
| //= require highcharts | |
| diff --git a/app/assets/javascripts/highcharts.js b/app/assets/javascripts/high… | |
| @@ -30,7 +30,7 @@ canvasToolsURL:"http://code.highcharts.com/2.3.3/modules/canv… | |
| position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center"… | |
| verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,showInLegend:!0,st… | |
| itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"1… | |
| -hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",mon… | |
| +hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",mon… | |
| style:{cursor:"pointer",color:"#909090",fontSize:"10px"}}};var W=M.plotOptions… | |
| b[3]:"rgba("+b.join(",")+")":a},brighten:function(a){if(Aa(a)&&a!==0){var c;fo… | |
| i=this.renderer,j,k=this.attrSetters,l=this.shadows,m,p,u=this;la(a)&&t(b)&&(c… | |
| diff --git a/app/assets/javascripts/html5.js b/app/assets/javascripts/html5.js | |
| @@ -0,0 +1,3 @@ | |
| +/*! HTML5 Shiv vpre3.6 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed | |
| + Uncompressed source: https://github.com/aFarkas/html5shiv */ | |
| +(function(a,b){function h(a,b){var c=a.createElement("p"),d=a.getElementsByTag… | |
| +\ No newline at end of file | |
| diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/ap… | |
| @@ -1,7 +0,0 @@ | |
| -/* | |
| - * This is a manifest file that'll automatically include all the stylesheets a… | |
| - * and any sub-directories. You're free to add application-wide styles to this… | |
| - * the top of the compiled file, but it's generally better to create a new fil… | |
| - *= require_self | |
| - *= require_tree . | |
| -*/ | |
| diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/styleshee… | |
| @@ -4,4 +4,7 @@ | |
| /* | |
| *= require_self | |
| + *= require formtastic | |
| + *= require formtastic-bootstrap | |
| + *= require dataTables/jquery.dataTables.bootstrap | |
| */ | |
| diff --git a/app/assets/stylesheets/bootstrap_and_overrides.css.less b/app/asse… | |
| @@ -1,30 +1,148 @@ | |
| @import "twitter/bootstrap/bootstrap"; | |
| + | |
| +body { | |
| + padding-top: 5px; | |
| +} | |
| + | |
| @import "twitter/bootstrap/responsive"; | |
| // Set the correct sprite paths | |
| -@iconSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings.png"); | |
| -@iconWhiteSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings-white… | |
| +@iconSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings.png'); | |
| +@iconWhiteSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings-white… | |
| // Set the Font Awesome (Font Awesome is default. You can disable by commentin… | |
| // Note: If you use asset_path() here, your compiled boostrap_and_overrides.cs… | |
| -// have the proper paths. So for now we use the absolute path. | |
| -@fontAwesomeEotPath: asset-path("fontawesome-webfont.eot"); | |
| -@fontAwesomeWoffPath: asset-path("fontawesome-webfont.woff"); | |
| -@fontAwesomeTtfPath: asset-path("fontawesome-webfont.ttf"); | |
| -@fontAwesomeSvgPath: asset-path("fontawesome-webfont.svg"); | |
| +// have the proper paths. So for now we use the absolute path. | |
| +@fontAwesomeEotPath: '/assets/fontawesome-webfont.eot'; | |
| +@fontAwesomeWoffPath: '/assets/fontawesome-webfont.woff'; | |
| +@fontAwesomeTtfPath: '/assets/fontawesome-webfont.ttf'; | |
| +@fontAwesomeSvgPath: '/assets/fontawesome-webfont.svg'; | |
| // Font Awesome | |
| -@import "fontawesome"; | |
| - | |
| -// Your custom LESS stylesheets goes here | |
| -// | |
| -// Since bootstrap was imported above you have access to its mixins which | |
| -// you may use and inherit here | |
| -// | |
| -// If you'd like to override bootstrap's own variables, you can do so here as … | |
| -// See http://twitter.github.com/bootstrap/customize.html#variables for their … | |
| -// | |
| -// Example: | |
| -// @linkColor: #ff0000; | |
| - | |
| -body { padding-top: 80px; } | |
| +@import "fontawesome.less"; | |
| + | |
| +@sansFontFamily: "Trebuchet MS", Arial, Helvetica, sans-serif; | |
| +@green: #90d552; | |
| +@orange: #ea5709; | |
| +@darkGray: #29383f; | |
| +@lightGray: #666666; | |
| +@blue: #0197b8; | |
| + | |
| +@linkColor: @blue; | |
| +@linkColorHover: @darkGray; | |
| + | |
| +@btnPrimaryBackground: @blue; | |
| +@btnPrimaryBackgroundHighlight: @btnPrimaryBackground; | |
| + | |
| +@navbarLinkColor: @white; | |
| +@navbarLinkColorActive: @white; | |
| +@navbarLinkColorHover: @yellow; | |
| + | |
| +@dropdownLinkColorHover: @yellow; | |
| +@dropdownLinkBackgroundHover: @dropdownBackground; | |
| + | |
| +@headingsColor: @darkGray; | |
| + | |
| +@navbarBackground: #ea5709; | |
| +@navbarBackgroundHighlight: #4A1C04; | |
| + | |
| +.nav { | |
| + a { | |
| + font-size: 15px; | |
| + } | |
| +} | |
| + | |
| +.content { | |
| + margin-top: 40px; | |
| +} | |
| + | |
| +.accordion-toggle:hover { | |
| + text-decoration: none; | |
| +} | |
| + | |
| +h1 { | |
| + font-size: 24px; | |
| + line-height: 30px; | |
| +} | |
| + | |
| +h2 { | |
| + font-size: 20px; | |
| + line-height: 24px; | |
| +} | |
| + | |
| +h3 { | |
| + font-size: 16px; | |
| + line-height: 18px; | |
| +} | |
| + | |
| +.header { | |
| + border-top: solid 4px @orange; | |
| + padding-top: 20px; | |
| +} | |
| + | |
| +.header a { | |
| + color: @darkGray; | |
| +} | |
| + | |
| +.header a:hover { | |
| + text-decoration: none; | |
| + color: @orange; | |
| +} | |
| + | |
| +.footer { | |
| + text-align: center; | |
| + font-size: 12px; | |
| + margin-top: 50px; | |
| + color: #aaa; | |
| +} | |
| + | |
| +.no-space { | |
| + margin-left: 0; | |
| + margin-right: 0; | |
| +} | |
| + | |
| +.right { | |
| + text-align: right; | |
| +} | |
| + | |
| +.tabs-left { | |
| + text-align: left; | |
| +} | |
| + | |
| +.text-large { | |
| + font-size: 18px; | |
| +} | |
| + | |
| +h3.toc { | |
| + border-bottom: 1px solid #ccc; | |
| +} | |
| + | |
| +.carousel .item { | |
| + height: 50px; | |
| + text-align: center; | |
| +} | |
| + | |
| +.carousel .item > img { | |
| + display: inline; | |
| +} | |
| + | |
| +.lead-box h3 { | |
| + text-align: center; | |
| +} | |
| + | |
| +.lead-box p { | |
| + height: 80px; | |
| +} | |
| + | |
| +.table td { | |
| + vertical-align: middle; | |
| +} | |
| +table.dataTable tr td.sorting_1 { | |
| + background-color: #fff !important; | |
| +} | |
| +.tab-content { | |
| + overflow: hidden; | |
| +} | |
| +.carousel-control { | |
| + background: #fff; | |
| +} | |
| diff --git a/app/assets/stylesheets/global.css b/app/assets/stylesheets/global.… | |
| @@ -1,555 +0,0 @@ | |
| -/* global element overrides */ | |
| - | |
| -body { | |
| - height: 100%; | |
| - background: #fff; | |
| - margin: 0; | |
| - padding: 0; | |
| - font-family: Tahoma, sans-serif; | |
| - font-size: 12px; | |
| - color: #555; | |
| -} | |
| - | |
| -img { | |
| - border: none; | |
| -} | |
| - | |
| -table { | |
| - border: none; | |
| - padding: 0; | |
| - margin: 0; | |
| -} | |
| - | |
| -a:link, a:visited { | |
| - color: #003366; | |
| - text-decoration: none; | |
| -} | |
| - | |
| -a:hover, a:active { | |
| - color: #cc0033; | |
| - text-decoration: underline; | |
| -} | |
| - | |
| -h1 { | |
| - color: #333; | |
| - margin-top: 0; | |
| - padding-top: 0; | |
| - font-weight: normal; | |
| - font-size: 36px; | |
| -} | |
| - | |
| -h2 { | |
| - font-size: 1.4em; | |
| - margin-bottom: 4px; | |
| -} | |
| - | |
| -h3 { | |
| - font-size: 1.05em; | |
| - font-weight: normal; | |
| - font-style: italic; | |
| -} | |
| - | |
| -/* unique elements */ | |
| - | |
| -#content { | |
| - padding: 0; | |
| - margin: 0 auto; | |
| - width: 800px; | |
| - line-height: 1.5; | |
| -} | |
| - | |
| -#main { | |
| - border: 0; | |
| - padding: 0; | |
| - background-color: white; | |
| - padding-top: 6px; | |
| - padding-left: 18px; | |
| - padding-right: 20px; | |
| - margin-top: -3px; | |
| - margin-bottom: -3px; | |
| -} | |
| - | |
| -#main img { | |
| - max-width: 530px; | |
| -} | |
| - | |
| -#footer { | |
| - | |
| - margin: 0; | |
| - text-align: center; | |
| -} | |
| - | |
| -#quote { | |
| - font-size: 12px; | |
| - padding: 10px; | |
| - margin: 0 auto; | |
| - width: 70%; | |
| - background: #dddddd; | |
| - margin-bottom: 10px; | |
| -} | |
| - | |
| -#copyright { | |
| - padding: 10px; | |
| - text-align: center; | |
| - font-size: 10px; | |
| - color: #cccccc; | |
| -} | |
| - | |
| -#header { | |
| - width: 800px; | |
| - margin: 0 auto 10px; | |
| - color: white; | |
| - | |
| -} | |
| - | |
| -#logo { | |
| - float: left; | |
| - margin-top: 0px; | |
| -} | |
| - | |
| - | |
| - | |
| -#warvox_stats { | |
| - margin-top: 5px; | |
| - border: 1px solid black; | |
| - font-size: 12px; | |
| - color: #555; | |
| -} | |
| - | |
| -#warvox_stats td { | |
| - margin-left: 20px; | |
| - padding: 0 10px 0px 6px; | |
| -} | |
| - | |
| - | |
| -#warvox_conf { | |
| - margin-top: 5px; | |
| - border: 1px solid black; | |
| - font-size: 12px; | |
| - color: #555; | |
| -} | |
| - | |
| -#warvox_conf td { | |
| - margin-left: 20px; | |
| - padding: 0 10px 0px 6px; | |
| -} | |
| - | |
| -#warvox_blacklist { | |
| - margin-top: 5px; | |
| - border: 1px solid black; | |
| - font-size: 12px; | |
| - color: #555; | |
| -} | |
| - | |
| -#warvox_blacklist td { | |
| - margin-left: 20px; | |
| - padding: 0 10px 0px 6px; | |
| -} | |
| - | |
| -#home_logo { | |
| - border: 0; | |
| -} | |
| - | |
| -#home_links { | |
| - | |
| -} | |
| - | |
| -#home_intro, #home_intro td { | |
| - border: 0; | |
| -} | |
| - | |
| -#home_table { | |
| - border: 0; | |
| - margin-top: 0px; | |
| -} | |
| - | |
| -#home_table td { | |
| - border: 0; | |
| -} | |
| - | |
| -#home_text { | |
| - padding-left: 20px; | |
| -} | |
| - | |
| -#navwrap { | |
| - margin-top: 10px; | |
| - padding-top: 10px; | |
| - text-align: center; | |
| -} | |
| - | |
| -#nav { | |
| - margin: 0 0 0 0 auto; | |
| - padding: 10px; | |
| -} | |
| - | |
| -#sections_container { | |
| - font-size: 14px; | |
| -} | |
| - | |
| -#sections_ul { | |
| - margin: 0; | |
| - padding: 0; | |
| - white-space: nowrap; | |
| -} | |
| - | |
| -#sections_ul li { | |
| - display: inline; | |
| - list-style-type: none; | |
| -} | |
| - | |
| -#sections_container a { | |
| - padding: 5px 10px 5px 10px; | |
| - line-height: 28px; | |
| -} | |
| - | |
| -#sections_container a:link, #sections_container a:visited { | |
| - color: #fff; | |
| - background: black repeat-x top; | |
| - text-decoration: none; | |
| - font-variant: small-caps; | |
| -} | |
| - | |
| -#sections_container a:hover { | |
| - color: #fff; | |
| - background: red repeat-x top; | |
| - text-decoration: none; | |
| - font-variant: small-caps; | |
| -} | |
| - | |
| -#sections_active { | |
| - font-weight: bold; | |
| -} | |
| - | |
| -#subsections_active { | |
| - font-weight: bold; | |
| -} | |
| - | |
| -#subsections_container { | |
| - font-size: 12px; | |
| - padding-top: 5px; | |
| -} | |
| - | |
| -#subsections_ul { | |
| - margin: 0; | |
| - padding: 0; | |
| - white-space: nowrap; | |
| -} | |
| - | |
| -#subsections_ul li { | |
| - display: inline; | |
| - list-style-type: none; | |
| -} | |
| - | |
| -#subsections_container a { | |
| - padding: 5px 10px 5px 10px; | |
| - line-height: 20px; | |
| -} | |
| - | |
| -#subsections_container a:link, #subsections_container a:visited { | |
| - color: #fff; | |
| - background: #333333 repeat-x top; | |
| - text-decoration: none; | |
| - font-variant: small-caps; | |
| -} | |
| - | |
| -#subsections_container a:hover { | |
| - color: #fff; | |
| - background: #440000 repeat-x top; | |
| - text-decoration: none; | |
| - font-variant: small-caps; | |
| -} | |
| - | |
| - | |
| -#calls_pie1 { | |
| - text-align: center; | |
| -} | |
| -#calls_pie2 { | |
| - text-align: center; | |
| -} | |
| -#calls_pie3 { | |
| - text-align: center; | |
| -} | |
| - | |
| -/* non-unique elements */ | |
| - | |
| - | |
| -.title { | |
| - font-size: 20px; | |
| - font-weight: bold; | |
| - color: black; | |
| - font-variant: small-caps; | |
| -} | |
| - | |
| -.active_job_row { | |
| - background: yellow; | |
| -} | |
| - | |
| -.table_scaffold { | |
| - margin-top: 5px; | |
| - border: 1px solid black; | |
| - font-size: 12px; | |
| - color: #555; | |
| -} | |
| - | |
| -.table_scaffold th { | |
| - font-size: 14px; | |
| - text-decoration: underline; | |
| -} | |
| - | |
| -.table_scaffold td { | |
| - margin-left: 20px; | |
| - padding: 0 10px 0px 6px; | |
| - border: 1px solid #cccccc; | |
| -} | |
| - | |
| -.header_item { | |
| - font-weight: bold; | |
| -} | |
| - | |
| -.date-header { | |
| - background: url('/assets/bluefade.jpg') #222222 repeat-x top; | |
| - color: white; | |
| - padding: 2px; | |
| - margin: 2px; | |
| - font-weight: bold; | |
| - padding-left: 8px; | |
| - font-variant: small-caps; | |
| - border: 0; | |
| -} | |
| - | |
| -.date-header-center { | |
| - background: url('/assets/bluefade.jpg') #8c0000 repeat-x top; | |
| - color: white; | |
| - padding: 2px; | |
| - margin: 2px; | |
| - font-weight: bold; | |
| - padding-left: 8px; | |
| - font-variant: small-caps; | |
| - text-align: center; | |
| - border: 0; | |
| -} | |
| - | |
| - | |
| -.balloon { | |
| - background: url('/assets/balloon.jpg') repeat-x top; | |
| - width: 277px; | |
| - height: 98px; | |
| - color: white; | |
| - margin: 40px auto; | |
| -} | |
| - | |
| -.balloon_links { | |
| - float: left; | |
| - margin-top: 10px; | |
| - margin-left: 6px; | |
| - | |
| -} | |
| - | |
| -.balloon_links p { | |
| - font-size: 14px; | |
| - font-weight: bold; | |
| - margin: 0; | |
| -} | |
| - | |
| -.balloon_links a, .balloon_links a:link, .balloon_links a:visited { | |
| - font-size: 12px; | |
| - color: white; | |
| - text-decoration: none; | |
| - margin-left: 12px; | |
| -} | |
| - | |
| -.balloon_links a:hover, .balloon_links a:active { | |
| - color: yellow; | |
| - text-decoration: underline; | |
| -} | |
| - | |
| -.balloon_icon { | |
| - float: left; | |
| - padding-top: 25px; | |
| - padding-left: 14px; | |
| -} | |
| - | |
| -.box_full { | |
| - position: relative; | |
| - clear: both; | |
| - width: 790px; | |
| -} | |
| - | |
| -#round_top { | |
| - padding: 0; | |
| - border: 0; | |
| - margin: 0; | |
| - height: 9px; | |
| - margin-bottom: -2px; | |
| - visibility: hidden; | |
| -} | |
| - | |
| -#round_bot { | |
| - padding: 0; | |
| - border: 0; | |
| - margin-top: -2px; | |
| - height: 15px; | |
| - visibility: hidden; | |
| -} | |
| - | |
| -.box_full p { | |
| - line-height: 1.5em; | |
| -} | |
| - | |
| - | |
| -.intro { | |
| - font-size: 14px; | |
| -} | |
| - | |
| -.center { | |
| - text-align: center; | |
| -} | |
| - | |
| -.code { | |
| - font-family: fixed, courier new; | |
| - color: black; | |
| - background: #dddddd; | |
| - padding: 0.25em 0.25em 0.25em 0.25em; | |
| -} | |
| - | |
| -.fatp { | |
| - margin: 2.0em 0 0.5em; | |
| -} | |
| - | |
| -.announce { | |
| - padding: 0px 20px 0px 20px; | |
| - line-height: 1.5; | |
| - font-size: 12px; | |
| - font-weight: bold; | |
| -} | |
| - | |
| -.vulnTitle { | |
| - font-weight: bold; | |
| - font-size: 10pt; | |
| - padding-bottom: 2em; | |
| -} | |
| - | |
| -.vulnHeader { | |
| - font-weight: bold; | |
| -} | |
| - | |
| -.vulnText { | |
| - padding-bottom: 1em; | |
| -} | |
| - | |
| -.vulnInfoTable { | |
| - background: #dddddd; | |
| - | |
| -} | |
| - | |
| -.vulnInfoHeader { | |
| - font-weight: bold; | |
| -} | |
| - | |
| -.vulnInfoData { | |
| - | |
| -} | |
| - | |
| -.talk_title { | |
| - font-family: verdana, sans-serif, arial, helvetica; | |
| - font-size: 9pt; | |
| - padding: 0.1em 0.5em 0.15em .5em; | |
| - font-weight: bold; | |
| -} | |
| - | |
| -.materials { | |
| - background: #dddddd; | |
| - padding: 10px 10px 10px 10px; | |
| - border: 1px solid black; | |
| -} | |
| - | |
| - | |
| - | |
| -.level1 | |
| -{ | |
| - list-style: none; | |
| - text-align: left; | |
| - padding: 0em 0em 1em 0em; | |
| - font-size: 16px; | |
| - font-weight: bold; | |
| -} | |
| -.level1 li | |
| -{ | |
| - padding: 1em .25em 0.25em 0.25em; | |
| -} | |
| - | |
| -.level2 | |
| -{ | |
| - list-style: circle; | |
| - text-align: left; | |
| - padding: 0em 0.25em 0.25em 4em; | |
| -} | |
| -.level2 li | |
| -{ | |
| - padding: 0.25em .25em 0.25em 0.25em; | |
| - font-size: 14px; | |
| - font-weight: bold; | |
| -} | |
| - | |
| -.level3 | |
| -{ | |
| - list-style: square; | |
| - text-align: left; | |
| - padding: 0em 0.25em 0.25em 4em; | |
| -} | |
| -.level3 li | |
| -{ | |
| - padding: 0.25em .25em 0.25em 0.25em; | |
| -} | |
| - | |
| - | |
| - | |
| -.boxTable | |
| -{ | |
| - border-left-style: solid; | |
| - border-top-style: solid; | |
| - border-right-style: solid; | |
| - border-bottom-style: solid; | |
| - border-color: #dddddd; | |
| - font-family: verdana, sans-serif; | |
| - font-size: 8pt; | |
| - background-color: #dddddd; | |
| -} | |
| -.boxInnerTable | |
| -{ | |
| - font-family: verdana, sans-serif; | |
| - font-size: 8pt; | |
| -} | |
| -.boxTdHeader | |
| -{ | |
| - border-width: 0 0 0 0; | |
| - border-color: #dddddd; | |
| - border-left-style: solid; | |
| - border-top-style: solid; | |
| - border-right-style: solid; | |
| - border-bottom-style: solid; | |
| - background-color: #dddddd; | |
| - color: black; | |
| - height: 20px; | |
| - font-weight: bold | |
| -} | |
| -.boxTd | |
| -{ | |
| - border-width: 0 0 0 0; | |
| - border-left-style: solid; | |
| - border-top-style: solid; | |
| - border-right-style: solid; | |
| - border-bottom-style: solid; | |
| -} | |
| -.boxTd1 | |
| -{ | |
| - background-color: #eeeeee; | |
| -} | |
| -.boxTd2 | |
| -{ | |
| - background-color: #eeeeee; | |
| -} | |
| -.boxTh | |
| -{ | |
| - background-color: #dddddd; | |
| -} | |
| diff --git a/app/assets/stylesheets/ie7.css b/app/assets/stylesheets/ie7.css | |
| @@ -1,3 +0,0 @@ | |
| -#logo { | |
| - margin-top: 7px; | |
| -} | |
| diff --git a/app/controllers/dial_jobs_controller.rb b/app/controllers/dial_job… | |
| @@ -22,14 +22,6 @@ class DialJobsController < ApplicationController | |
| end | |
| end | |
| -=begin | |
| - # GET /dial_jobs/1/edit | |
| - def edit | |
| - @dial_job = DialJob.find(params[:id]) | |
| - end | |
| -=end | |
| - | |
| - | |
| # GET /dial_jobs/1/run | |
| def run | |
| @dial_job = DialJob.find(params[:id]) | |
| @@ -86,7 +78,7 @@ class DialJobsController < ApplicationController | |
| # Launch it | |
| WarVOX::JobManager.schedule(::WarVOX::Jobs::Dialer, @dial_job.id) | |
| - format.html { redirect_to(@dial_job) } | |
| + format.html { redirect_to :action => 'index' } | |
| format.xml { render :xml => @dial_job, :status => :created, :location… | |
| else | |
| format.html { render :action => "new" } | |
| @@ -107,16 +99,4 @@ class DialJobsController < ApplicationController | |
| end | |
| end | |
| - # GET /dial_jobs/1 | |
| - # GET /dial_jobs/1.xml | |
| - def show | |
| - @dial_job = DialJob.find(params[:id]) | |
| - | |
| - respond_to do |format| | |
| - format.html # show.html.erb | |
| - format.xml { render :xml => @dial_job } | |
| - end | |
| - end | |
| - | |
| - | |
| end | |
| diff --git a/app/controllers/dial_results_controller.rb b/app/controllers/dial_… | |
| @@ -3,7 +3,7 @@ class DialResultsController < ApplicationController | |
| # GET /dial_results | |
| # GET /dial_results.xml | |
| def index | |
| - @completed_jobs = DialJob.where(:status => 'completed').paginate( | |
| + @jobs = DialJob.where(:status => 'completed').paginate( | |
| :page => params[:page], | |
| :order => 'id DESC', | |
| :per_page => 30 | |
| @@ -162,7 +162,7 @@ class DialResultsController < ApplicationController | |
| # DELETE /dial_results/1 | |
| # DELETE /dial_results/1.xml | |
| - def purge | |
| + def destroy | |
| @job = DialJob.find(params[:id]) | |
| @job.destroy | |
| @@ -173,14 +173,4 @@ class DialResultsController < ApplicationController | |
| end | |
| end | |
| - # DELETE /dial_results/1 | |
| - # DELETE /dial_results/1.xml | |
| - def delete | |
| - @res = DialResult.find(params[:id]) | |
| - @res.destroy | |
| - respond_to do |format| | |
| - format.html { redirect_to :action => 'index' } | |
| - format.xml { head :ok } | |
| - end | |
| - end | |
| end | |
| diff --git a/app/tabs/tabulous.rb b/app/tabs/tabulous.rb | |
| @@ -57,11 +57,10 @@ Tabulous.setup do |config| | |
| #-----------------------------------------------------------------------… | |
| # TAB NAME | DISPLAY TEXT | PATH … | |
| #-----------------------------------------------------------------------… | |
| - [ :home_tab , 'Home' , root_path … | |
| + [ :start_tab , 'Start' , new_dial_job_path … | |
| [ :dial_jobs_tab , 'Jobs' , dial_jobs_path … | |
| [ :dial_results_tab , 'Results' , dial_results_path … | |
| [ :providers_tab , 'Providers' , providers_path … | |
| - [ :analyze_tab , 'Analysis' , analyze_path … | |
| [ :about_tab , 'About' , about_path … | |
| #-----------------------------------------------------------------------… | |
| # TAB NAME | DISPLAY TEXT | PATH … | |
| @@ -88,11 +87,11 @@ Tabulous.setup do |config| | |
| #--------------------------------------------------------------------# | |
| # CONTROLLER | ACTION | TAB # | |
| #--------------------------------------------------------------------# | |
| - [ :dial_jobs , :all_actions , :dial_jobs_tab ], | |
| + [ :dial_jobs , :new , :start_tab ], | |
| + [ :dial_jobs , :index , :dial_jobs_tab ], | |
| [ :dial_results , :all_actions , :dial_results_tab ], | |
| + [ :analyze , :all_actions , :dial_results_tab ], | |
| [ :providers , :all_actions , :providers_tab ], | |
| - [ :analyze , :all_actions , :analyze_tab ], | |
| - [ :home , :index , :home_tab ], | |
| [ :home , :about , :about_tab ], | |
| #--------------------------------------------------------------------# | |
| # CONTROLLER | ACTION | TAB # | |
| @@ -113,9 +112,10 @@ Tabulous.setup do |config| | |
| # Tabulous expects every controller action to be associated with a tab. | |
| # When an action does not have an associated tab (or subtab), you can | |
| # instruct tabulous how to behave: | |
| - config.when_action_has_no_tab = :raise_error # the default behavior | |
| - # config.when_action_has_no_tab = :do_not_render # no tab navigation HTML w… | |
| - # config.when_action_has_no_tab = :render # the tab navigation HTML … | |
| + #config.when_action_has_no_tab = :raise_error # the default behavior | |
| + #config.when_action_has_no_tab = :do_not_render # no tab navigation HTML wi… | |
| + | |
| + config.when_action_has_no_tab = :render # the tab navigation HTML wi… | |
| # but no tab or subtab wil… | |
| #-------------------- | |
| @@ -129,7 +129,7 @@ Tabulous.setup do |config| | |
| # This gives you control over what class the <ul> element that wraps the tabs | |
| # will have. Good for interfacing with third-party code like Twitter | |
| # Bootstrap. | |
| - config.tabs_ul_class = "nav nav-pills" | |
| + config.tabs_ul_class = "nav" | |
| # This gives you control over what class the <ul> element that wraps the sub… | |
| # will have. Good for interfacing with third-party code. | |
| @@ -138,7 +138,7 @@ Tabulous.setup do |config| | |
| # Set this to true to have subtabs rendered in markup that Twitter Bootstrap | |
| # understands. If this is set to true, you don't need to call subtabs in | |
| # your layout, just tabs. | |
| - # config.bootstrap_style_subtabs = true | |
| + config.bootstrap_style_subtabs = true | |
| #------------------- | |
| @@ -165,11 +165,11 @@ Tabulous.setup do |config| | |
| # You can tweak the colors of the generated CSS. | |
| - config.css.background_color = '#ccc' | |
| + config.css.background_color = '#000' | |
| config.css.text_color = '#444' | |
| - config.css.active_tab_color = 'white' | |
| - config.css.hover_tab_color = '#ddd' | |
| - config.css.inactive_tab_color = '#aaa' | |
| - config.css.inactive_text_color = '#888' | |
| + config.css.active_tab_color = '#000' | |
| + config.css.hover_tab_color = '#000' | |
| + config.css.inactive_tab_color = '#000' | |
| + config.css.inactive_text_color = '#000' | |
| end | |
| diff --git a/app/views/analyze/index.html.erb b/app/views/analyze/index.html.erb | |
| @@ -2,31 +2,47 @@ | |
| <h1 class='title'>Analyzed Jobs</h1> | |
| <%= raw(will_paginate @jobs) %> | |
| -<table class='table_scaffold' width='100%'> | |
| +<table class='table table-striped table-bordered' width='90%'> | |
| + <thead> | |
| <tr> | |
| <th>ID</th> | |
| <th>Range</th> | |
| <th>CallerID</th> | |
| <th>Connected</th> | |
| <th>Date</th> | |
| + <th>Actions</th> | |
| </tr> | |
| + </thead> | |
| + <tbody> | |
| <% @jobs.sort{|a,b| b.id <=> a.id}.each do |dial_job| %> | |
| <tr> | |
| <td><%=h dial_job.id %></td> | |
| <td><%=h dial_job.range %></td> | |
| - <td><%=h dial_job.cid_mask %></td> | |
| + <td><%=h dial_job.cid_mask %></td> | |
| <td><%=h ( | |
| - DialResult.count(:conditions => ['dial_job_id = ? and processe… | |
| - "/" + | |
| - DialResult.count(:conditions => ['dial_job_id = ?', dial_job.i… | |
| + DialResult.count(:conditions => ['dial_job_id = ? and processe… | |
| + "/" + | |
| + DialResult.count(:conditions => ['dial_job_id = ?', dial_job.i… | |
| )%></td> | |
| <td><%=h dial_job.started_at.localtime.strftime("%Y-%m-%d %H:%M:%S") %></t… | |
| - <!-- <td><%= link_to 'Overview', show_analyze_path(dial_job) %></td> --> | |
| - <td><%= link_to 'Browse', view_analyze_path(dial_job) %></td> | |
| - <td><%= link_to 'ReAnalyze', reanalyze_dial_result_path(dial_job), :co… | |
| + | |
| + <td> | |
| + <a class="btn btn-mini" href="<%= view_dial_result_path(dial_job) %>">… | |
| + | |
| + <% if(dial_job.processed) %> | |
| + <a class="btn btn-mini" href="<%= analyze_dial_result_… | |
| + <a class="btn btn-mini" href="<%= reanalyze_dial_resul… | |
| + <% else %> | |
| + <a class="btn btn-mini" href="<%= analyze_dial_result_… | |
| + <% end %> | |
| + | |
| + <a class="btn btn-mini" href="<%= dial_result_path(dial_job) %>" d… | |
| + </td> | |
| </tr> | |
| + | |
| <% end %> | |
| +</tbody> | |
| </table> | |
| <%= raw(will_paginate @jobs) %> | |
| diff --git a/app/views/analyze/view.html.erb b/app/views/analyze/view.html.erb | |
| @@ -12,11 +12,14 @@ | |
| <%= raw(will_paginate @results) %> | |
| -<table class='table_scaffold' width='100%'> | |
| +<table class='table table-striped table-bordered' width='90%'> | |
| + <thead> | |
| <tr> | |
| <th>Number</th> | |
| <th>Signal</th> | |
| </tr> | |
| + </thead> | |
| + <tbody> | |
| <% @results.each do |dial_result| %> | |
| <tr> | |
| @@ -56,13 +59,13 @@ | |
| </td> | |
| </tr> | |
| <% end %> | |
| +</tbody> | |
| </table> | |
| <%= raw(will_paginate @results) %> | |
| <script type="text/javascript"> | |
| $(function() { | |
| - // Use this example, or... | |
| $('a.lightbox').lightBox(); | |
| }); | |
| </script> | |
| diff --git a/app/views/analyze/view_matches.html.erb b/app/views/analyze/view_m… | |
| @@ -1,13 +1,12 @@ | |
| <% dial_result = @result %> | |
| <h1 class='title'><%= @result.number %> (<a href="<%=view_analyze_path(dial_re… | |
| -<table class='table_scaffold' width='100%'> | |
| +<table class='table table-striped table-bordered' width='90%'> | |
| <tr> | |
| <th>Number</th> | |
| <th>Signal</th> | |
| </tr> | |
| - | |
| <tr> | |
| <td align='center'> | |
| @@ -42,15 +41,19 @@ | |
| <% end %> | |
| </td> | |
| </tr> | |
| + | |
| </table><br/><br/> | |
| <h1 class='title'>Matches for <%= @result.number %></h1> | |
| -<table class='table_scaffold' width='100%'> | |
| +<table class='table table-striped table-bordered' width='90%'> | |
| + <thead> | |
| <tr> | |
| <th>Number</th> | |
| <th>Signal</th> | |
| </tr> | |
| + </thead> | |
| + <tbody> | |
| <% @results.each do |dial_result| %> | |
| <tr> | |
| @@ -93,6 +96,7 @@ | |
| </td> | |
| </tr> | |
| <% end %> | |
| +</tbody> | |
| </table> | |
| <script type="text/javascript"> | |
| diff --git a/app/views/dial_jobs/index.html.erb b/app/views/dial_jobs/index.htm… | |
| @@ -2,27 +2,30 @@ | |
| <h1 class='title'>Submitted Jobs</h1> | |
| -<table class='table_scaffold' width='100%'> | |
| +<table class='table table-striped table-bordered' width='90%'> | |
| <tr> | |
| - <th>ID</th> | |
| + <th>ID</th> | |
| <th>Range</th> | |
| - <th>CallerID</th> | |
| + <th>CallerID</th> | |
| <th>Seconds</th> | |
| <th>Lines</th> | |
| - <th>Submitted Time</th> | |
| + <th>Submitted Time</th> | |
| + <th>Actions</th> | |
| </tr> | |
| <% @submitted_jobs.each do |dial_job| %> | |
| <tr> | |
| <td><%=h dial_job.id %></td> | |
| <td><%=h dial_job.range %></td> | |
| - <td><%=h dial_job.cid_mask %></td> | |
| + <td><%=h dial_job.cid_mask %></td> | |
| <td><%=h dial_job.seconds %></td> | |
| <td><%=h dial_job.lines %></td> | |
| <td><%=h dial_job.created_at.localtime.strftime("%Y-%m-%d %H:%M:%S %Z") %>… | |
| - <td><%= link_to 'Execute', run_dial_job_path(dial_job), :confirm => 'Launc… | |
| - <td><%= link_to 'Modify', edit_dial_job_path(dial_job)%></td> | |
| - <td><%= link_to 'Delete', dial_job, :confirm => 'Are you sure?', :method =… | |
| + | |
| + <td> | |
| + <a class="btn btn-mini" href="<%= run_dial_job_path(dial_job) %>" … | |
| + <a class="btn btn-mini" href="<%= dial_job %>" data-confirm="R… | |
| + </td> | |
| </tr> | |
| <% end %> | |
| </table> | |
| @@ -33,7 +36,7 @@ | |
| <h1 class='title'>Active Jobs</h1> | |
| -<table class='table_scaffold' width='100%'> | |
| +<table class='table table-striped table-bordered' width='90%'> | |
| <tr> | |
| <th>ID</th> | |
| <th>Range</th> | |
| @@ -43,8 +46,9 @@ | |
| <th>Status</th> | |
| <th>Progress</th> | |
| <th>Start Time</th> | |
| + <th>Actions</th> | |
| </tr> | |
| - | |
| + | |
| <% @active_jobs.each do |dial_job| %> | |
| <tr class='active_job_row'> | |
| <td><%=h dial_job.id %></td> | |
| @@ -55,7 +59,9 @@ | |
| <td><%=h dial_job.status %></td> | |
| <td><%=h dial_job.progress %>%</td> | |
| <td><%=h dial_job.started_at.localtime.strftime("%Y-%m-%d %H:%M:%S %Z") %>… | |
| - <td colspan='3'><%= link_to 'Stop', dial_job, :confirm => 'Are you sure?',… | |
| + <td> | |
| + <a class="btn btn-mini" href="<%= stop_dial_job(dial_job) %>" … | |
| + </td> | |
| </tr> | |
| <% end %> | |
| </table> | |
| @@ -68,40 +74,8 @@ | |
| <% end %> | |
| <% if (@active_jobs.length + @submitted_jobs.length == 0) %> | |
| -<h1 class='title'>No Active or Submitted Jobs</h1> | |
| +<h1 class='title'>No Active Jobs</h1> | |
| <br/> | |
| +<a class="btn" href="<%= new_dial_job_path %>"><i class="icon-plus"></i> Start… | |
| <% end %> | |
| -<h1 class='title'>Submit a New Job</h1> | |
| - | |
| -<%= form_for(@new_job, :html => { :multipart => true }) do |f| %> | |
| - <%= f.error_messages %> | |
| - <p> | |
| - <%= f.label :range, 'Specify target telephone range(s) (1-123-456-7890 or … | |
| - <%= f.text_area :range, :size => "35x5" %> | |
| - </p> | |
| - | |
| - <p> | |
| - <%= f.label :range_file, 'Or upload a file containing the target ranges' %… | |
| - <%= f.file_field :range_file %> | |
| - </p> | |
| - | |
| - <p> | |
| - <%= f.label :seconds, 'Seconds of audio to capture' %><br /> | |
| - <%= f.text_field :seconds, :value => 53 %> | |
| - </p> | |
| - | |
| - <p> | |
| - <%= f.label :lines, 'Maximum number of outgoing lines' %><br /> | |
| - <%= f.text_field :lines, :value => 10 %> | |
| - </p> | |
| - | |
| - <p> | |
| - <%= f.label :lines, 'The source Caller ID range (1-555-555-5555 or 1-555-5… | |
| - <%= f.text_field :cid_mask, :value => '1-123-456-XXXX' %> | |
| - </p> | |
| - | |
| - <p> | |
| - <%= f.submit "Create" %> | |
| - </p> | |
| -<% end %> | |
| diff --git a/app/views/dial_results/index.html.erb b/app/views/dial_results/ind… | |
| @@ -1,41 +1,57 @@ | |
| -<% if @completed_jobs.length > 0 %> | |
| +<% if @jobs.length > 0 %> | |
| <h1 class='title'>Completed Jobs</h1> | |
| -<table class='table_scaffold' width='100%'> | |
| +<%= raw(will_paginate @jobs) %> | |
| +<table class='table table-striped table-bordered' width='90%'> | |
| + <thead> | |
| <tr> | |
| <th>ID</th> | |
| <th>Range</th> | |
| - <th>CID</th> | |
| - <th>Answered</th> | |
| - <th>Time</th> | |
| + <th>CallerID</th> | |
| + <th>Connected</th> | |
| + <th>Date</th> | |
| + <th>Actions</th> | |
| </tr> | |
| + </thead> | |
| + <tbody> | |
| -<% @completed_jobs.sort{|a,b| b.id <=> a.id}.each do |dial_job| %> | |
| +<% @jobs.sort{|a,b| b.id <=> a.id}.each do |dial_job| %> | |
| <tr> | |
| <td><%=h dial_job.id %></td> | |
| <td><%=h dial_job.range %></td> | |
| - <td><%=h dial_job.cid_mask %></td> | |
| + <td><%=h dial_job.cid_mask %></td> | |
| <td><%=h ( | |
| - DialResult.count(:conditions => ['dial_job_id = ? and complete… | |
| - "/" + | |
| - DialResult.count(:conditions => ['dial_job_id = ?', dial_job.i… | |
| + DialResult.count(:conditions => ['dial_job_id = ? and processe… | |
| + "/" + | |
| + DialResult.count(:conditions => ['dial_job_id = ?', dial_job.i… | |
| )%></td> | |
| <td><%=h dial_job.started_at.localtime.strftime("%Y-%m-%d %H:%M:%S") %></t… | |
| - <td><%= link_to 'View', view_dial_result_path(dial_job) %></td> | |
| - <% if(dial_job.processed) %> | |
| - <td><%= link_to 'View Analysis', analyze_dial_result_path(dial… | |
| - <% else %> | |
| - <td><%= link_to 'Analyze Calls', analyze_dial_result_path(dial… | |
| - <% end %> | |
| - <td><%= link_to 'Purge', purge_dial_result_path(dial_job), :confirm =>… | |
| + | |
| + <td> | |
| + <a class="btn btn-mini" href="<%= view_dial_result_path(dial_job) %>" … | |
| + | |
| + <% if(dial_job.processed) %> | |
| + <a class="btn btn-mini" href="<%= analyze_dial_result_… | |
| + <a class="btn btn-mini" href="<%= reanalyze_dial_resul… | |
| + <% else %> | |
| + <a class="btn btn-mini" href="<%= analyze_dial_result_… | |
| + <% end %> | |
| + | |
| + <a class="btn btn-mini" href="<%= dial_result_path(dial_job) %>" d… | |
| + </td> | |
| </tr> | |
| + | |
| <% end %> | |
| +</tbody> | |
| </table> | |
| -<%= raw(will_paginate @completed_jobs) %> | |
| +<%= raw(will_paginate @jobs) %> | |
| <% else %> | |
| <h1 class='title'>No Completed Jobs</h1> | |
| +<br/> | |
| <% end %> | |
| + | |
| +<a class="btn" href="<%= new_dial_job_path %>"><i class="icon-plus"></i> Start… | |
| diff --git a/app/views/dial_results/view.html.erb b/app/views/dial_results/view… | |
| @@ -12,7 +12,10 @@ | |
| </tr> | |
| </table> | |
| -<table class='table_scaffold' width='100%'> | |
| +<br/> | |
| + | |
| +<table class='table table-striped table-bordered' width='90%' id='results'> | |
| + <thead> | |
| <tr> | |
| <th>Number</th> | |
| <th>CallerID</th> | |
| @@ -22,6 +25,8 @@ | |
| <th>Seconds</th> | |
| <th>Ring Time</th> | |
| </tr> | |
| + </thead> | |
| + <tbody> | |
| <% for dial_result in @dial_results.sort{|a,b| a.number <=> b.number } %> | |
| <tr> | |
| <td><%= dial_result.number %></td> | |
| @@ -33,6 +38,7 @@ | |
| <td><%= dial_result.ringtime.to_i %></td> | |
| </tr> | |
| <% end %> | |
| + </tbody> | |
| </table> | |
| <%= raw(will_paginate @dial_results) %> | |
| @@ -42,3 +48,11 @@ | |
| <% end %> | |
| <br /> | |
| + | |
| +<%= javascript_tag do %> | |
| +// For fixed width containers | |
| +$('#results').dataTable({ | |
| + "sDom": "<'row'<'span6'l><'span6'f>r>t<'row'<'span6'i><'span6'p>>", | |
| + "sPaginationType": "bootstrap" | |
| +}); | |
| +<% end %> | |
| diff --git a/app/views/home/about.html.erb b/app/views/home/about.html.erb | |
| @@ -1,111 +1,116 @@ | |
| -<table width='100%' align='center' border='0' cellpadding='9' cellspacing='0'> | |
| -<tr><td valign='top'> | |
| +<div class="row"> | |
| + | |
| +<div class="span9"> | |
| <h1 class='title'>About WarVOX</h1> | |
| <b>WarVOX</b> is a product of <a href="http://www.rapid7.com/">Rapid7 Inc</a> … | |
| free software. WarVOX is intended for legal security assessment, asset invento… | |
| -and research purposes only. The latest version of WarVOX can be found at | |
| -<a href="https://github.com/rapid7/warvox/">https://github.com/rapid7/warvox/<… | |
| - | |
| -</td><td valign='top' align='center'> | |
| +and research purposes only. The latest version of WarVOX can be found in <i cl… | |
| +<a href="https://github.com/rapid7/warvox/"> https://github.com/rapid7/warvox/… | |
| +</div> | |
| +<div class="span3"> | |
| <h1 class='title'>Statistics</h1> | |
| -<table id="warvox_stats" cellspacing="0" width=200> | |
| +<table class='table table-condensed'> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item"> | |
| - Version: | |
| + <td> | |
| + Version | |
| </td> | |
| <td><%= WarVOX::VERSION %></td> | |
| </tr> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item"> | |
| - Providers: | |
| + <td> | |
| + Providers | |
| </td> | |
| <td><%= Provider.count %></td> | |
| </tr> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item"> | |
| - Active Jobs: | |
| + <td> | |
| + Active Jobs | |
| </td> | |
| <td><%= DialJob.count(:conditions => ['status = ?', 'active']) %></td> | |
| </tr> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item"> | |
| - Total Jobs: | |
| + <td> | |
| + Total Jobs | |
| </td> | |
| <td><%= DialJob.count %></td> | |
| </tr> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item"> | |
| - Results: | |
| + <td> | |
| + Results | |
| </td> | |
| <td><%= DialResult.count %></td> | |
| </tr> | |
| </table> | |
| +</div> | |
| +</div> | |
| +<!-- // row --> | |
| -</td></tr> | |
| -<tr><td valign='top' colspan='2'> | |
| +<div class="row"> | |
| +<div class="span12"> | |
| + | |
| <h1 class='title'>Configuration</h1> | |
| -<table id="warvox_conf" cellspacing="0" width='100%'> | |
| +<table width='100%' class='table table-bordered'> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item" width='200'> | |
| - Base Directory: | |
| + <td> | |
| + Base Directory | |
| </td> | |
| <td><%= WarVOX::Base %></td> | |
| </tr> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item" width='200'> | |
| - Configuration File: | |
| + <td> | |
| + Configuration File | |
| </td> | |
| <td><%= WarVOX::Conf %></td> | |
| </tr> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item" width='200'> | |
| - Admin User: | |
| + <td> | |
| + Admin User | |
| </td> | |
| <td><%= WarVOX::Config.authentication_creds[0] %></td> | |
| </tr> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item" width='200'> | |
| + <td> | |
| GNUPlot | |
| </td> | |
| <td><%= WarVOX::Config.tool_path('gnuplot') || "MISSING" %></td> | |
| </tr> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item" width='200'> | |
| + <td> | |
| LAME | |
| </td> | |
| <td><%= WarVOX::Config.tool_path('lame') || "MISSING" %></td> | |
| </tr> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item" width='200'> | |
| + <td> | |
| IAXRECORD | |
| </td> | |
| <td><%= WarVOX::Config.tool_path('iaxrecord') || "MISSING" %></td> | |
| </tr> | |
| <tr> | |
| - <td valign="top" align="right" class="header_item" width='200'> | |
| + <td> | |
| KissFFT | |
| </td> | |
| <td><%= @has_kissfft %></td> | |
| @@ -115,12 +120,7 @@ and research purposes only. The latest version of WarVOX c… | |
| <br/><br/> | |
| <h1 class='title'>Dial Exclusions (Blacklist)</h1> | |
| -<table id="warvox_blacklist" cellspacing="0" width='100%'> | |
| -<tr> | |
| - <td valign="top" align="left" class="header_item" width='200'> | |
| - <pre><%=h File.read(WarVOX::Config.blacklist_path) %></pre> | |
| - </td> | |
| -</tr> | |
| -</table> | |
| +<pre><%=h File.read(WarVOX::Config.blacklist_path) %></pre> | |
| -</td></tr></table> | |
| +</div> | |
| +</div> | |
| diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb | |
| @@ -1,10 +1,23 @@ | |
| +<div class="row"> | |
| +<div class="span3"> | |
| +<div class="sidebar"> | |
| + <ul class="nav nav-list"> | |
| + <li class="active"><a href="#"><i class="icon-play"></i> Getting Started</… | |
| + <li><a href="#"><i class="icon-book"></i> Library</a></li> | |
| + <li><a href="#"><i class="icon-pencil"></i> Applications</a></li> | |
| + <li><a href="#"><i class="icon-cogs"></i> Settings</a></li> | |
| + </ul> | |
| +</div> | |
| +</div> | |
| +<div class="span9"> | |
| + | |
| <h1 class='title'>Introduction</h1> | |
| <p> | |
| -WarVOX is a suite of tools for exploring, classifying, and auditing telephone … | |
| -WarVOX works with the actual audio from each call and does not use a modem dir… | |
| +WarVOX is a suite of tools for exploring, classifying, and auditing telephone … | |
| +WarVOX works with the actual audio from each call and does not use a modem dir… | |
| and classify a wide range of interesting lines, including modems, faxes, voice… | |
| -and forwarders. WarVOX provides the unique ability to classify all telephone l… | |
| +and forwarders. WarVOX provides the unique ability to classify all telephone l… | |
| connected to modems, allowing for a comprehensive audit of a telephone system. | |
| </p> | |
| @@ -43,3 +56,6 @@ After the job completes, access the <a href="/dial_results/">… | |
| <p> | |
| If for some reason WarVOX is not working correctly, or if you have any questio… | |
| </p> | |
| + | |
| +</div> | |
| +</div> | |
| diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/applica… | |
| @@ -7,64 +7,53 @@ | |
| <title><%= content_for?(:title) ? yield(:title) : "WarVOX v#{WarVOX::VERSI… | |
| <%= csrf_meta_tags %> | |
| - <!-- Le HTML5 shim, for IE6-8 support of HTML elements --> | |
| <!--[if lt IE 9]> | |
| - <script src="http://html5shim.googlecode.com/svn/trunk/html5.js" type="t… | |
| + <%= javascript_include_tag "html5" %> | |
| <![endif]--> | |
| + <%= javascript_include_tag "application" %> | |
| <%= stylesheet_link_tag "application", :media => "all" %> | |
| - <!-- For third-generation iPad with high-resolution Retina display: --> | |
| - <!-- Size should be 144 x 144 pixels --> | |
| <%= favicon_link_tag 'images/apple-touch-icon-144x144-precomposed.png', :r… | |
| - | |
| - <!-- For iPhone with high-resolution Retina display: --> | |
| - <!-- Size should be 114 x 114 pixels --> | |
| <%= favicon_link_tag 'images/apple-touch-icon-114x114-precomposed.png', :r… | |
| - | |
| - <!-- For first- and second-generation iPad: --> | |
| - <!-- Size should be 72 x 72 pixels --> | |
| <%= favicon_link_tag 'images/apple-touch-icon-72x72-precomposed.png', :rel… | |
| - | |
| - <!-- For non-Retina iPhone, iPod Touch, and Android 2.1+ devices: --> | |
| - <!-- Size should be 57 x 57 pixels --> | |
| <%= favicon_link_tag 'images/apple-touch-icon-precomposed.png', :rel => 'a… | |
| - | |
| - <!-- For all other devices --> | |
| - <!-- Size should be 32 x 32 pixels --> | |
| <%= favicon_link_tag 'images/favicon.ico', :rel => 'shortcut icon' %> | |
| + | |
| + <%= javascript_tag do %> | |
| + $(document).ready(function() { | |
| + $("a").tooltip(); | |
| + } | |
| + <% end %> | |
| </head> | |
| <body> | |
| <div class="navbar navbar-fixed-top"> | |
| <div class="navbar-inner"> | |
| <div class="container"> | |
| - <a class="btn btn-navbar" data-target=".nav-collapse" data-toggle="c… | |
| - <span class="icon-bar"></span> | |
| - <span class="icon-bar"></span> | |
| - <span class="icon-bar"></span> | |
| - <span class="icon-bar"></span> | |
| - </a> | |
| - <a class="brand" href="/">WarVOX</a> | |
| + <a class="brand" href="/"><img src="/assets/logo_light.png" border=0… | |
| <%= tabs %> | |
| </div> | |
| </div> | |
| </div> | |
| + | |
| <div class="container"> | |
| - <div class="row"> | |
| - <div class="span12"> | |
| - <%= yield %> | |
| + <div class="row"> | |
| + <div class="span12 content"> | |
| + | |
| + <div class="content"> | |
| + <%= yield %> | |
| </div> | |
| - </div><!--/row--> | |
| - <footer> | |
| - <p>© Rapid7, Inc. 2009-2013</p> | |
| - </footer> | |
| + <footer class="footer"> | |
| + <p>© Rapid7, Inc. 2009-2013</p> | |
| + </footer> | |
| + </div> | |
| + </div> | |
| </div> <!-- /container --> | |
| - <%= javascript_include_tag "application" %> | |
| </body> | |
| </html> | |
| diff --git a/app/views/providers/index.html.erb b/app/views/providers/index.htm… | |
| @@ -1,71 +1,46 @@ | |
| <% if @providers.length > 0 %> | |
| -<h1 class='title'>Providers</h1> | |
| -<table class='table_scaffold' width='100%'> | |
| +<h1 class='title'>VoIP Providers (IAX)</h1> | |
| +<table class='table table-striped table-bordered' width='90%'> | |
| <tr> | |
| - <th>Enabled</th> | |
| - <th>Name</th> | |
| - <th>Host</th> | |
| - <th>Port</th> | |
| - <th>User</th> | |
| - <th>Pass</th> | |
| + <th>Active</th> | |
| + <th>Provider Name</th> | |
| + <th>IAX Server</th> | |
| + <th>IAX Port</th> | |
| + <th>Username</th> | |
| <th>Lines</th> | |
| + <th>Actions</th> | |
| + | |
| </tr> | |
| <% for provider in @providers %> | |
| <tr> | |
| - <td><%=h provider.enabled %></td> | |
| + <td> | |
| + <i class="icon-<%= provider.enabled ? "ok" : "remove" %>"></i> | |
| + </td> | |
| <td><%=h provider.name %></td> | |
| <td><%=h provider.host %></td> | |
| <td><%=h provider.port %></td> | |
| <td><%=h provider.user %></td> | |
| - <td>********</td> | |
| <td><%=h provider.lines %></td> | |
| - <td><%= link_to 'Modify', edit_provider_path(provider) %></td> | |
| - <td><%= link_to 'Delete', provider, :confirm => 'Are you sure?', :method =… | |
| + <td> | |
| + <a class="btn btn-mini" href="<%= edit_provider_path(provider) %>"… | |
| + <a class="btn btn-mini" href="<%= provider_path(provider) %>" data… | |
| + </td> | |
| </tr> | |
| <% end %> | |
| </table> | |
| <br /> | |
| -<%= link_to 'New Provider', new_provider_path %> | |
| + | |
| +<a class="btn" href="<%= new_provider_path %>"><i class="icon-plus"></i> Add P… | |
| <% else %> | |
| <h1 class='title'>No Configured Providers</h1> | |
| <br/> | |
| -<h1 class='title'>Configure a New Provider</h1> | |
| +<a class="btn" href="<%= new_provider_path %>"><i class="icon-plus"></i> Add P… | |
| -<%= form_for(@new_provider) do |f| %> | |
| - <%= f.error_messages %> | |
| - <p> | |
| - <%= f.label :name, 'The nickname for this provider' %><br /> | |
| - <%= f.text_field :name %> | |
| - </p> | |
| - <p> | |
| - <%= f.label :host, 'The IAX2 server name' %><br /> | |
| - <%= f.text_field :host %> | |
| - </p> | |
| - <p> | |
| - <%= f.label :port, 'The IAX2 port (normally 4569)' %><br /> | |
| - <%= f.text_field :port, :value => 4569 %> | |
| - </p> | |
| - <p> | |
| - <%= f.label :user, 'The username to access the provider' %><br /> | |
| - <%= f.text_field :user %> | |
| - </p> | |
| - <p> | |
| - <%= f.label :pass, 'The password to access the provider' %><br /> | |
| - <%= f.text_field :pass %> | |
| - </p> | |
| - <p> | |
| - <%= f.label :lines, 'The number of available outbound lines' %><br /> | |
| - <%= f.text_field :lines, :value => 1 %> | |
| - </p> | |
| - <p> | |
| - <%= f.submit "Create" %> | |
| - </p> | |
| -<% end %> | |
| <% end %> | |
| diff --git a/app/views/shared/graphs/_call_results.html.erb b/app/views/shared/… | |
| @@ -1,7 +1,11 @@ | |
| <% | |
| graph_id = "g" + rand(0x1000000).to_s | |
| -pie_data = raw("[ 'Timeout', #{@call_results[:Timeout].to_i.to_s} ], ['Busy', … | |
| +line_data = raw("") | |
| + | |
| +line_data << raw("{ name: 'Timeout', data: [ #{@call_results[:Timeout].to_i.to… | |
| +line_data << raw("{ name: 'Busy', data: [ #{@call_results[:Busy].to_i.to_s } ]… | |
| +line_data << raw("{ name: 'Answered', data: [ #{@call_results[:Answered].to_i.… | |
| %> | |
| @@ -12,44 +16,43 @@ pie_data = raw("[ 'Timeout', #{@call_results[:Timeout].to_i… | |
| $(function () { | |
| var chart; | |
| $(document).ready(function() { | |
| - chart = new Highcharts.Chart({ | |
| + chart = new Highcharts.Chart({ | |
| chart: { | |
| renderTo: '<%= graph_id %>', | |
| - plotBackgroundColor: null, | |
| - plotBorderWidth: null, | |
| - plotShadow: false, | |
| - shadow: true, | |
| - width: 600, | |
| - height: 400 | |
| + type: 'bar', | |
| + height: 150 | |
| }, | |
| title: { | |
| - text: 'Dial Results' | |
| + text: 'Call Results' | |
| + }, | |
| + xAxis: { | |
| + categories: ['Calls'] | |
| + }, | |
| + yAxis: { | |
| + min: 0, | |
| + title: { | |
| + text: 'Calls by Result' | |
| + } | |
| + }, | |
| + legend: { | |
| + backgroundColor: '#FFFFFF', | |
| + reversed: true | |
| }, | |
| tooltip: { | |
| - pointFormat: '{series.name}: <b>{point.percentage}%</b>', | |
| - percentageDecimals: 1 | |
| + formatter: function() { | |
| + return ''+ | |
| + this.series.name +': '+ this.y +''; | |
| + } | |
| }, | |
| plotOptions: { | |
| - pie: { | |
| - allowPointSelect: true, | |
| - cursor: 'pointer', | |
| - dataLabels: { | |
| - enabled: true, | |
| - color: '#000000', | |
| - connectorColor: '#000000', | |
| - formatter: function() { | |
| - return '<b>'+ this.point.name +'</b>: '+ Math.roun… | |
| - } | |
| - } | |
| + series: { | |
| + stacking: 'normal' | |
| } | |
| }, | |
| - series: [{ | |
| - type: 'pie', | |
| - name: 'Result', | |
| - data: [<%= pie_data %>] | |
| - }] | |
| + series: [ <%= line_data %> ] | |
| }); | |
| }); | |
| + | |
| }); | |
| diff --git a/app/views/shared/graphs/_lines_by_type.html.erb b/app/views/shared… | |
| @@ -1,11 +1,10 @@ | |
| <% | |
| graph_id = "g" + rand(0x1000000).to_s | |
| -pie_data = raw("") | |
| - | |
| +line_data = raw("") | |
| @lines_by_type.keys.sort{|a,b| @lines_by_type[b] <=> @lines_by_type[a]}.each d… | |
| - pie_data << raw("[ '#{k.to_s.capitalize}', #{@lines_by_type[k].to_i.to… | |
| + line_data << raw("{ name: '#{k.to_s.capitalize}', data: [ #{ @lines_by… | |
| end | |
| %> | |
| @@ -17,44 +16,43 @@ end | |
| $(function () { | |
| var chart; | |
| $(document).ready(function() { | |
| - chart = new Highcharts.Chart({ | |
| + chart = new Highcharts.Chart({ | |
| chart: { | |
| renderTo: '<%= graph_id %>', | |
| - plotBackgroundColor: null, | |
| - plotBorderWidth: null, | |
| - plotShadow: false, | |
| - shadow: true, | |
| - width: 600, | |
| - height: 400 | |
| + type: 'bar', | |
| + height: 150 | |
| }, | |
| title: { | |
| - text: 'Line Classification' | |
| + text: 'Line Types' | |
| + }, | |
| + xAxis: { | |
| + categories: ['Lines'] | |
| + }, | |
| + yAxis: { | |
| + min: 0, | |
| + title: { | |
| + text: 'Lines by Type' | |
| + } | |
| + }, | |
| + legend: { | |
| + backgroundColor: '#FFFFFF', | |
| + reversed: true | |
| }, | |
| tooltip: { | |
| - pointFormat: '{series.name}: <b>{point.percentage}%</b>', | |
| - percentageDecimals: 1 | |
| + formatter: function() { | |
| + return ''+ | |
| + this.series.name +': '+ this.y +''; | |
| + } | |
| }, | |
| plotOptions: { | |
| - pie: { | |
| - allowPointSelect: true, | |
| - cursor: 'pointer', | |
| - dataLabels: { | |
| - enabled: true, | |
| - color: '#000000', | |
| - connectorColor: '#000000', | |
| - formatter: function() { | |
| - return '<b>'+ this.point.name +'</b>: '+ Math.roun… | |
| - } | |
| - } | |
| + series: { | |
| + stacking: 'normal' | |
| } | |
| }, | |
| - series: [{ | |
| - type: 'pie', | |
| - name: 'Result', | |
| - data: [<%= pie_data %>] | |
| - }] | |
| + series: [ <%= line_data %> ] | |
| }); | |
| }); | |
| + | |
| }); | |
| diff --git a/config/environments/development.rb b/config/environments/developme… | |
| @@ -34,4 +34,6 @@ Web::Application.configure do | |
| # Expands the lines which load the assets | |
| config.assets.debug = true | |
| + | |
| + config.serve_static_assets = true | |
| end | |
| diff --git a/lib/templates/erb/scaffold/_form.html.erb b/lib/templates/erb/scaf… | |
| @@ -0,0 +1,11 @@ | |
| +<%%= semantic_form_for @<%= singular_name %> do |f| %> | |
| + <%%= f.inputs do %> | |
| + <%- attributes.each do |attribute| -%> | |
| + <%%= f.input :<%= attribute.name %> %> | |
| + <%- end -%> | |
| + <%% end %> | |
| + | |
| + <%%= f.actions do %> | |
| + <%%= f.action :submit, :as => :input %> | |
| + <%% end %> | |
| +<%% end %> | |
| diff --git a/public/robots.txt b/public/robots.txt | |
| @@ -1,5 +1,2 @@ | |
| -# See http://www.robotstxt.org/wc/norobots.html for documentation on how to us… | |
| -# | |
| -# To ban all spiders from the entire site uncomment the next two lines: | |
| -# User-Agent: * | |
| -# Disallow: / | |
| + User-Agent: * | |
| + Disallow: / |