updated to use bootstrap 4 classes, cleaned up layout
This commit is contained in:
@@ -224,15 +224,15 @@ def select():
|
|||||||
session.last_orderby = orderby
|
session.last_orderby = orderby
|
||||||
session.last_query = request.vars.query
|
session.last_query = request.vars.query
|
||||||
form = FORM(TABLE(TR(T('Query:'), '', INPUT(_style='width:400px',
|
form = FORM(TABLE(TR(T('Query:'), '', INPUT(_style='width:400px',
|
||||||
_name='query', _value=request.vars.query or '',
|
_name='query', _value=request.vars.query or '', _class="form-control",
|
||||||
requires=IS_NOT_EMPTY(
|
requires=IS_NOT_EMPTY(
|
||||||
error_message=T("Cannot be empty")))), TR(T('Update:'),
|
error_message=T("Cannot be empty")))), TR(T('Update:'),
|
||||||
INPUT(_name='update_check', _type='checkbox',
|
INPUT(_name='update_check', _type='checkbox',
|
||||||
value=False), INPUT(_style='width:400px',
|
value=False), INPUT(_style='width:400px',
|
||||||
_name='update_fields', _value=request.vars.update_fields
|
_name='update_fields', _value=request.vars.update_fields
|
||||||
or '')), TR(T('Delete:'), INPUT(_name='delete_check',
|
or '', _class="form-control")), TR(T('Delete:'), INPUT(_name='delete_check',
|
||||||
_class='delete', _type='checkbox', value=False), ''),
|
_class='delete', _type='checkbox', value=False), ''),
|
||||||
TR('', '', INPUT(_type='submit', _value=T('submit')))),
|
TR('', '', INPUT(_type='submit', _value=T('submit'), _class="btn btn-primary"))),
|
||||||
_action=URL(r=request, args=request.args))
|
_action=URL(r=request, args=request.args))
|
||||||
|
|
||||||
tb = None
|
tb = None
|
||||||
@@ -274,7 +274,7 @@ def select():
|
|||||||
formcsv = FORM(str(T('or import from csv file')) + " ",
|
formcsv = FORM(str(T('or import from csv file')) + " ",
|
||||||
INPUT(_type='file', _name='csvfile'),
|
INPUT(_type='file', _name='csvfile'),
|
||||||
INPUT(_type='hidden', _value=csv_table, _name='table'),
|
INPUT(_type='hidden', _value=csv_table, _name='table'),
|
||||||
INPUT(_type='submit', _value=T('import')))
|
INPUT(_type='submit', _value=T('import'), _class="btn btn-primary"))
|
||||||
else:
|
else:
|
||||||
formcsv = None
|
formcsv = None
|
||||||
if formcsv and formcsv.process().accepted:
|
if formcsv and formcsv.process().accepted:
|
||||||
@@ -588,7 +588,7 @@ def manage():
|
|||||||
auth.table_permission().group_id.label = T('Role')
|
auth.table_permission().group_id.label = T('Role')
|
||||||
auth.table_permission().name.label = T('Permission')
|
auth.table_permission().name.label = T('Permission')
|
||||||
if table == auth.table_user():
|
if table == auth.table_user():
|
||||||
linked_tables=[auth.settings.table_membership_name]
|
linked_tables = [auth.settings.table_membership_name]
|
||||||
elif table == auth.table_group():
|
elif table == auth.table_group():
|
||||||
orderby = 'role' if not request.args(3) or '.group_id' not in request.args(3) else None
|
orderby = 'role' if not request.args(3) or '.group_id' not in request.args(3) else None
|
||||||
elif table == auth.table_permission():
|
elif table == auth.table_permission():
|
||||||
@@ -604,13 +604,13 @@ def manage():
|
|||||||
def hooks():
|
def hooks():
|
||||||
import functools
|
import functools
|
||||||
import inspect
|
import inspect
|
||||||
list_op=['_%s_%s' %(h,m) for h in ['before', 'after'] for m in ['insert','update','delete']]
|
list_op = ['_%s_%s' %(h,m) for h in ['before', 'after'] for m in ['insert','update','delete']]
|
||||||
tables=[]
|
tables = []
|
||||||
with_build_it=False
|
with_build_it = False
|
||||||
for db_str in sorted(databases):
|
for db_str in sorted(databases):
|
||||||
db = databases[db_str]
|
db = databases[db_str]
|
||||||
for t in db.tables:
|
for t in db.tables:
|
||||||
method_hooks=[]
|
method_hooks = []
|
||||||
for op in list_op:
|
for op in list_op:
|
||||||
functions = []
|
functions = []
|
||||||
for f in getattr(db[t], op):
|
for f in getattr(db[t], op):
|
||||||
@@ -630,16 +630,16 @@ def hooks():
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
if len(functions):
|
if len(functions):
|
||||||
method_hooks.append({'name':op, 'functions':functions})
|
method_hooks.append({'name': op, 'functions':functions})
|
||||||
if len(method_hooks):
|
if len(method_hooks):
|
||||||
tables.append({'name':"%s.%s" % (db_str,t), 'slug': IS_SLUG()("%s.%s" % (db_str,t))[0], 'method_hooks':method_hooks})
|
tables.append({'name': "%s.%s" % (db_str, t), 'slug': IS_SLUG()("%s.%s" % (db_str,t))[0], 'method_hooks':method_hooks})
|
||||||
# Render
|
# Render
|
||||||
ul_main = UL(_class='nav nav-list')
|
ul_main = UL(_class='nav nav-list')
|
||||||
for t in tables:
|
for t in tables:
|
||||||
ul_main.append(A(t['name'], _onclick="collapse('a_%s')" % t['slug']))
|
ul_main.append(A(t['name'], _onclick="collapse('a_%s')" % t['slug']))
|
||||||
ul_t = UL(_class='nav nav-list', _id="a_%s" % t['slug'], _style='display:none')
|
ul_t = UL(_class='nav nav-list', _id="a_%s" % t['slug'], _style='display:none')
|
||||||
for op in t['method_hooks']:
|
for op in t['method_hooks']:
|
||||||
ul_t.append(LI (op['name']))
|
ul_t.append(LI(op['name']))
|
||||||
ul_t.append(UL([LI(A(f['funcname'], _class="editor_filelink", _href=f['url']if 'url' in f else None, **{'_data-lineno':f['lineno']-1})) for f in op['functions']]))
|
ul_t.append(UL([LI(A(f['funcname'], _class="editor_filelink", _href=f['url']if 'url' in f else None, **{'_data-lineno':f['lineno']-1})) for f in op['functions']]))
|
||||||
ul_main.append(ul_t)
|
ul_main.append(ul_t)
|
||||||
return ul_main
|
return ul_main
|
||||||
@@ -665,20 +665,20 @@ def d3_graph_model():
|
|||||||
fields = []
|
fields = []
|
||||||
for field in db[tablename]:
|
for field in db[tablename]:
|
||||||
f_type = field.type
|
f_type = field.type
|
||||||
if not isinstance(f_type,str):
|
if not isinstance(f_type, str):
|
||||||
disp = ' '
|
disp = ' '
|
||||||
elif f_type == 'string':
|
elif f_type == 'string':
|
||||||
disp = field.length
|
disp = field.length
|
||||||
elif f_type == 'id':
|
elif f_type == 'id':
|
||||||
disp = "PK"
|
disp = "PK"
|
||||||
elif f_type.startswith('reference') or \
|
elif f_type.startswith('reference') or \
|
||||||
f_type.startswith('list:reference'):
|
f_type.startswith('list:reference'):
|
||||||
disp = "FK"
|
disp = "FK"
|
||||||
else:
|
else:
|
||||||
disp = ' '
|
disp = ' '
|
||||||
fields.append(dict(name= field.name, type=field.type, disp = disp))
|
fields.append(dict(name=field.name, type=field.type, disp=disp))
|
||||||
|
|
||||||
if isinstance(f_type,str) and (
|
if isinstance(f_type, str) and (
|
||||||
f_type.startswith('reference') or
|
f_type.startswith('reference') or
|
||||||
f_type.startswith('list:reference')):
|
f_type.startswith('list:reference')):
|
||||||
referenced_table = f_type.split()[1].split('.')[0]
|
referenced_table = f_type.split()[1].split('.')[0]
|
||||||
|
|||||||
@@ -13,12 +13,12 @@
|
|||||||
<h2>{{=T("Available Databases and Tables")}}</h2>
|
<h2>{{=T("Available Databases and Tables")}}</h2>
|
||||||
{{if not databases:}}{{=T("No databases in this application")}}{{pass}}
|
{{if not databases:}}{{=T("No databases in this application")}}{{pass}}
|
||||||
<ul class="nav nav-tabs" id="myTab">
|
<ul class="nav nav-tabs" id="myTab">
|
||||||
<li class="active" ><a href="#alltables" data-toggle="tab">Tables</a></li>
|
<li class="nav-item"><a href="#alltables" data-toggle="tab" class="nav-link active">Tables</a></li>
|
||||||
<li><a href="#hooks" data-toggle="tab">Hooks</a></li>
|
<li class="nav-item"><a href="#hooks" data-toggle="tab" class="nav-link">Hooks</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div class="tab-pane active" id="alltables">
|
<div class="tab-pane active" id="alltables">
|
||||||
<table class="table">
|
<table class="table table-striped">
|
||||||
{{for db in sorted(databases):}}
|
{{for db in sorted(databases):}}
|
||||||
{{for table in databases[db].tables:}}
|
{{for table in databases[db].tables:}}
|
||||||
{{qry='%s.%s.id>0'%(db,table)}}
|
{{qry='%s.%s.id>0'%(db,table)}}
|
||||||
@@ -37,10 +37,10 @@
|
|||||||
{{pass}}
|
{{pass}}
|
||||||
<tr>
|
<tr>
|
||||||
<th style="font-size: 1.75em;">
|
<th style="font-size: 1.75em;">
|
||||||
{{=A("%s.%s" % (db,table),_href=URL('select',args=[db],vars=dict(query=qry)))}}
|
» {{=A("%s.%s" % (db,table),_href=URL('select',args=[db],vars=dict(query=qry)))}}
|
||||||
</th>
|
</th>
|
||||||
<td>
|
<td>
|
||||||
{{=A(str(T('New Record')),_href=URL('insert',args=[db,table]),_class="btn btn-default")}}
|
{{=A(str(T('New Record')),_href=URL('insert',args=[db,table]),_class="btn btn-primary")}}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
@@ -61,28 +61,31 @@
|
|||||||
</pre>
|
</pre>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{if table:}}
|
{{if table:}}
|
||||||
{{=A(str(T('New Record')),_href=URL('insert',args=[request.args[0],table]),_class="btn btn-default")}}<br/><br/>
|
{{=A(str(T('New Record')),_href=URL('insert',args=[request.args[0],table]),_class="btn btn-primary", _role="button")}}<br/><br/>
|
||||||
|
<hr />
|
||||||
<h3>{{=T("Rows in Table")}}</h3><br/>
|
<h3>{{=T("Rows in Table")}}</h3><br/>
|
||||||
{{else:}}
|
{{else:}}
|
||||||
<h3>{{=T("Rows selected")}}</h3><br/>
|
<h3>{{=T("Rows selected")}}</h3><br/>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{=form}}
|
{{=form}}
|
||||||
<p>{{=T('The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.')}}<br/>
|
<p class="text-muted">{{=T('The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.')}}<br/>
|
||||||
{{=T('Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.')}}<br/>
|
{{=T('Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.')}}<br/>
|
||||||
{{=T('"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN')}}</p>
|
{{=T('"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN')}}</p>
|
||||||
<br/><br/>
|
<br/><br/>
|
||||||
<h4>{{=T("%s selected", nrows)}}</h4>
|
<h4>{{=T("%s selected", nrows)}}</h4>
|
||||||
{{if start>0:}}{{=A(T('previous %s rows') % step,_href=URL('select',args=request.args[0],vars=dict(start=start-step)),_class="btn btn-default")}}{{pass}}
|
{{if start>0:}}{{=A(T('previous %s rows') % step,_href=URL('select',args=request.args[0],vars=dict(start=start-step)),_class="btn btn-primary")}}{{pass}}
|
||||||
{{if stop<nrows:}}{{=A(T('next %s rows') % step,_href=URL('select',args=request.args[0],vars=dict(start=start+step)),_class="btn btn-default")}}{{pass}}
|
{{if stop<nrows:}}{{=A(T('next %s rows') % step,_href=URL('select',args=request.args[0],vars=dict(start=start+step)),_class="btn btn-primary")}}{{pass}}
|
||||||
{{if rows:}}
|
{{if rows:}}
|
||||||
<div style="overflow:auto; width:80%;">
|
<div style="overflow:auto; width:80%;">
|
||||||
{{linkto = lambda f, t, r: URL('update', args=[request.args[0], r, f]) if f else "#"}}
|
{{linkto = lambda f, t, r: URL('update', args=[request.args[0], r, f]) if f else "#"}}
|
||||||
{{upload=URL('download',args=request.args[0])}}
|
{{upload=URL('download',args=request.args[0])}}
|
||||||
{{=SQLTABLE(rows,linkto,upload,orderby=True,_class='sortable')}}
|
{{=SQLTABLE(rows,linkto,upload,orderby=True,_class='table table-striped table-bordered sortable')}}
|
||||||
</div>
|
</div>
|
||||||
{{pass}}
|
{{pass}}
|
||||||
<br/><br/><h3>{{=T("Import/Export")}}</h3><br/>
|
<br/><br/>
|
||||||
<a href="{{=URL('csv',args=request.args[0],vars=dict(query=query))}}" class="btn btn-default">{{=T("export as csv file")}}</a>
|
<hr />
|
||||||
|
<h3>{{=T("Import/Export")}}</h3><br/>
|
||||||
|
<a href="{{=URL('csv',args=request.args[0],vars=dict(query=query))}}" class="btn btn-primary">{{=T("export as csv file")}}</a>
|
||||||
{{=formcsv or ''}}
|
{{=formcsv or ''}}
|
||||||
|
|
||||||
{{elif request.function=='insert':}}
|
{{elif request.function=='insert':}}
|
||||||
|
|||||||
Reference in New Issue
Block a user