Merge pull request #1876 from leonelcamara/bs4checkboxes

Update bootstrap from a v4-alpha version to the latest release
This commit is contained in:
mdipierro
2018-03-20 16:54:14 -05:00
committed by GitHub
8 changed files with 2506 additions and 51 deletions
+34 -18
View File
@@ -13,14 +13,17 @@
'**%(items)s** items, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}', '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}',
'**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)',
'?': '?', '?': '?',
'@markmin\x01An error occured, please [[reload %s]] the page': 'An error occured, please [[reload %s]] the page',
'@markmin\x01Number of entries: **%s**': 'Number of entries: **%s**',
'``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)', '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)',
'About': 'About', 'About': 'Sobre',
'Access Control': 'Controle de acesso', 'Access Control': 'Controle de acesso',
'admin': 'administrador', 'admin': 'administrador',
'Administrative Interface': 'Interface Administrativa', 'Administrative Interface': 'Interface Administrativa',
'Administrative interface': 'Painel Administrativo', 'Administrative interface': 'Painel Administrativo',
'Ajax Recipes': 'Formulas Ajax', 'Ajax Recipes': 'Formulas Ajax',
'An error occured, please [[reload %s]] the page': 'Ocorreu um erro, por favor [[recarregue %s]] a página', 'An error occured, please [[reload %s]] the page': 'Ocorreu um erro, por favor [[recarregue %s]] a página',
'API Example': 'API Example',
'appadmin is disabled because insecure channel': 'appadmin está desactivada pois o canal é inseguro', 'appadmin is disabled because insecure channel': 'appadmin está desactivada pois o canal é inseguro',
'Are you sure you want to delete this object?': 'Tem a certeza que quer deletar este objeto?', 'Are you sure you want to delete this object?': 'Tem a certeza que quer deletar este objeto?',
'Author Reference Auth User': 'Author Reference Auth User', 'Author Reference Auth User': 'Author Reference Auth User',
@@ -73,27 +76,31 @@
'Disk Cache Keys': 'Disk Cache Keys', 'Disk Cache Keys': 'Disk Cache Keys',
'Disk Cleared': 'Disk Cleared', 'Disk Cleared': 'Disk Cleared',
'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.',
'Documentation': 'Documentation', 'Documentation': 'Documentação',
"Don't know what to do?": "Don't know what to do?", "Don't know what to do?": 'Não sabe o que fazer?',
'done!': 'concluído!', 'done!': 'concluído!',
'Download': 'Download', 'Download': 'Download',
'E-mail': 'E-mail',
'Edit': 'Editar', 'Edit': 'Editar',
'edit category': 'edit category', 'edit category': 'editar categoria',
'edit comment': 'edit comment', 'edit comment': 'editar comentário',
'Edit current record': 'Edição de registo currente', 'Edit current record': 'Edição de registo currente',
'edit post': 'edit post', 'edit post': 'editar post',
'edit profile': 'Editar perfil', 'edit profile': 'Editar perfil',
'Edit This App': 'Edite esta aplicação', 'Edit This App': 'Edite esta aplicação',
'Email': 'Email', 'Email': 'Email',
'Email and SMS': 'Email and SMS', 'Email and SMS': 'Email e SMS',
'Errors': 'Errors', 'Enter an integer between %(min)g and %(max)g': 'Enter an integer between %(min)g and %(max)g',
'Errors': 'Erros',
'export as csv file': 'exportar como ficheiro csv', 'export as csv file': 'exportar como ficheiro csv',
'FAQ': 'FAQ', 'FAQ': 'FAQ',
'First name': 'First name',
'First Name': 'First Name', 'First Name': 'First Name',
'For %s #%s': 'For %s #%s', 'For %s #%s': 'For %s #%s',
'Forms and Validators': 'Forms and Validators', 'Forms and Validators': 'Forms and Validators',
'Free Applications': 'Free Applications', 'Free Applications': 'Free Applications',
'Graph Model': 'Graph Model', 'Graph Model': 'Graph Model',
'Grid Example': 'Grid Example',
'Groups': 'Groups', 'Groups': 'Groups',
'Hello World': 'Olá Mundo', 'Hello World': 'Olá Mundo',
'Helping web2py': 'Helping web2py', 'Helping web2py': 'Helping web2py',
@@ -106,10 +113,11 @@
'insert new': 'inserir novo', 'insert new': 'inserir novo',
'insert new %s': 'inserir novo %s', 'insert new %s': 'inserir novo %s',
'Internal State': 'Estado interno', 'Internal State': 'Estado interno',
'Introduction': 'Introduction', 'Introduction': 'Introdução',
'Invalid Query': 'Consulta Inválida', 'Invalid Query': 'Consulta Inválida',
'invalid request': 'Pedido Inválido', 'invalid request': 'Pedido Inválido',
'Key': 'Key', 'Key': 'Key',
'Last name': 'Last name',
'Last Name': 'Last Name', 'Last Name': 'Last Name',
'Layout': 'Esboço', 'Layout': 'Esboço',
'Layout Plugins': 'Layout Plugins', 'Layout Plugins': 'Layout Plugins',
@@ -117,8 +125,9 @@
'Live Chat': 'Live Chat', 'Live Chat': 'Live Chat',
'Log In': 'Log In', 'Log In': 'Log In',
'login': 'login', 'login': 'login',
'Login': 'Login',
'logout': 'logout', 'logout': 'logout',
'Lost Password': 'Lost Password', 'Lost Password': 'Perdeu a Senha',
'Main Menu': 'Menu Principal', 'Main Menu': 'Menu Principal',
'Manage %(action)s': 'Manage %(action)s', 'Manage %(action)s': 'Manage %(action)s',
'Manage Access Control': 'Manage Access Control', 'Manage Access Control': 'Manage Access Control',
@@ -128,7 +137,7 @@
'Modified By': 'Modified By', 'Modified By': 'Modified By',
'Modified On': 'Modified On', 'Modified On': 'Modified On',
'My Sites': 'My Sites', 'My Sites': 'My Sites',
'Name': 'Name', 'Name': 'Nome',
'New Record': 'Novo Registo', 'New Record': 'Novo Registo',
'new record inserted': 'novo registo inserido', 'new record inserted': 'novo registo inserido',
'next %s rows': 'next %s rows', 'next %s rows': 'next %s rows',
@@ -136,7 +145,7 @@
'No Data': 'No Data', 'No Data': 'No Data',
'No databases in this application': 'Não há bases de dados nesta aplicação', 'No databases in this application': 'Não há bases de dados nesta aplicação',
'Number of entries: **%s**': 'Number of entries: **%s**', 'Number of entries: **%s**': 'Number of entries: **%s**',
'Online book': 'Online book', 'Online book': 'Livro Online',
'Online examples': 'Exemplos online', 'Online examples': 'Exemplos online',
'or import from csv file': 'ou importe a partir de ficheiro csv', 'or import from csv file': 'ou importe a partir de ficheiro csv',
'Other Plugins': 'Other Plugins', 'Other Plugins': 'Other Plugins',
@@ -160,13 +169,17 @@
'RAM Cache Keys': 'RAM Cache Keys', 'RAM Cache Keys': 'RAM Cache Keys',
'Ram Cleared': 'Ram Cleared', 'Ram Cleared': 'Ram Cleared',
'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.',
'Recipes': 'Recipes', 'Recipes': 'Receitas',
'Record': 'registo', 'Record': 'registo',
'record does not exist': 'registo inexistente', 'record does not exist': 'registo inexistente',
'Record id': 'id de registo', 'Record id': 'id de registo',
'Register': 'Register', 'Register': 'Registar',
'register': 'register', 'register': 'registar',
'Registration identifier': 'Registration identifier',
'Registration key': 'Registration key',
'Remember me (for 30 days)': 'Lembrar de mim (por 30 dias)',
'Replyto Reference Post': 'Replyto Reference Post', 'Replyto Reference Post': 'Replyto Reference Post',
'Reset Password key': 'Reset Password key',
'Role': 'Role', 'Role': 'Role',
'Roles': 'Roles', 'Roles': 'Roles',
'Rows in Table': 'Linhas numa tabela', 'Rows in Table': 'Linhas numa tabela',
@@ -183,12 +196,14 @@
'show category': 'show category', 'show category': 'show category',
'show comment': 'show comment', 'show comment': 'show comment',
'show post': 'show post', 'show post': 'show post',
'Sign Up': 'Sign Up', 'Sign Up': 'Registar-se',
'Sign up': 'Registar-se',
'Size of cache:': 'Size of cache:', 'Size of cache:': 'Size of cache:',
'state': 'estado', 'state': 'estado',
'Statistics': 'Statistics', 'Statistics': 'Statistics',
'Stylesheet': 'Folha de estilo', 'Stylesheet': 'Folha de estilo',
'submit': 'submit', 'submit': 'submeter',
'Submit': 'Submit',
'Support': 'Support', 'Support': 'Support',
'Sure you want to delete this object?': 'Tem a certeza que deseja eliminar este objecto?', 'Sure you want to delete this object?': 'Tem a certeza que deseja eliminar este objecto?',
'Table': 'tabela', 'Table': 'tabela',
@@ -212,9 +227,10 @@
'Welcome %s': 'Bem-vindo(a) %s', 'Welcome %s': 'Bem-vindo(a) %s',
'Welcome to Gluonization': 'Bem vindo ao Web2py', 'Welcome to Gluonization': 'Bem vindo ao Web2py',
'Welcome to web2py': 'Bem-vindo(a) ao web2py', 'Welcome to web2py': 'Bem-vindo(a) ao web2py',
'Welcome to web2py!': 'Welcome to web2py!', 'Welcome to web2py!': 'Bem-vindo(a) ao web2py!',
'When': 'When', 'When': 'When',
'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s', 'Which called the function %s located in the file %s': 'Which called the function %s located in the file %s',
'Wiki Example': 'Wiki Example',
'Working...': 'Working...', 'Working...': 'Working...',
'You are successfully running web2py': 'You are successfully running web2py', 'You are successfully running web2py': 'You are successfully running web2py',
'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs', 'You can modify this application and adapt it to your needs': 'You can modify this application and adapt it to your needs',
File diff suppressed because one or more lines are too long
@@ -1,7 +1,4 @@
ul.navbar-nav.navbar-right {
position: absolute;
right: 100px;
}
label, th { label, th {
font-weigth: bold; font-weigth: bold;
white-space: nowrap; white-space: nowrap;
@@ -318,9 +315,6 @@ td.w2p_fc,
.web2py_grid table { .web2py_grid table {
width: 100%; width: 100%;
} }
input[type=checkbox], input[type=radio] {
margin: 4px 4px 0 0;
}
/* for backward compatbility with pre-font-awesome */ /* for backward compatbility with pre-font-awesome */
.icon.plus,.icon.arrowleft,.icon.download,.icon.trash,.icon.pen,.icon.arrowright,.icon.magnifier { .icon.plus,.icon.arrowleft,.icon.download,.icon.trash,.icon.pen,.icon.arrowright,.icon.magnifier {
@@ -337,4 +331,4 @@ input[type=checkbox], input[type=radio] {
.icon.trash:before { content: "\f1f8";} .icon.trash:before { content: "\f1f8";}
.icon.pen:before { content: "\f040";} .icon.pen:before { content: "\f040";}
.icon.arrowright:before { content: "\f061";} .icon.arrowright:before { content: "\f061";}
.icon.magnifier:before { content: "\f002";} .icon.magnifier:before { content: "\f002";}
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -10,10 +10,10 @@
{{ {{
if request.args(0)=='login': if request.args(0)=='login':
if not 'register' in auth.settings.actions_disabled: if not 'register' in auth.settings.actions_disabled:
form.add_button(T('Sign Up'),URL(args='register', vars={'_next': request.vars._next} if request.vars._next else None),_class='btn btn-default btn-secondary') form.add_button(T('Sign Up'),URL(args='register', vars={'_next': request.vars._next} if request.vars._next else None),_class='btn btn-default btn-secondary ml-1')
pass pass
if not 'request_reset_password' in auth.settings.actions_disabled: if not 'request_reset_password' in auth.settings.actions_disabled:
form.add_button(T('Lost Password'),URL(args='request_reset_password'),_class='btn btn-default btn-secondary') form.add_button(T('Lost Password'),URL(args='request_reset_password'),_class='btn btn-default btn-secondary ml-1')
pass pass
pass pass
=form =form
+3 -2
View File
@@ -35,7 +35,7 @@
<body> <body>
<div class="w2p_flash alert alert-dismissable">{{=response.flash or ''}}</div> <div class="w2p_flash alert alert-dismissable">{{=response.flash or ''}}</div>
<!-- Navbar ======================================= --> <!-- Navbar ======================================= -->
<nav class="navbar navbar-toggleable-md navbar-light bg-faded"> <nav class="navbar navbar-expand-lg navbar-light bg-faded">
<button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
@@ -63,7 +63,7 @@
<input class="form-control mr-sm-2" type="text" placeholder="Search"> <input class="form-control mr-sm-2" type="text" placeholder="Search">
</form> </form>
{{if 'auth' in globals():}} {{if 'auth' in globals():}}
<ul class="navbar-nav navbar-right"> <ul class="navbar-nav ml-lg-auto"">
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{if auth.user:}}{{=auth.user.first_name}}{{else:}}LOGIN{{pass}} {{if auth.user:}}{{=auth.user.first_name}}{{else:}}LOGIN{{pass}}
@@ -111,6 +111,7 @@
</footer> </footer>
{{end}} {{end}}
<!-- The javascript =============================== --> <!-- The javascript =============================== -->
<script src="{{=URL('static','js/popper.js')}}"></script>
<script src="{{=URL('static','js/bootstrap.min.js')}}"></script> <script src="{{=URL('static','js/bootstrap.min.js')}}"></script>
<script src="{{=URL('static','js/web2py-bootstrap4.js')}}"></script> <script src="{{=URL('static','js/web2py-bootstrap4.js')}}"></script>
{{block page_js}}{{end page_js}} {{block page_js}}{{end page_js}}
+12 -11
View File
@@ -1106,14 +1106,16 @@ def formstyle_bootstrap4_stacked(form, fields):
if controls['_type'] == 'button': if controls['_type'] == 'button':
controls.add_class('btn btn-secondary') controls.add_class('btn btn-secondary')
elif controls['_type'] == 'file': elif controls['_type'] == 'file':
controls.add_class('input-file') controls.add_class('form-control-file')
elif controls['_type'] in ('text', 'password'): elif controls['_type'] in ('text', 'password'):
controls.add_class('form-control') controls.add_class('form-control')
elif controls['_type'] == 'checkbox': elif controls['_type'] == 'checkbox' or controls['_type'] == 'radio':
controls.add_class('form-check-input')
label['_for'] = None label['_for'] = None
label.add_class('form-check-label')
label.insert(0, controls) label.insert(0, controls)
label.insert(0, ' ') label.insert(0, ' ')
_controls = DIV(label, _help, _class="checkbox") _controls = DIV(label, _help, _class="form-check")
label = '' label = ''
elif isinstance(controls, (SELECT, TEXTAREA)): elif isinstance(controls, (SELECT, TEXTAREA)):
controls.add_class('form-control') controls.add_class('form-control')
@@ -1142,7 +1144,6 @@ def formstyle_bootstrap4_inline_factory(col_label_size=3):
Experimental! Experimental!
""" """
def _inner(form, fields): def _inner(form, fields):
form.add_class('form-horizontal')
label_col_class = "col-sm-%d" % col_label_size label_col_class = "col-sm-%d" % col_label_size
col_class = "col-sm-%d" % (12 - col_label_size) col_class = "col-sm-%d" % (12 - col_label_size)
offset_class = "col-sm-offset-%d" % col_label_size offset_class = "col-sm-offset-%d" % col_label_size
@@ -1162,19 +1163,19 @@ def formstyle_bootstrap4_inline_factory(col_label_size=3):
controls.add_class('input-file') controls.add_class('input-file')
elif controls['_type'] in ('text', 'password'): elif controls['_type'] in ('text', 'password'):
controls.add_class('form-control') controls.add_class('form-control')
elif controls['_type'] == 'checkbox': elif controls['_type'] == 'checkbox' or controls['_type'] == 'radio':
label['_for'] = None controls.add_class('form-check-input')
label.add_class('form-check-label')
label.insert(0, controls) label.insert(0, controls)
label.insert(1, ' ') #label.insert(0, ' ')
_controls = DIV(DIV(label, _help, _class="checkbox"), _controls = DIV(DIV(label, _help, _class="form-check"), _class="%s" % col_class)
_class="%s %s" % (offset_class, col_class)) label = DIV(_class="sm-hidden %s" % label_col_class)
label = ''
elif isinstance(controls, (SELECT, TEXTAREA)): elif isinstance(controls, (SELECT, TEXTAREA)):
controls.add_class('form-control') controls.add_class('form-control')
elif isinstance(controls, SPAN): elif isinstance(controls, SPAN):
_controls = P(controls.components, _controls = P(controls.components,
_class="form-control-static %s" % col_class) _class="form-control-plaintext %s" % col_class)
elif isinstance(controls, UL): elif isinstance(controls, UL):
for e in controls.elements("input"): for e in controls.elements("input"):
e.add_class('form-control') e.add_class('form-control')