From 0086f7d28a66970a129ba66b364299551ef07e7e Mon Sep 17 00:00:00 2001 From: niphlod Date: Wed, 18 Mar 2015 23:11:55 +0100 Subject: [PATCH] first iteration on bs3 cleanup --- applications/welcome/models/db.py | 23 +- applications/welcome/models/menu.py | 82 +- applications/welcome/private/appconfig.ini | 19 + .../welcome/static/css/web2py-bootstrap3.css | 712 ++++++------------ .../welcome/static/js/web2py-bootstrap3.js | 214 ++---- applications/welcome/views/default/index.html | 14 +- gluon/tools.py | 7 +- 7 files changed, 409 insertions(+), 662 deletions(-) create mode 100644 applications/welcome/private/appconfig.ini diff --git a/applications/welcome/models/db.py b/applications/welcome/models/db.py index ab0c624e..3efe2377 100644 --- a/applications/welcome/models/db.py +++ b/applications/welcome/models/db.py @@ -9,9 +9,15 @@ ## be redirected to HTTPS, uncomment the line below: # request.requires_https() +## app configuration made easy. Look inside private/appconfig.ini +from gluon.contrib.appconfig import AppConfig +## once in production, remove reload=True to gain full speed +myconf = AppConfig(reload=True) + + if not request.env.web2py_runtime_gae: ## if NOT running on Google App Engine use SQLite or other DB - db = DAL('sqlite://storage.sqlite',pool_size=1,check_reserved=['all']) + db = DAL(myconf.take('db.uri'), pool_size=myconf.take('db.pool_size', cast=int), check_reserved=['all']) else: ## connect to Google BigTable (optional 'google:datastore://namespace') db = DAL('google:datastore+ndb') @@ -26,7 +32,9 @@ else: ## none otherwise. a pattern can be 'controller/function.extension' response.generic_patterns = ['*'] if request.is_local else [] ## choose a style for forms -response.formstyle = 'bootstrap3_inline' # or 'bootstrap3_stacked' or 'bootstrap2' or other +response.formstyle = myconf.take('forms.formstyle') # or 'bootstrap3_stacked' or 'bootstrap2' or other +response.form_label_separator = myconf.take('forms.separator') + ## (optional) optimize handling of static files # response.optimize_css = 'concat,minify,inline' @@ -54,20 +62,15 @@ auth.define_tables(username=False, signature=False) ## configure email mail = auth.settings.mailer -mail.settings.server = 'logging' if request.is_local else 'smtp.gmail.com:587' -mail.settings.sender = 'you@gmail.com' -mail.settings.login = 'username:password' +mail.settings.server = 'logging' if request.is_local else myconf.take('smtp.sender') +mail.settings.sender = myconf.take('smtp.sender') +mail.settings.login = myconf.take('smtp.login') ## configure auth policy auth.settings.registration_requires_verification = False auth.settings.registration_requires_approval = False auth.settings.reset_password_requires_verification = True -## if you need to use OpenID, Facebook, MySpace, Twitter, Linkedin, etc. -## register with janrain.com, write your domain:api_key in private/janrain.key -from gluon.contrib.login_methods.janrain_account import use_janrain -use_janrain(auth, filename='private/janrain.key') - ######################################################################### ## Define your tables below (or better in another model file) for example ## diff --git a/applications/welcome/models/menu.py b/applications/welcome/models/menu.py index db9de577..ea3e0923 100644 --- a/applications/welcome/models/menu.py +++ b/applications/welcome/models/menu.py @@ -40,34 +40,35 @@ def _(): ctr = request.controller # useful links to internal and external resources response.menu += [ - (SPAN('web2py', _class='highlighted'), False, 'http://web2py.com', [ (T('My Sites'), False, URL('admin', 'default', 'site')), - (T('This App'), False, URL('admin', 'default', 'design/%s' % app), [ - (T('Controller'), False, - URL( - 'admin', 'default', 'edit/%s/controllers/%s.py' % (app, ctr))), - (T('View'), False, - URL( - 'admin', 'default', 'edit/%s/views/%s' % (app, response.view))), - (T('Layout'), False, - URL( - 'admin', 'default', 'edit/%s/views/layout.html' % app)), - (T('Stylesheet'), False, - URL( - 'admin', 'default', 'edit/%s/static/css/web2py-bootstrap3.css' % app)), - (T('DB Model'), False, - URL( - 'admin', 'default', 'edit/%s/models/db.py' % app)), - (T('Menu Model'), False, - URL( - 'admin', 'default', 'edit/%s/models/menu.py' % app)), - (T('Database'), False, URL(app, 'appadmin', 'index')), - (T('Errors'), False, URL( - 'admin', 'default', 'errors/' + app)), - (T('About'), False, URL( - 'admin', 'default', 'about/' + app)), - ]), - ('web2py.com', False, 'http://www.web2py.com', [ + (T('This App'), False, '#', [ + (T('Design'), False, URL('admin', 'default', 'design/%s' % app)), + LI(_class="divider"), + (T('Controller'), False, + URL( + 'admin', 'default', 'edit/%s/controllers/%s.py' % (app, ctr))), + (T('View'), False, + URL( + 'admin', 'default', 'edit/%s/views/%s' % (app, response.view))), + (T('Layout'), False, + URL( + 'admin', 'default', 'edit/%s/views/layout.html' % app)), + (T('Stylesheet'), False, + URL( + 'admin', 'default', 'edit/%s/static/css/web2py-bootstrap3.css' % app)), + (T('DB Model'), False, + URL( + 'admin', 'default', 'edit/%s/models/db.py' % app)), + (T('Menu Model'), False, + URL( + 'admin', 'default', 'edit/%s/models/menu.py' % app)), + (T('Database'), False, URL(app, 'appadmin', 'index')), + (T('Errors'), False, URL( + 'admin', 'default', 'errors/' + app)), + (T('About'), False, URL( + 'admin', 'default', 'about/' + app)), + ]), + ('web2py.com', False, '#', [ (T('Download'), False, 'http://www.web2py.com/examples/default/download'), (T('Support'), False, @@ -85,7 +86,9 @@ def _(): (T('Recipes'), False, 'http://web2pyslices.com/'), (T('Semantic'), False, 'http://web2py.com/semantic'), ]), - (T('Documentation'), False, 'http://www.web2py.com/book', [ + (T('Documentation'), False, '#', [ + (T('Online book'), False, 'http://www.web2py.com/book'), + LI(_class="divider"), (T('Preface'), False, 'http://www.web2py.com/book/default/chapter/00'), (T('Introduction'), False, @@ -116,18 +119,25 @@ def _(): 'http://www.web2py.com/book/default/chapter/13'), (T('Other Recipes'), False, 'http://www.web2py.com/book/default/chapter/14'), - (T('Buy this book'), False, + (T("Buy web2py's book"), False, 'http://stores.lulu.com/web2py'), ]), - (T('Community'), False, None, [ + (T('Community'), False, None, [ (T('Groups'), False, 'http://www.web2py.com/examples/default/usergroups'), - (T('Twitter'), False, 'http://twitter.com/web2py'), - (T('Live Chat'), False, - 'http://webchat.freenode.net/?channels=web2py'), - ]), - (T('Plugins'), False, 'http://web2py.com/plugins')] - )] + (T('Twitter'), False, 'http://twitter.com/web2py'), + (T('Live Chat'), False, + 'http://webchat.freenode.net/?channels=web2py'), + ]), + (T('Plugins'), False, None, [ + ('plugin_wiki', False, + 'http://web2py.com/examples/default/download'), + (T('Other Plugins'), False, + 'http://web2py.com/plugins'), + (T('Layout Plugins'), + False, 'http://web2py.com/layouts'), + ]) + ] if DEVELOPMENT_MENU: _() if "auth" in locals(): auth.wikimenu() diff --git a/applications/welcome/private/appconfig.ini b/applications/welcome/private/appconfig.ini new file mode 100644 index 00000000..f45efbfc --- /dev/null +++ b/applications/welcome/private/appconfig.ini @@ -0,0 +1,19 @@ +; App configuration + +; db configuration +[db] +uri = sqlite://storage.sqlite +migrate = 1 +pool_size = 1 + +; smtp address and credentials +[smtp] +server = smtp.gmail.com:587 +sender = you@gmail.com +login = username:password + + +; form styling +[forms] +formstyle = bootstrap3_inline +separator = \ No newline at end of file diff --git a/applications/welcome/static/css/web2py-bootstrap3.css b/applications/welcome/static/css/web2py-bootstrap3.css index 647123ed..5689ce39 100644 --- a/applications/welcome/static/css/web2py-bootstrap3.css +++ b/applications/welcome/static/css/web2py-bootstrap3.css @@ -1,544 +1,310 @@ -/*! - * part of the package to convert web2py elements to bootstrap3 theme - * Developed by Paolo Caruccio ( paolo.caruccio66@gmail.com ) - * Released under MIT license - * version 1 rev.201402261600 - * - * Supported version of bootstrap framework: 3.0.2+ - - * The full package includes: - * - bootstrap3.py python module - * - this css file - * - web2py-bootstrap3.js - * - example of layout.html - * - rules overriding web2py.css -*/ - div.flash { - background-image: none; - border-radius: 4px; - -o-border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-width: 1px; - color: rgb(51, 51, 51); - font-weight: normal; - margin: 0 0 20px 0; - min-width: 28px; - max-width: 300px; - opacity: 1; - padding: 15px 35px 15px 15px; - vertical-align: baseline; - right: auto; + background-image: none; + border-radius: 4px; + -o-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + color: #333; + font-weight: 400; + min-width: 28px; + max-width: 300px; + opacity: 1; + vertical-align: baseline; + right: auto; + border-width: 1px; + margin: 0 0 20px; + padding: 15px 35px 15px 15px; } div.flash.alert:hover { - opacity: 1; + opacity: 1; } .ie-lte8 div.flash { - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter: progid: DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0); } .ie-lte8 div.flash:hover { - filter:alpha(opacity=100); -} -ul.navbar-nav li { - margin-bottom: 0; -} -ul.list-group, .bs3-form ul , ul.nav-tabs, ul.nav-pills { - margin-left: 0; -} -p.lead { - text-align: inherit; -} -form label { - white-space: normal; -} -form.form-inline [type="text"], [type="password"], select { - margin-right: 0; + filter: alpha(opacity=25); } + + div.error { - display: none; - width: auto; - background: transparent; - border: none; - padding: 0; - padding-left: 5px; - background-image: none; -} - -/* - * bootstrap3 adapters - * essential rules -*/ - -/* flash messages */ -div.flash.alert { - display: none; - position: fixed; - top: 70px; - right: 75px; - cursor: pointer; - z-index: 1000; - background-color: #f9edbe; - border-color: #f0c36d; } -div.flash.alert.centered { - right: auto; } -div.flash.alert.leftside { - right: auto; - left: 75px; } -div.flash.alert #closeflash { - display: inline-block; - position: relative; - top: -2px; - right: -21px; - color: inherit; - cursor: pointer; - opacity: 0.5; - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - text-shadow: 0 1px 0 #ffffff; - margin: 0; - padding: 0; -} - -/* buttons */ -.bs3-form-btn { - margin-top: 3px; - margin-bottom: 3px; -} - -/*image preview in update forms*/ -.w2p-uploaded-file .btn-group { - vertical-align: top; - margin-top: 0; -} -#file-reset-btn { - vertical-align: top; -} -.w2p-uploaded-file input[type="file"] { - display:inline-block; - padding-top: 7px; -} -.w2p-file-preview img { - max-width: 150px; -} -.w2p-file-preview:hover img { - background-color: #ebebeb; - border-color: #adadad; -} -.w2p-file-preview span { - min-width: 150px; - max-width: 150px; - display: inline-block; - line-height: 40px; - min-height: 40px; -} -#no-file { - display: inline-block; - background-color: #eee; - vertical-align: middle; - text-align: center; - border-radius: 4px; - min-width: 150px; - max-width: 150px; - line-height: 43px; - min-height: 43px; -} -/* form-inline */ -.form-inline .form-group { - margin-right: 4px; -} -/* list widget */ -.w2p_list li { - margin-bottom: 6px; -} -.w2p_list li input { - display: inline-block; - width: 59%; - margin-right: 4px; -} -/* autocomplete widget */ -div[id^=_autocomplete_] { - margin-top: -10px; - z-index: 1; -} -select.autocomplete { - display: block; - padding: 6px 12px; - font-size: 14px; - line-height: 1.428571429; - color: #555; - vertical-align: middle; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-color: #428bca; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); - box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); - -webkit-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s; -} - -/* nav-tabs */ -.nav-tabs { - margin-bottom: 15px; -} - -/* dropdown multilevels in menu*/ -/* fix issue when screen height is shorter than bs3 default */ -.navbar-collapse.short-screen { - max-height: 200px !important; -} -.dropdown-submenu>a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - margin-top: 5px; - margin-right: -10px; - border-style: solid; - /* right-arrow */ - border-color: transparent #cccccc; - border-width: 4px 0 4px 4px; -} - -@media (min-width: 768px) { - /* animation */ - .navbar-nav .dropdown-menu { - top: -9999px; - display: block; - opacity: 0; - -webkit-transition: opacity .4s ease-in-out; } - .dropdown-submenu { - position: relative; } - .dropdown-submenu>.dropdown-menu { - position: absolute; - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - border-radius: 0 4px 4px 4px; - /* animation */ - left: -9999px; - opacity: 0; - display: block; - -webkit-transition: opacity .4s ease-in-out; } - .navbar ul.nav li[data-w2pmenulevel="l0"]:hover >ul.dropdown-menu { - display: block; - /* animation */ - top: 100%; - opacity: 1; } - .dropdown-submenu:hover>.dropdown-menu { - display: block; - /* animation */ - left: 100%; - opacity: 1; } - .dropdown-submenu:hover>a, - .dropdown-submenu:focus>a { - color: #fff; - text-decoration: none; - background-color: #357ebd; } - .navbar-inverse .navbar-nav>li>a:hover, - .navbar-inverse .navbar-nav>li>a:focus, - .navbar-inverse .navbar-nav>li:hover>a { - color: #fff; - background-color: black; } - .dropdown-submenu>a:hover:after, - .dropdown-submenu:hover>a:after { - /* left-arrow */ - border-color: transparent #fff; - border-width: 4px 4px 4px 0; } -} -@media (max-width: 767px){ - .dropdown-menu { - width: 100%; - display: none; } - .dropdown-submenu>.dropdown-menu { - position: static; - float: none; - display: none; + width: auto; + background: transparent; border: none; - margin: 0; - padding: 0; - box-shadow: none; - text-indent: 8px; } - .dropdown-submenu>.dropdown-menu.open { - display: block; - height: 100%; } - .dropdown-submenu>a:after { - /* down-arrow */ - border-color: #cccccc transparent; - border-width: 4px 4px 0px 4px; } - .dropdown-submenu>a:hover:after { - border-color: #ffffff transparent; } - .dropdown-submenu>a.active { - font-weight: 700; } - .dropdown-submenu>a.active:after { - /* up-arrow */ - border-color: #ffffff transparent; - border-width: 0px 4px 4px 4px; } + background-image: none; + color: red; + display: inline-block; + padding: 5px; } - -/* - * application customization - * add custom rules -*/ -/* web2py logo */ -#web2py-logo { - color: #c6cecc; +div.flash.alert { + display: none; + position: fixed; + top: 70px; + right: 75px; + cursor: pointer; + z-index: 1000; + background-color: #f9edbe; + border-color: #f0c36d; } -#web2py-logo b { - display: inline-block; - margin-top: -1px; -} -#web2py-logo b>span { - font-size: 22px; - color: white; -} -#web2py-logo:hover { - color: white; -} -/*footer*/ -#footer>div.row { - padding-top: 9px; - margin: 20px 0 40px 0; - border-top: 1px solid #eee; -} -#footer p { - margin-left: -15px; - margin-right: -15px; -} -.dropdown .highlighted { - color: #428bca; -} - -form { - max-width: 600px; +.w2p-toolbar-hidden { + margin: 10px; } ul.w2p_list { - margin-left: 0; - padding-left: 0; + margin-left: 0; + padding-left: 0; +} +.w2p_list li { + margin-bottom: 6px; +} +.w2p_list li input { + display: inline-block; + width: 90%; + margin-right: 4px; +} +.w2p_list li a { + margin-bottom: 2px; +} +div[id^=_autocomplete_] { + margin-top: -10px; + z-index: 1; +} +select.autocomplete { + display: block; + font-size: 14px; + line-height: 1.428571429; + color: #555; + vertical-align: middle; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + border-color: #428bca; + padding: 6px 12px; +} +#web2py-logo { + color: #c6cecc; +} +#web2py-logo b { + display: inline-block; + margin-top: -1px; +} +#web2py-logo b>span { + font-size: 22px; + color: #FFF; +} +#web2py-logo:hover { + color: #FFF; +} +.footer > .container-fluid { + padding-left: 15px; + padding-right: 15px; + margin: 20px; } .background { - background: url(../images/background.jpg) no-repeat center center; -} -html { - background-color: #333; + background: url(../images/background.jpg) no-repeat center center; } body { - padding-top: 50px + padding-top: 50px; + margin-bottom: 60px; } header { - -webkit-box-shadow: 0px 0px 8px 2px #000000; - -moz-box-shadow: 0px 0px 8px 2px #000000; - box-shadow: 0px 0px 8px 2px #000000; + -webkit-box-shadow: 0 0 8px 2px #000; + -moz-box-shadow: 0 0 8px 2px #000; + box-shadow: 0 0 8px 2px #000; + margin-bottom: 10px; } - -main { - padding-bottom: 50px; +html { + position: relative; + min-height: 100%; } -footer { - padding:50px; background: #333; color: #aaa; +.footer { + position: absolute; + bottom: 0; + width: 100%; + height: 60px; + background: #333; + color: #aaa; } header h1 { - color: white !important; text-shadow: 0 0 7px black; + color: #FFF!important; + text-shadow: 0 0 7px #000; } header .jumbotron { - background-color: transparent; -} -.nav a, .btn, .btn-default { - text-shadow: none; font-weight: bold; + background-color: transparent; } .flash { - opacity: 0.9 !important; right: 100px; + opacity: 0.9!important; + right: 100px; } -.dropdown { - z-index: 2000; +.right { + float: right; + text-align: right; } -.help-block { - margin-top: 0; - margin-bottom: 0; +.left { + float: left; + text-align: left; } -#w2padmin-btn { - margin:30px 0 30px 0; +.center { + width: 100%; + text-align: center; + vertical-align: middle; } -.hidden {display:none;visibility:visible} -.right {float:right; text-align:right} -.left {float:left; text-align:left} -.center {width:100%; text-align:center; vertical-align:middle} - -/* fix ie problem with menu */ - -td.w2p_fw {padding-bottom:1px} -td.w2p_fl,td.w2p_fw,td.w2p_fc {vertical-align:top} -td.w2p_fl {text-align:left} -td.w2p_fl, td.w2p_fw {padding-right:7px} -td.w2p_fl,td.w2p_fc {padding-top:4px} -div.w2p_export_menu {margin:5px 0} -div.w2p_export_menu a, div.w2p_wiki_tags a, div.w2p_cloud a {margin-left:5px; padding:2px 5px; background-color:#f1f1f1; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px;} - -/* tr#submit_record__row {border-top:1px solid #E5E5E5} */ -#submit_record__row td {padding-top:.5em} - -/* Fix */ -#auth_user_remember__row label {display:inline} -#web2py_user_form td {vertical-align:top} - -div.error_wrapper {display:block} -div.error { - color:red; - padding:5px; - display:inline-block; +td.w2p_fw { + padding-bottom: 1px; } - -.copyright {float:left} -#poweredBy {float:right} - -/* #MEDIA QUERIES SECTION */ - -/* -*Grid -* -* The default style for SQLFORM.grid even using jquery-iu or another ui framework -* will look better with the declarations below -* if needed to remove base.css consider keeping these following lines in some css file. -*/ -/* .web2py_table {border:1px solid #ccc} */ -.web2py_paginator {} -.web2py_grid {width:100%} -.web2py_grid table {width:100%} -.web2py_grid tbody td {padding:2px 5px 2px 5px; vertical-align: middle;} -.web2py_grid .web2py_form td {vertical-align: top;} - -.web2py_grid thead th,.web2py_grid tfoot td { - background-color:#EAEAEA; - padding:10px 5px 10px 5px; +td.w2p_fl { + text-align: left; } - -.web2py_grid tr.odd {background-color:#F9F9F9} -.web2py_grid tr:hover {background-color:#F5F5F5} - -/* -.web2py_breadcrumbs a { - line-height:20px; margin-right:5px; display:inline-block; - padding:3px 5px 3px 5px; - font-family:'lucida grande',tahoma,verdana,arial,sans-serif; - color:#3C3C3D; - text-shadow:1px 1px 0 #FFFFFF; - white-space:nowrap; overflow:visible; cursor:pointer; - background:#ECECEC; - border:1px solid #CACACA; - -webkit-border-radius:2px; -moz-border-radius:2px; - -webkit-background-clip:padding-box; border-radius:2px; - outline:none; position:relative; zoom:1; *display:inline; +td.w2p_fl, +td.w2p_fw { + padding-right: 7px; +} +td.w2p_fl, +td.w2p_fc { + padding-top: 4px; +} +div.w2p_export_menu { + margin: 5px 0; +} +div.w2p_export_menu a, +div.w2p_wiki_tags a, +div.w2p_cloud a { + margin-left: 5px; + padding: 2px 5px; +} +#submit_record__row td { + padding-top: .5em; +} +div.error_wrapper { + display: block; +} +.copyright { + float: left; +} +#poweredBy { + float: right; +} +.web2py_grid tbody td { + vertical-align: middle; + padding: 2px 5px; +} +.web2py_grid thead th, +.web2py_grid tfoot td { + background-color: #EAEAEA; + padding: 10px 5px; +} +.web2py_grid tr.odd { + background-color: #F9F9F9; +} +.web2py_grid tr:hover { + background-color: #F5F5F5; } -*/ - .web2py_console form { width: 100%; display: inline; vertical-align: middle; margin: 0 0 0 5px; } - .web2py_console form select { - margin:0; + margin: 0; } - .web2py_search_actions { - float:left; - text-align:left; + float: left; + text-align: left; + width: 100%; } - .web2py_grid .row_buttons { - min-height:25px; - vertical-align:middle; + min-height: 25px; + vertical-align: middle; } .web2py_grid .row_buttons a { - margin:3px; + margin: 3px; } - -.web2py_search_actions { - width:100%; -} - .web2py_grid .row_buttons a, .web2py_paginator ul li a, .web2py_search_actions a, .web2py_console input[type=submit], .web2py_console input[type=button], .web2py_console button { - line-height:20px; - margin-right:2px; display:inline-block; - padding:3px 5px 3px 5px; + line-height: 20px; + margin-right: 2px; + display: inline-block; + padding: 3px 5px; } - .web2py_counter { - margin-top:5px; - margin-right:2px; - width:35%; - float:right; - text-align:right; + margin-top: 5px; + margin-right: 2px; + width: 35%; + float: right; + text-align: right; +} +.web2py_table { + clear: both; + display: block; } - -/*Fix firefox problem*/ -.web2py_table {clear:both; display:block} - .web2py_paginator { - padding:5px; - text-align:right; - background-color:#f2f2f2; - + text-align: right; + background-color: #f2f2f2; + padding: 5px; } .web2py_paginator ul { - list-style-type:none; - margin:0px; - padding:0px; + list-style-type: none; + margin: 0; + padding: 0; } - -.web2py_paginator ul li { - display:inline; -} - .web2py_paginator .current { - font-weight:bold; + font-weight: 700; } - .web2py_breadcrumbs ul { - list-style:none; - margin-bottom:18px; + list-style: none; + margin-bottom: 18px; } - li.w2p_grid_breadcrumb_elem { - display:inline-block; + display: inline-block; +} +.web2py_console input, +.web2py_console select, +.web2py_console a { + margin: 2px; } - -.web2py_console form { vertical-align: middle; } -.web2py_console input, .web2py_console select, -.web2py_console a { margin: 2px; } - - #wiki_page_body { - width: 600px; - height: auto; - min-height: 400px; + width: 600px; + height: auto; + min-height: 400px; } - -/* fix some IE problems */ - -.ie-lte7 .topbar .container {z-index:2} -.ie-lte8 div.flash{ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#000000', GradientType=0 ); } -.ie-lte8 div.flash:hover {filter:alpha(opacity=25);} -.ie9 #w2p_query_panel {padding-bottom:2px} - -.web2py_console .form-control {width: 20%; display: inline;} -.web2py_console #w2p_keywords {width: 50%;} -.web2py_search_actions a, .web2py_console input[type=submit], .web2py_console input[type=button], .web2py_console button { padding: 6px 12px; } - -/* -input.date,input.time,input.datetime,input.double,input.integer { - max-width: 300px; +.ie-lte7 .topbar .container { + z-index: 2; } -*/ +.ie9 #w2p_query_panel { + padding-bottom: 2px; +} +.web2py_console .form-control { + width: 20%; + display: inline; +} +.web2py_console #w2p_keywords { + width: 50%; +} +.web2py_search_actions a, +.web2py_console input[type=submit], +.web2py_console input[type=button], +.web2py_console button { + padding: 6px 12px; +} +td.w2p_fl, +td.w2p_fw, +td.w2p_fc, +#web2py_user_form td, +.web2py_grid .web2py_form td { + vertical-align: top; +} +#auth_user_remember__row label, +.web2py_paginator ul li { + display: inline; +} +.web2py_grid, +.web2py_grid table { + width: 100%; +} \ No newline at end of file diff --git a/applications/welcome/static/js/web2py-bootstrap3.js b/applications/welcome/static/js/web2py-bootstrap3.js index 573210d3..866532c4 100644 --- a/applications/welcome/static/js/web2py-bootstrap3.js +++ b/applications/welcome/static/js/web2py-bootstrap3.js @@ -1,134 +1,82 @@ -/*! - * part of the package to convert web2py elements to bootstrap3 theme - * Developed by Paolo Caruccio ( paolo.caruccio66@gmail.com ) - * Released under MIT license - * version 1 rev.201402261600 - * - * Supported version of bootstrap framework: 3.0.2+ - - * The full package includes: - * - bootstrap3.py python module - * - web2py-bootstrap3.css - * - this js file - * - example of layout.html - - */ - -jQuery(function(){ - // bootstrap3 classes for elements of horizontal form - calculations - var fh_label_class = 'col-md-4', - fh_offest_class = 'col-md-offset-4', - fh_control_class = 'col-md-8'; - - // functions - function menu_is_collapsed() { - return !jQuery('.navbar-toggle').is(':hidden'); - }; - - function closeSubmenu() { - jQuery(".dropdown-submenu > a.active").each(function(){ - var o = jQuery(this); - o.parent().children("ul") - .toggleClass('open').data('phase', null); - o.toggleClass('active'); - }); - }; - - jQuery.fn.center = function (options) { - var defaults = {'parent': false, 'mode': "both"}; - var settings = jQuery.extend(defaults, options); - var parent; - if (settings.parent) - parent = this.parent(); - else - parent = window; - if (settings.mode != "horizontally") { - this.css("top", Math.max - (0, ((jQuery(parent).height() - jQuery(this).outerHeight()) / 2) + jQuery(parent).scrollTop()) + "px"); - } - if (settings.mode != "vertically") { - this.css("left", Math.max - (0, ((jQuery(parent).width() - jQuery(this).outerWidth()) / 2) + jQuery(parent).scrollLeft()) + "px"); - } - return this; - }; - - // alert centering - jQuery('.flash.alert.centered').center({'mode': "horizontally"}); - - // navs - jQuery(".nav ul.dropdown-menu").not("#w2p-auth-bar").each(function() { - var toggle = jQuery(this).parent(); - if (toggle.parent().hasClass("nav")) { - toggle.attr("data-w2pmenulevel", "l0"); - toggle.children("a") - .addClass("dropdown-toggle") - .append(' ') - .attr("data-toggle", "dropdown"); - } else { - toggle.addClass("dropdown-submenu").removeClass("dropdown"); - }; - }); - - jQuery('.navbar-nav a.dropdown-toggle').click(function(e) { - if (menu_is_collapsed()) - e.preventDefault(); - else - window.location=jQuery(this).attr('href'); - }); - - jQuery(".dropdown-submenu>a").click(function(event) { - if (menu_is_collapsed()) { - event.preventDefault(); - event.stopPropagation(); - var submenu = jQuery(this).parent().children("ul"); - submenu.data('phase','opening'); - var dropdownOfThis = jQuery(this).parent().parent(); - var actives = dropdownOfThis.find('ul.dropdown-menu.open'); - if (actives && actives.length) { - var hasData = actives.data('phase'); - if (hasData && hasData=='opened') { - actives.removeClass('open'); - actives.siblings('a.active').removeClass('active'); - hasData || actives.data('phase', null); - }; - }; - submenu.toggleClass('open').data('phase','opened'); - jQuery(this).toggleClass('active'); - }else{ - window.location=jQuery(this).attr('href'); - }; - }); - - jQuery(".nav-tabs .web2py-menu-active").addClass('active'); - jQuery(".nav-tabs a").not(".dropdown-toggle").attr("data-toggle", "tab"); - // button fixes - jQuery("button:not(.btn),input[type=button]:not(.btn),.w2p_list a").addClass('btn btn-default'); - // form fixes - jQuery("form.bs3-form p.w2p-autocomplete-widget input").addClass('form-control'); - - // on page load - function adjust_maxheight_of_collapsed_nav() { - var cn = jQuery('div.navbar-collapse'); - var sh = jQuery(window).height(); - if (cn.get(0)) { - if (sh<320) - cn.addClass('short-screen'); - else if(cn.hasClass('short-screen')) - cn.removeClass('short-screen'); - } - }; - - adjust_maxheight_of_collapsed_nav(); - - // resize and orientation change events - jQuery(window).on('orientationchange resize', function(event) { - adjust_maxheight_of_collapsed_nav(); - jQuery('.flash.alert').center({'mode':"horizontally"}); - if (menu_is_collapsed() === false) { - closeSubmenu(); - jQuery('.navbar-nav .dropdown.open a.dropdown-toggle').dropdown('toggle'); - jQuery('#main-menu.in, #login-menu.in').collapse('hide'); - }; - }); +(function($, undefined) { + $.web2py.ajax_fields = function(target) { + /* + *this attaches something to a newly loaded fragment/page + * Ideally all events should be bound to the document, so we can avoid calling + * this over and over... all will be bound to the document + */ + /*adds btn class to buttons*/ + $('button', target).addClass('btn btn-default'); + $("p.w2p-autocomplete-widget input").addClass('form-control'); + $('form input[type="submit"], form input[type="button"]', target).addClass('btn btn-default'); + /* javascript for PasswordWidget*/ + $('input[type=password][data-w2p_entropy]', target).each(function() { + web2py.validate_entropy($(this)); }); + /* javascript for ListWidget*/ + $('ul.w2p_list', target).each(function() { + function pe(ul, e) { + var new_line = ml(ul); + rel(ul); + if ($(e.target).parent().is(':visible')) { + /* make sure we didn't delete the element before we insert after */ + new_line.insertAfter($(e.target).parent()); + } else { + /* the line we clicked on was deleted, just add to end of list */ + new_line.appendTo(ul); + } + new_line.find(":text").focus(); + return false; + } + + function rl(ul, e) { + if ($(ul).children().length > 1) { + /* only remove if we have more than 1 item so the list is never empty */ + $(e.target).parent().remove(); + } + } + + function ml(ul) { + /* clone the first field */ + var line = $(ul).find("li:first").clone(true); + line.find(':text').val(''); + return line; + } + + function rel(ul) { + /* keep only as many as needed*/ + $(ul).find("li").each(function() { + var trimmed = $.trim($(this.firstChild).val()); + if (trimmed == '') $(this).remove(); + else $(this.firstChild).val(trimmed); + }); + } + var ul = this; + $(ul).find(":text").after('+ -').keypress(function(e) { + return (e.which == 13) ? pe(ul, e) : true; + }).next().click(function(e) { + pe(ul, e); + e.preventDefault(); + }).next().click(function(e) { + rl(ul, e); + e.preventDefault(); + }); + }); + } + + $(function() { + $(".nav ul.dropdown-menu").each(function() { + var toggle = jQuery(this).parent(); + if (toggle.parent().hasClass("nav")) { + toggle.attr("data-w2pmenulevel", "l0"); + toggle.children("a") + .addClass("dropdown-toggle") + .append(' ') + .attr("data-toggle", "dropdown"); + } else { + toggle.addClass("dropdown-submenu").removeClass("dropdown"); + }; + }); + }); + +})(jQuery); \ No newline at end of file diff --git a/applications/welcome/views/default/index.html b/applications/welcome/views/default/index.html index f54b8be5..7c83070f 100644 --- a/applications/welcome/views/default/index.html +++ b/applications/welcome/views/default/index.html @@ -34,13 +34,15 @@ {{pass}} {{block right_sidebar}} - - - {{=T("admin")}} -
-
{{=T("Don't know what to do?")}}
+ +
+ {{=T("Don't know what to do?")}} +