Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
flask-admin
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Python-Dev
flask-admin
Commits
80ff3fcc
Commit
80ff3fcc
authored
Jul 13, 2018
by
Ryan Beymer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
flask-admin/flask-admin#1486 - starting conversion to bootstrap 4
parent
7fa26ab2
Changes
24
Show whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
1397 additions
and
0 deletions
+1397
-0
actions.html
flask_admin/templates/bootstrap4/admin/actions.html
+35
-0
base.html
flask_admin/templates/bootstrap4/admin/base.html
+85
-0
form.html
flask_admin/templates/bootstrap4/admin/file/form.html
+9
-0
list.html
flask_admin/templates/bootstrap4/admin/file/list.html
+187
-0
form.html
flask_admin/templates/bootstrap4/admin/file/modals/form.html
+19
-0
index.html
flask_admin/templates/bootstrap4/admin/index.html
+4
-0
layout.html
flask_admin/templates/bootstrap4/admin/layout.html
+85
-0
lib.html
flask_admin/templates/bootstrap4/admin/lib.html
+252
-0
master.html
flask_admin/templates/bootstrap4/admin/master.html
+1
-0
create.html
flask_admin/templates/bootstrap4/admin/model/create.html
+30
-0
details.html
flask_admin/templates/bootstrap4/admin/model/details.html
+52
-0
edit.html
flask_admin/templates/bootstrap4/admin/model/edit.html
+40
-0
inline_field_list.html
...n/templates/bootstrap4/admin/model/inline_field_list.html
+15
-0
inline_form.html
...k_admin/templates/bootstrap4/admin/model/inline_form.html
+4
-0
inline_list_base.html
...in/templates/bootstrap4/admin/model/inline_list_base.html
+49
-0
layout.html
flask_admin/templates/bootstrap4/admin/model/layout.html
+101
-0
list.html
flask_admin/templates/bootstrap4/admin/model/list.html
+222
-0
create.html
...admin/templates/bootstrap4/admin/model/modals/create.html
+31
-0
details.html
...dmin/templates/bootstrap4/admin/model/modals/details.html
+40
-0
edit.html
...k_admin/templates/bootstrap4/admin/model/modals/edit.html
+33
-0
row_actions.html
...k_admin/templates/bootstrap4/admin/model/row_actions.html
+38
-0
console.html
flask_admin/templates/bootstrap4/admin/rediscli/console.html
+30
-0
response.html
...k_admin/templates/bootstrap4/admin/rediscli/response.html
+32
-0
static.html
flask_admin/templates/bootstrap4/admin/static.html
+3
-0
No files found.
flask_admin/templates/bootstrap4/admin/actions.html
0 → 100644
View file @
80ff3fcc
{% import 'admin/static.html' as admin_static with context %}
{% macro dropdown(actions, btn_class='btn dropdown-toggle') -%}
<a
class=
"{{ btn_class }}"
data-toggle=
"dropdown"
href=
"javascript:void(0)"
>
{{ _gettext('With selected') }}
<b
class=
"caret"
></b></a>
<ul
class=
"dropdown-menu"
>
{% for p in actions %}
<li
class=
"dropdown-item"
>
<a
href=
"javascript:void(0)"
onclick=
"return modelActions.execute('{{ p[0] }}');"
>
{{ _gettext(p[1]) }}
</a>
</li>
{% endfor %}
</ul>
{% endmacro %}
{% macro form(actions, url) %}
{% if actions %}
<form
id=
"action_form"
action=
"{{ url }}"
method=
"POST"
style=
"display: none"
>
{% if action_form.csrf_token %}
{{ action_form.csrf_token }}
{% elif csrf_token %}
<input
type=
"hidden"
name=
"csrf_token"
value=
"{{ csrf_token() }}"
/>
{% endif %}
{{ action_form.url(value=return_url) }}
{{ action_form.action() }}
</form>
{% endif %}
{% endmacro %}
{% macro script(message, actions, actions_confirmation) %}
{% if actions %}
<script
src=
"{{ admin_static.url(filename='admin/js/actions.js', v='1.0.0') }}"
></script>
<script
language=
"javascript"
>
var
modelActions
=
new
AdminModelActions
({{
message
|
tojson
|
safe
}},
{{
actions_confirmation
|
tojson
|
safe
}});
</script>
{% endif %}
{% endmacro %}
flask_admin/templates/bootstrap4/admin/base.html
0 → 100644
View file @
80ff3fcc
{% import 'admin/layout.html' as layout with context -%}
{% import 'admin/static.html' as admin_static with context %}
<!DOCTYPE html>
<html>
<head>
<title>
{% block title %}{% if admin_view.category %}{{ admin_view.category }} - {% endif %}{{ admin_view.name }} - {{ admin_view.admin.name }}{% endblock %}
</title>
{% block head_meta %}
<meta
charset=
"UTF-8"
>
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=edge,chrome=1"
>
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1.0"
>
<meta
name=
"description"
content=
""
>
<meta
name=
"author"
content=
""
>
{% endblock %}
{% block head_css %}
<link
href=
"{{ admin_static.url(filename='bootstrap/bootstrap4/bootstrap.min.css', v='4.1.2') }}"
rel=
"stylesheet"
>
<link
href=
"{{ admin_static.url(filename='vendor/fontawesome-free-5.1.0-web/css/all.css', v='5.1.0') }}"
rel=
"stylesheet"
>
{% if admin_view.extra_css %}
{% for css_url in admin_view.extra_css %}
<link
href=
"{{ css_url }}"
rel=
"stylesheet"
>
{% endfor %}
{% endif %}
{% endblock %}
{% block head %}
{% endblock %}
{% block head_tail %}
{% endblock %}
</head>
<body>
{% block page_body %}
<header
class=
"navbar navbar-expand-lg navbar-dark bg-dark mb-3"
role=
"navigation"
>
<!-- Brand and toggle get grouped for better mobile display -->
<div
class=
"navbar-header"
>
<button
class=
"navbar-toggler"
type=
"button"
data-toggle=
"collapse"
data-target=
"#admin-navbar-collapse"
>
<span
class=
"navbar-toggler-icon"
></span>
</button>
{% block brand %}
<a
class=
"navbar-brand"
href=
"{{ admin_view.admin.url }}"
>
{{ admin_view.admin.name }}
</a>
{% endblock %}
</div>
<!-- navbar content -->
<div
class=
"collapse navbar-collapse"
id=
"admin-navbar-collapse"
>
{% block main_menu %}
<ul
class=
"navbar-nav"
>
{{ layout.menu() }}
</ul>
{% endblock %}
{% block menu_links %}
<ul
class=
"navbar-nav ml-auto"
>
{{ layout.menu_links() }}
</ul>
{% endblock %}
{% block access_control %}
{% endblock %}
</div>
</header>
<div
class=
"container-fluid"
>
{% block messages %}
{{ layout.messages() }}
{% endblock %}
{# store the jinja2 context for form_rules rendering logic #}
{% set render_ctx = h.resolve_ctx() %}
{% block body %}{% endblock %}
</div>
{% endblock %}
{% block tail_js %}
<script
src=
"{{ admin_static.url(filename='vendor/jquery-3.3.1.slim.min.js', v='2.1.4') }}"
type=
"text/javascript"
></script>
<script
src=
"{{ admin_static.url(filename='bootstrap/bootstrap4/bootstrap.min.js', v='4.1.2') }}"
type=
"text/javascript"
></script>
<script
src=
"{{ admin_static.url(filename='bootstrap/bootstrap4/popper.min.js') }}"
type=
"text/javascript"
></script>
<script
src=
"{{ admin_static.url(filename='vendor/moment.min.js', v='2.9.0') }}"
type=
"text/javascript"
></script>
<script
src=
"{{ admin_static.url(filename='vendor/select2/select2.min.js', v='3.5.2') }}"
type=
"text/javascript"
></script>
{% if admin_view.extra_js %}
{% for js_url in admin_view.extra_js %}
<script
src=
"{{ js_url }}"
type=
"text/javascript"
></script>
{% endfor %}
{% endif %}
{% endblock %}
{% block tail %}
{% endblock %}
</body>
</html>
flask_admin/templates/bootstrap4/admin/file/form.html
0 → 100644
View file @
80ff3fcc
{% extends 'admin/master.html' %}
{% import 'admin/lib.html' as lib with context %}
{% block body %}
{% block header %}
<h3>
{{ header_text }}
</h3>
{% endblock %}
{% block fa_form %}
{{ lib.render_form(form, dir_url) }}
{% endblock %}
{% endblock %}
flask_admin/templates/bootstrap4/admin/file/list.html
0 → 100644
View file @
80ff3fcc
{% extends 'admin/master.html' %}
{% import 'admin/lib.html' as lib with context %}
{% import 'admin/actions.html' as actionslib with context %}
{% block body %}
{% block breadcrums %}
<ul
class=
"breadcrumb"
>
<li>
<a
href=
"{{ get_dir_url('.index_view', path=None) }}"
>
{{ _gettext('Root') }}
</a>
</li>
{% for name, path in breadcrumbs[:-1] %}
<li>
<a
href=
"{{ get_dir_url('.index_view', path=path) }}"
>
{{ name }}
</a>
</li>
{% endfor %}
{% if breadcrumbs %}
<li>
<a
href=
"{{ get_dir_url('.index_view', path=breadcrumbs[-1][1]) }}"
>
{{ breadcrumbs[-1][0] }}
</a>
</li>
{% endif %}
</ul>
{% endblock %}
{% block file_list_table %}
<div
class=
"table-responsive"
>
<table
class=
"table table-striped table-bordered model-list"
>
<thead>
<tr>
{% block list_header scoped %}
{% if actions %}
<th
class=
"list-checkbox-column"
>
<input
type=
"checkbox"
name=
"rowtoggle"
class=
"action-rowtoggle"
/>
</th>
{% endif %}
{% for column in admin_view.column_list %}
<th>
{% if admin_view.is_column_sortable(column) %}
{% if sort_column == column %}
<a
href=
"{{ sort_url(column, True) }}"
title=
"{{ _gettext('Sort by %(name)s', name=column) }}"
>
{{ admin_view.column_label(column) }}
{% if sort_desc %}
<span
class=
"fas fa-chevron-up"
></span>
{% else %}
<span
class=
"fas fa-chevron-down"
></span>
{% endif %}
</a>
{% else %}
<a
href=
"{{ sort_url(column) }}"
title=
"{{ _gettext('Sort by %(name)s', name=column) }}"
>
{{ admin_view.column_label(column) }}
</a>
{% endif %}
{% else %}
{{ _gettext(admin_view.column_label(column)) }}
{% endif %}
</th>
{% endfor %}
{% endblock %}
</tr>
</thead>
{% for name, path, is_dir, size, date in items %}
<tr>
{% block list_row scoped %}
{% if actions %}
<td>
{% if not is_dir %}
<input
type=
"checkbox"
name=
"rowid"
class=
"action-checkbox"
value=
"{{ path }}"
/>
{% endif %}
</td>
{% endif %}
<td>
{% block list_row_actions scoped %}
{% if admin_view.can_rename and path and name != '..' %}
{%- if admin_view.rename_modal -%}
{{ lib.add_modal_button(url=get_url('.rename', path=path, modal=True),
title=_gettext('Rename File'),
content='
<i
class=
"fas fa-pencil-alt"
></i>
') }}
{% else %}
<a
class=
"icon"
href=
"{{ get_url('.rename', path=path) }}"
title=
"{{ _gettext('Rename File') }}"
>
<i
class=
"fas fa-pencil-alt"
></i>
</a>
{%- endif -%}
{% endif %}
{%- if admin_view.can_delete and path -%}
{% if is_dir %}
{% if name != '..' and admin_view.can_delete_dirs %}
<form
class=
"icon"
method=
"POST"
action=
"{{ get_url('.delete') }}"
>
{{ delete_form.path(value=path) }}
{{ delete_form.csrf_token }}
<button
onclick=
"return confirm('{{ _gettext('Are you sure you want to delete \\\'%(name)s\\\' recursively?', name=name) }}')"
>
<i
class=
"fas fa-times glyphicon glyphicon-remove"
></i>
</button>
</form>
{% endif %}
{% else %}
<form
class=
"icon"
method=
"POST"
action=
"{{ get_url('.delete') }}"
>
{{ delete_form.path(value=path) }}
{{ delete_form.csrf_token }}
<button
onclick=
"return confirm('{{ _gettext('Are you sure you want to delete \\\'%(name)s\\\'?', name=name) }}')"
>
<i
class=
"fa fa-trash glyphicon glyphicon-trash"
></i>
</button>
</form>
{% endif %}
{%- endif -%}
{% endblock %}
</td>
{% if is_dir %}
<td
colspan=
"2"
>
<a
href=
"{{ get_dir_url('.index_view', path)|safe }}"
>
<i
class=
"fa fa-folder-o glyphicon glyphicon-folder-close"
></i>
<span>
{{ name }}
</span>
</a>
</td>
{% else %}
<td>
{% if admin_view.can_download %}
{%- if admin_view.edit_modal and admin_view.is_file_editable(path) -%}
{{ lib.add_modal_button(url=get_file_url(path, modal=True)|safe,
btn_class='', content=name) }}
{% else %}
<a
href=
"{{ get_file_url(path)|safe }}"
>
{{ name }}
</a>
{%- endif -%}
{% else %}
{{ name }}
{% endif %}
</td>
{% if admin_view.is_column_visible('size') %}
<td>
{{ size|filesizeformat }}
</td>
{% endif %}
{% if admin_view.is_column_visible('date') %}
<td>
{{ timestamp_format(date) }}
</td>
{% endif %}
{% endif %}
{% endblock %}
</tr>
{% endfor %}
</table>
</div>
{% endblock %}
{% block toolbar %}
<div
class=
"btn-toolbar"
>
{% if admin_view.can_upload %}
<div
class=
"btn-group"
>
{%- if admin_view.upload_modal -%}
{{ lib.add_modal_button(url=get_dir_url('.upload', path=dir_path, modal=True),
btn_class="btn btn-secondary btn-large",
content=_gettext('Upload File')) }}
{% else %}
<a
class=
"btn btn-secondary btn-large"
href=
"{{ get_dir_url('.upload', path=dir_path) }}"
>
{{ _gettext('Upload File') }}
</a>
{%- endif -%}
</div>
{% endif %}
{% if admin_view.can_mkdir %}
<div
class=
"btn-group"
>
{%- if admin_view.mkdir_modal -%}
{{ lib.add_modal_button(url=get_dir_url('.mkdir', path=dir_path, modal=True),
btn_class="btn btn-secondary btn-large",
content=_gettext('Create Directory')) }}
{% else %}
<a
class=
"btn btn-secondary btn-large"
href=
"{{ get_dir_url('.mkdir', path=dir_path) }}"
>
{{ _gettext('Create Directory') }}
</a>
{%- endif -%}
</div>
{% endif %}
{% if actions %}
<div
class=
"btn-group"
>
{{ actionslib.dropdown(actions, 'dropdown-toggle btn btn-secondary btn-large') }}
</div>
{% endif %}
</div>
{% endblock %}
{% block actions %}
{{ actionslib.form(actions, get_url('.action_view')) }}
{% endblock %}
{%- if admin_view.rename_modal or admin_view.mkdir_modal
or admin_view.upload_modal or admin_view.edit_modal -%}
{{ lib.add_modal_window() }}
{%- endif -%}
{% endblock %}
{% block tail %}
{{ super() }}
{{ actionslib.script(_gettext('Please select at least one file.'),
actions,
actions_confirmation) }}
{% endblock %}
flask_admin/templates/bootstrap4/admin/file/modals/form.html
0 → 100644
View file @
80ff3fcc
{% import 'admin/static.html' as admin_static with context %}
{% import 'admin/lib.html' as lib with context %}
{% block body %}
{# content added to modal-content #}
<div
class=
"modal-header"
>
<button
type=
"button"
class=
"close"
data-dismiss=
"modal"
aria-label=
"Close"
><span
aria-hidden=
"true"
>
×
</span></button>
{% block header %}
<h3>
{{ header_text }}
</h3>
{% endblock %}
</div>
<div
class=
"modal-body"
>
{% block fa_form %}
{{ lib.render_form(form, dir_url, action=request.url, is_modal=True) }}
{% endblock %}
</div>
{% endblock %}
{% block tail %}
<script
src=
"{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"
></script>
{% endblock %}
flask_admin/templates/bootstrap4/admin/index.html
0 → 100644
View file @
80ff3fcc
{% extends 'admin/master.html' %}
{% block body %}
{% endblock %}
flask_admin/templates/bootstrap4/admin/layout.html
0 → 100644
View file @
80ff3fcc
{% macro menu_icon(item) -%}
{% set icon_type = item.get_icon_type() %}
{%- if icon_type %}
{% set icon_value = item.get_icon_value() %}
{% if icon_type == 'fa' %}
<i
class=
"{{ icon_value }}"
></i>
{% else %}
<i
class=
"{{ icon_value }}"
></i>
{% endif %}
{% endif %}
{%- endmacro %}
{% macro menu(menu_root=None) %}
{% if menu_root is none %}{% set menu_root = admin_view.admin.menu() %}{% endif %}
{%- for item in menu_root %}
{%- if item.is_category() -%}
{% set children = item.get_children() %}
{%- if children %}
{% set class_name = item.get_class_name() %}
{%- if item.is_active(admin_view) %}
<li
class=
"active dropdown"
>
{% else -%}
<li
class=
"dropdown"
>
{%- endif %}
<a
class=
"dropdown-toggle"
data-toggle=
"dropdown"
href=
"javascript:void(0)"
>
{% if item.class_name %}
<span
class=
"{{ item.class_name }}"
></span>
{% endif %}{{ item.name }}
<b
class=
"caret"
></b>
</a>
<ul
class=
"dropdown-menu"
>
{%- for child in children -%}
{% set class_name = child.get_class_name() %}
{%- if child.is_active(admin_view) %}
<li
class=
"dropdown-item active{% if class_name %} {{class_name}}{% endif %}"
>
{% else %}
<li
{%
if
class_name
%}
class=
"dropdown-item {{class_name}}"
{%
endif
%}
>
{%- endif %}
<a
href=
"{{ child.get_url() }}"
{%
if
child
.
target
%}
target=
"{{ child.target }}"
{%
endif
%}
>
{{ menu_icon(child) }}{{ child.name }}
</a>
</li>
{%- endfor %}
</ul>
</li>
{% endif %}
{%- else %}
{%- if item.is_accessible() and item.is_visible() -%}
{% set class_name = item.get_class_name() %}
{%- if item.is_active(admin_view) %}
<li
class=
"nav-item active {% if class_name %} {{class_name}}{% endif %}"
>
{%- else %}
<li
class=
"nav-item {% if class_name %} {{class_name}}{% endif %}"
>
{%- endif %}
<a
class=
"nav-link"
href=
"{{ item.get_url() }}"
{%
if
item
.
target
%}
target=
"{{ item.target }}"
{%
endif
%}
>
{{ menu_icon(item) }}{{ item.name }}
</a>
</li>
{%- endif -%}
{% endif -%}
{% endfor %}
{% endmacro %}
{% macro menu_links(links=None) %}
{% if links is none %}{% set links = admin_view.admin.menu_links() %}{% endif %}
{% for item in links %}
{% if item.is_accessible() and item.is_visible() %}
<li
class=
"nav-item"
>
<a
class=
"nav-link"
href=
"{{ item.get_url() }}"
>
{{ menu_icon(item) }}{{ item.name }}
</a>
</li>
{% endif %}
{% endfor %}
{% endmacro %}
{% macro messages() %}
{% with messages = get_flashed_messages(with_categories=True) %}
{% if messages %}
{% for category, m in messages %}
{% if category %}
{# alert-error changed to alert-danger in bootstrap 3, mapping is for backwards compatibility #}
{% set mapping = {'message': 'info', 'error': 'danger'} %}
<div
class=
"alert alert-{{ mapping.get(category, category) }} alert-dismissable"
>
{% else %}
<div
class=
"alert alert-dismissable"
>
{% endif %}
<button
type=
"button"
class=
"close"
data-dismiss=
"alert"
aria-hidden=
"true"
>
×
</button>
{{ m }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
{% endmacro %}
flask_admin/templates/bootstrap4/admin/lib.html
0 → 100644
View file @
80ff3fcc
{% import 'admin/static.html' as admin_static with context %}
{# ---------------------- Pager -------------------------- #}
{% macro pager(page, pages, generator) -%}
{% if pages > 1 %}
<ul
class=
"pagination"
>
{% set min = page - 3 %}
{% set max = page + 3 + 1 %}
{% if min
<
0
%}
{%
set
max =
max
-
min
%}
{%
endif
%}
{%
if
max
>
= pages %}
{% set min = min - max + pages %}
{% endif %}
{% if min
<
0
%}
{%
set
min =
0
%}
{%
endif
%}
{%
if
max
>
= pages %}
{% set max = pages %}
{% endif %}
{% if min > 0 %}
<li
class=
"page-item"
>
<a
class=
"page-link"
href=
"{{ generator(0) }}"
>
«
</a>
</li>
{% else %}
<li
class=
"disabled page-item"
>
<a
class=
"page-link"
href=
"javascript:void(0)"
>
«
</a>
</li>
{% endif %}
{% if page > 0 %}
<li
class=
"page-item"
>
<a
class=
"page-link"
href=
"{{ generator(page-1) }}"
>
<
</a>
</li>
{% else %}
<li
class=
"disabled page-item"
>
<a
class=
"page-link"
href=
"javascript:void(0)"
>
<
</a>
</li>
{% endif %}
{% for p in range(min, max) %}
{% if page == p %}
<li
class=
"active page-item"
>
<a
class=
"page-link"
href=
"javascript:void(0)"
>
{{ p + 1 }}
</a>
</li>
{% else %}
<li
class=
"page-item"
>
<a
class=
"page-link"
href=
"{{ generator(p) }}"
>
{{ p + 1 }}
</a>
</li>
{% endif %}
{% endfor %}
{% if page + 1
<
pages
%}
<
li
class=
"page-item"
>
<a
class=
"page-link"
href=
"{{ generator(page + 1) }}"
>
>
</a>
</li>
{% else %}
<li
class=
"disabled page-item"
>
<a
class=
"page-link"
href=
"javascript:void(0)"
>
>
</a>
</li>
{% endif %}
{% if max
<
pages
%}
<
li
class=
"page-item"
>
<a
class=
"page-link"
href=
"{{ generator(pages - 1) }}"
>
»
</a>
</li>
{% else %}
<li
class=
"disabled page-item"
>
<a
class=
"page-link"
href=
"javascript:void(0)"
>
»
</a>
</li>
{% endif %}
</ul>
{% endif %}
{%- endmacro %}
{% macro simple_pager(page, have_next, generator) -%}
<ul
class=
"pagination"
>
{% if page > 0 %}
<li
class=
"page-item"
>
<a
class=
"page-link"
href=
"{{ generator(page - 1) }}"
>
<
</a>
</li
class="page-item"
>
{% else %}
<li
class=
"disabled page-item"
>
<a
class=
"page-link"
href=
"{{ generator(0) }}"
>
<
</a>
</li>
{% endif %}
{% if have_next %}
<li
class=
"page-item"
>
<a
class=
"page-link"
href=
"{{ generator(page + 1) }}"
>
>
</a>
</li>
{% else %}
<li
class=
"disabled page-item"
>
<a
class=
"page-link"
href=
"{{ generator(page) }}"
>
>
</a>
</li>
{% endif %}
</ul>
{%- endmacro %}
{# ---------------------- Modal Window ------------------- #}
{% macro add_modal_window(modal_window_id='fa_modal_window', modal_label_id='fa_modal_label') %}
<div
class=
"modal fade"
id=
"{{ modal_window_id }}"
tabindex=
"-1"
role=
"dialog"
aria-labelledby=
"{{ modal_label_id }}"
>
<div
class=
"modal-dialog"
role=
"document"
>
{# bootstrap version > 3.1.0 required for this to work #}
<div
class=
"modal-content"
>
</div>
</div>
</div>
{% endmacro %}
{% macro add_modal_button(url='', title='', content='', modal_window_id='fa_modal_window', btn_class='icon') %}
<a
class=
"{{ btn_class }}"
data-target=
"#{{ modal_window_id }}"
title=
"{{ title }}"
href=
"{{ url }}"
data-toggle=
"modal"
>
{{ content|safe }}
</a>
{% endmacro %}
{# ---------------------- Forms -------------------------- #}
{% macro render_field(form, field, kwargs={}, caller=None) %}
{% set direct_error = h.is_field_error(field.errors) %}
<div
class=
"form-group{{ ' has-error' if direct_error else '' }}"
>
<label
for=
"{{ field.id }}"
class=
"col-md-2 control-label"
>
{{ field.label.text }}
{% if h.is_required_form_field(field) %}
<strong
style=
"color: red"
>
*
</strong>
{%- else -%}
{%- endif %}
</label>
<div
class=
"{{ kwargs.get('column_class', 'col-md-10') }}"
>
{% set _dummy = kwargs.setdefault('class', 'form-control') %}
{{ field(**kwargs)|safe }}
{% if field.description %}
<p
class=
"help-block"
>
{{ field.description|safe }}
</p>
{% endif %}
{% if direct_error %}
<ul
class=
"help-block input-errors"
>
{% for e in field.errors if e is string %}
<li>
{{ e }}
</li>
{% endfor %}
</ul>
{% endif %}
</div>
{% if caller %}
{{ caller(form, field, direct_error, kwargs) }}
{% endif %}
</div>
{% endmacro %}
{% macro render_header(form, text) %}
<h3>
{{ text }}
</h3>
{% endmacro %}
{% macro render_form_fields(form, form_opts=None) %}
{% if form.hidden_tag is defined %}
{{ form.hidden_tag() }}
{% else %}
{% if csrf_token %}
<input
type=
"hidden"
name=
"csrf_token"
value=
"{{ csrf_token() }}"
/>
{% endif %}
{% for f in form if f.widget.input_type == 'hidden' %}
{{ f }}
{% endfor %}
{% endif %}
{% if form_opts and form_opts.form_rules %}
{% for r in form_opts.form_rules %}
{{ r(form, form_opts=form_opts) }}
{% endfor %}
{% else %}
{% for f in form if f.widget.input_type != 'hidden' %}
{% if form_opts %}
{% set kwargs = form_opts.widget_args.get(f.short_name, {}) %}
{% else %}
{% set kwargs = {} %}
{% endif %}
{{ render_field(form, f, kwargs) }}
{% endfor %}
{% endif %}
{% endmacro %}
{% macro form_tag(form=None, action=None) %}
<form
action=
"{{ action or '' }}"
method=
"POST"
role=
"form"
class=
"admin-form form-horizontal"
enctype=
"multipart/form-data"
>
{{ caller() }}
</form>
{% endmacro %}
{% macro render_form_buttons(cancel_url, extra=None, is_modal=False) %}
<hr>
<div
class=
"form-group"
>
<div
class=
"col-md-offset-2 col-md-10 submit-row"
>
<input
type=
"submit"
class=
"btn btn-primary"
value=
"{{ _gettext('Save') }}"
/>
{% if extra %}
{{ extra }}
{% endif %}
{% if cancel_url %}
<a
href=
"{{ cancel_url }}"
class=
"btn btn-danger"
role=
"button"
{%
if
is_modal
%}
data-dismiss=
"modal"
{%
endif
%}
>
{{ _gettext('Cancel') }}
</a>
{% endif %}
</div>
</div>
{% endmacro %}
{% macro render_form(form, cancel_url, extra=None, form_opts=None, action=None, is_modal=False) -%}
{% call form_tag(action=action) %}
{{ render_form_fields(form, form_opts=form_opts) }}
{{ render_form_buttons(cancel_url, extra, is_modal) }}
{% endcall %}
{% endmacro %}
{% macro form_css() %}
<link
href=
"{{ admin_static.url(filename='vendor/select2/select2.css', v='3.5.2') }}"
rel=
"stylesheet"
>
<link
href=
"{{ admin_static.url(filename='vendor/select2/select2-bootstrap3.css', v='1.4.6') }}"
rel=
"stylesheet"
>
<link
href=
"{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs3.css', v='1.3.22') }}"
rel=
"stylesheet"
>
{% if config.MAPBOX_MAP_ID %}
<link
href=
"{{ admin_static.url(filename='vendor/leaflet/leaflet.css', v='1.0.0') }}"
rel=
"stylesheet"
>
<link
href=
"{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.css', v='0.3.2') }}"
rel=
"stylesheet"
>
{% endif %}
{% if editable_columns %}
<link
href=
"{{ admin_static.url(filename='vendor/x-editable/css/bootstrap3-editable.css', v='1.5.1.1') }}"
rel=
"stylesheet"
>
{% endif %}
{% endmacro %}
{% macro form_js() %}
{% if config.MAPBOX_MAP_ID %}
<script>
window
.
MAPBOX_MAP_ID
=
"{{ config.MAPBOX_MAP_ID }}"
;
{
%
if
config
.
MAPBOX_ACCESS_TOKEN
%
}
window
.
MAPBOX_ACCESS_TOKEN
=
"{{ config.MAPBOX_ACCESS_TOKEN }}"
;
{
%
endif
%
}
</script>
<script
src=
"{{ admin_static.url(filename='vendor/leaflet/leaflet.js', v='1.0.0') }}"
></script>
<script
src=
"{{ admin_static.url(filename='vendor/leaflet/leaflet.draw.js', v='0.3.2') }}"
></script>
{% if config.MAPBOX_SEARCH %}
<script>
window
.
MAPBOX_SEARCH
=
"{{ config.MAPBOX_SEARCH }}"
;
</script>
<script
src=
"https://maps.googleapis.com/maps/api/js?v=3&libraries=places&key={{ config.get('GOOGLE_MAPS_API_KEY') }}"
></script>
{% endif %}
{% endif %}
<script
src=
"{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js', v='1.3.22') }}"
></script>
{% if editable_columns %}
<script
src=
"{{ admin_static.url(filename='vendor/x-editable/js/bootstrap3-editable.min.js', v='1.5.1.1') }}"
></script>
{% endif %}
<script
src=
"{{ admin_static.url(filename='admin/js/form.js', v='1.0.1') }}"
></script>
{% endmacro %}
{% macro extra() %}
{% if admin_view.can_create %}
<input
name=
"_add_another"
type=
"submit"
class=
"btn btn-secondary"
value=
"{{ _gettext('Save and Add Another') }}"
/>
{% endif %}
{% if admin_view.can_edit %}
<input
name=
"_continue_editing"
type=
"submit"
class=
"btn btn-secondary"
value=
"{{ _gettext('Save and Continue Editing') }}"
/>
{% endif %}
{% endmacro %}
flask_admin/templates/bootstrap4/admin/master.html
0 → 100644
View file @
80ff3fcc
{% extends admin_base_template %}
flask_admin/templates/bootstrap4/admin/model/create.html
0 → 100644
View file @
80ff3fcc
{% extends 'admin/master.html' %}
{% import 'admin/lib.html' as lib with context %}
{% from 'admin/lib.html' import extra with context %} {# backward compatible #}
{% block head %}
{{ super() }}
{{ lib.form_css() }}
{% endblock %}
{% block body %}
{% block navlinks %}
<ul
class=
"nav nav-tabs"
>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
href=
"{{ return_url }}"
>
{{ _gettext('List') }}
</a>
</li>
<li
class=
"nav-item"
>
<a
class=
"nav-link active "
href=
"javascript:void(0)"
>
{{ _gettext('Create') }}
</a>
</li>
</ul>
{% endblock %}
{% block create_form %}
{{ lib.render_form(form, return_url, extra(), form_opts) }}
{% endblock %}
{% endblock %}
{% block tail %}
{{ super() }}
{{ lib.form_js() }}
{% endblock %}
flask_admin/templates/bootstrap4/admin/model/details.html
0 → 100644
View file @
80ff3fcc
{% extends 'admin/master.html' %}
{% import 'admin/lib.html' as lib with context %}
{% block body %}
{% block navlinks %}
<ul
class=
"nav nav-tabs"
>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
href=
"{{ return_url }}"
>
{{ _gettext('List') }}
</a>
</li>
{%- if admin_view.can_create -%}
<li
class=
"nav-item"
>
<a
class=
"nav-link"
href=
"{{ get_url('.create_view', url=return_url) }}"
>
{{ _gettext('Create') }}
</a>
</li>
{%- endif -%}
{%- if admin_view.can_edit -%}
<li
class=
"nav-item"
>
<a
class=
"nav-link"
href=
"{{ get_url('.edit_view', id=request.args.get('id'), url=return_url) }}"
>
{{ _gettext('Edit') }}
</a>
</li>
{%- endif -%}
<li
class=
"nav-item"
>
<a
class=
"nav-link active"
href=
"javascript:void(0)"
>
{{ _gettext('Details') }}
</a>
</li>
</ul>
{% endblock %}
{% block details_search %}
<div
class=
"input-group fa_filter_container col-lg-6"
>
<span
class=
"input-group-addon"
>
{{ _gettext('Filter') }}
</span>
<input
id=
"fa_filter"
type=
"text"
class=
"form-control"
>
</div>
{% endblock %}
{% block details_table %}
<table
class=
"table table-hover table-bordered searchable"
>
{% for c, name in details_columns %}
<tr>
<td>
<b>
{{ name }}
</b>
</td>
<td>
{{ get_value(model, c) }}
</td>
</tr>
{% endfor %}
</table>
{% endblock %}
{% endblock %}
{% block tail %}
{{ super() }}
<script
src=
"{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"
></script>
{% endblock %}
flask_admin/templates/bootstrap4/admin/model/edit.html
0 → 100644
View file @
80ff3fcc
{% extends 'admin/master.html' %}
{% import 'admin/lib.html' as lib with context %}
{% from 'admin/lib.html' import extra with context %} {# backward compatible #}
{% block head %}
{{ super() }}
{{ lib.form_css() }}
{% endblock %}
{% block body %}
{% block navlinks %}
<ul
class=
"nav nav-tabs"
>
<li
class=
"nav-item"
>
<a
class=
"nav-link"
href=
"{{ return_url }}"
>
{{ _gettext('List') }}
</a>
</li>
{%- if admin_view.can_create -%}
<li
class=
"nav-item"
>
<a
href=
"{{ get_url('.create_view', url=return_url) }}"
>
{{ _gettext('Create') }}
</a>
</li>
{%- endif -%}
<li
class=
"nav-item"
>
<a
class=
"nav-link active "
href=
"javascript:void(0)"
>
{{ _gettext('Edit') }}
</a>
</li>
{%- if admin_view.can_view_details -%}
<li
class=
"nav-item"
>
<a
class=
"nav-link"
href=
"{{ get_url('.details_view', id=request.args.get('id'), url=return_url) }}"
>
{{ _gettext('Details') }}
</a>
</li>
{%- endif -%}
</ul>
{% endblock %}
{% block edit_form %}
{{ lib.render_form(form, return_url, extra(), form_opts) }}
{% endblock %}
{% endblock %}
{% block tail %}
{{ super() }}
{{ lib.form_js() }}
{% endblock %}
flask_admin/templates/bootstrap4/admin/model/inline_field_list.html
0 → 100644
View file @
80ff3fcc
{% import 'admin/model/inline_list_base.html' as base with context %}
{% macro render_field(field) %}
{{ field }}
{% if h.is_field_error(field.errors) %}
<ul
class=
"help-block input-errors"
>
{% for e in field.errors if e is string %}
<li>
{{ e }}
</li>
{% endfor %}
</ul>
{% endif %}
{% endmacro %}
{{ base.render_inline_fields(field, template, render_field, check) }}
flask_admin/templates/bootstrap4/admin/model/inline_form.html
0 → 100644
View file @
80ff3fcc
{% import 'admin/lib.html' as lib with context %}
<div
class=
"inline-form-field"
>
{{ lib.render_form_fields(field.form, form_opts=form_opts) }}
</div>
flask_admin/templates/bootstrap4/admin/model/inline_list_base.html
0 → 100644
View file @
80ff3fcc
{% macro render_inline_fields(field, template, render, check=None) %}
<div
class=
"inline-field"
id=
"{{ field.id }}"
>
{# existing inline form fields #}
<div
class=
"inline-field-list"
>
{% for subfield in field %}
<div
id=
"{{ subfield.id }}"
class=
"inline-field well well-sm"
>
{%- if not check or check(subfield) %}
<legend>
<small>
{{ field.label.text }} #{{ loop.index }}
<div
class=
"pull-right"
>
{% if subfield.get_pk and subfield.get_pk() %}
<input
type=
"checkbox"
name=
"del-{{ subfield.id }}"
id=
"del-{{ subfield.id }}"
/>
<label
for=
"del-{{ subfield.id }}"
style=
"display: inline"
>
{{ _gettext('Delete?') }}
</label>
{% else %}
<a
href=
"javascript:void(0)"
class=
"inline-remove-field"
>
<i
class=
"fas fa-times"
></i>
</a>
{% endif %}
</div>
</small>
</legend>
<div
class=
'clearfix'
></div>
{%- endif -%}
{{ render(subfield) }}
</div>
{% endfor %}
</div>
{# template for new inline form fields #}
<div
class=
"inline-field-template hide"
>
{% filter forceescape %}
<div
class=
"inline-field well well-sm"
>
<legend>
<small>
{{ _gettext('New') }} {{ field.label.text }}
</small>
<div
class=
"pull-right"
>
<a
href=
"javascript:void(0)"
class=
"inline-remove-field"
>
<span
class=
"fas fa-times"
></span>
</a>
</div>
</legend>
<div
class=
'clearfix'
></div>
{{ render(template) }}
</div>
{% endfilter %}
</div>
<a
id=
"{{ field.id }}-button"
href=
"javascript:void(0)"
class=
"btn btn-secondary"
onclick=
"faForm.addInlineField(this, '{{ field.id }}');"
>
{{ _gettext('Add') }} {{ field.label.text }}
</a>
</div>
{% endmacro %}
flask_admin/templates/bootstrap4/admin/model/layout.html
0 → 100644
View file @
80ff3fcc
{% macro filter_options(btn_class='dropdown-toggle') %}
<a
class=
"{{ btn_class }}"
data-toggle=
"dropdown"
href=
"javascript:void(0)"
>
{{ _gettext('Add Filter') }}
<b
class=
"caret"
></b>
</a>
<ul
class=
"dropdown-menu field-filters"
>
{% for k in filter_groups %}
<li
class=
"dropdown-item"
>
<a
href=
"javascript:void(0)"
class=
"filter"
onclick=
"return false;"
>
{{ k }}
</a>
</li>
{% endfor %}
</ul>
{% endmacro %}
{% macro export_options(btn_class='dropdown-toggle') %}
{% if admin_view.export_types|length > 1 %}
<li
class=
"dropdown"
>
<a
class=
"{{ btn_class }}"
data-toggle=
"dropdown"
href=
"javascript:void(0)"
>
{{ _gettext('Export') }}
<b
class=
"caret"
></b>
</a>
<ul
class=
"dropdown-menu field-filters"
>
{% for export_type in admin_view.export_types %}
<li
class=
"dropdown-item"
>
<a
href=
"{{ get_url('.export', export_type=export_type, **request.args) }}"
title=
"{{ _gettext('Export') }}"
>
{{ _gettext('Export') + ' ' + export_type|upper }}
</a>
</li>
{% endfor %}
</ul>
</li>
{% else %}
<li>
<a
href=
"{{ get_url('.export', export_type=admin_view.export_types[0], **request.args) }}"
title=
"{{ _gettext('Export') }}"
>
{{ _gettext('Export') }}
</a>
</li>
{% endif %}
{% endmacro %}
{% macro filter_form() %}
<form
id=
"filter_form"
method=
"GET"
action=
"{{ return_url }}"
>
{% if sort_column is not none %}
<input
type=
"hidden"
name=
"sort"
value=
"{{ sort_column }}"
>
{% endif %}
{% if sort_desc %}
<input
type=
"hidden"
name=
"desc"
value=
"{{ sort_desc }}"
>
{% endif %}
{% if search %}
<input
type=
"hidden"
name=
"search"
value=
"{{ search }}"
>
{% endif %}
{% if page_size != default_page_size %}
<input
type=
"hidden"
name=
"page_size"
value=
"{{ page_size }}"
>
{% endif %}
<div
class=
"pull-right"
>
<button
type=
"submit"
class=
"btn btn-primary"
style=
"display: none"
>
{{ _gettext('Apply') }}
</button>
{% if active_filters %}
<a
href=
"{{ clear_search_url }}"
class=
"btn btn-secondary"
>
{{ _gettext('Reset Filters') }}
</a>
{% endif %}
</div>
<table
class=
"filters"
></table>
</form>
<div
class=
"clearfix"
></div>
{% endmacro %}
{% macro search_form(input_class="") %}
<form
method=
"GET"
action=
"{{ return_url }}"
class=
"form-inline"
role=
"search"
>
{% for flt_name, flt_value in filter_args.items() %}
<input
type=
"hidden"
name=
"{{ flt_name }}"
value=
"{{ flt_value }}"
>
{% endfor %}
{% if page_size != default_page_size %}
<input
type=
"hidden"
name=
"page_size"
value=
"{{ page_size }}"
>
{% endif %}
{% if sort_column is not none %}
<input
type=
"hidden"
name=
"sort"
value=
"{{ sort_column }}"
>
{% endif %}
{% if sort_desc %}
<input
type=
"hidden"
name=
"desc"
value=
"{{ sort_desc }}"
>
{% endif %}
{% if search %}
<div
class=
"input-group"
>
<input
type=
"text"
name=
"search"
value=
"{{ search }}"
class=
"{{ input_class }} form-control"
placeholder=
"{{ _gettext('Search') }}"
>
<div
class=
"input-group-append"
>
<a
href=
"{{ clear_search_url }}"
class=
"input-group-text"
>
<span
class=
"fas fa-times"
></span>
</a>
</div>
</div>
{% else %}
<div
class=
"form-group"
>
<input
type=
"text"
name=
"search"
value=
""
class=
"{{ input_class }} form-control"
placeholder=
"{{ _gettext('Search') }}"
>
</div>
{% endif %}
</form>
{% endmacro %}
{% macro page_size_form(generator, btn_class='dropdown-toggle') %}
<a
class=
"{{ btn_class }}"
data-toggle=
"dropdown"
href=
"javascript:void(0)"
>
{{ page_size }} {{ _gettext('items') }}
<b
class=
"caret"
></b>
</a>
<ul
class=
"dropdown-menu"
>
<li
class=
"dropdown-item"
><a
href=
"{{ generator(20) }}"
>
20 {{ _gettext('items') }}
</a></li>
<li
class=
"dropdown-item"
><a
href=
"{{ generator(50) }}"
>
50 {{ _gettext('items') }}
</a></li>
<li
class=
"dropdown-item"
><a
href=
"{{ generator(100) }}"
>
100 {{ _gettext('items') }}
</a></li>
</ul>
{% endmacro %}
flask_admin/templates/bootstrap4/admin/model/list.html
0 → 100755
View file @
80ff3fcc
{% extends 'admin/master.html' %}
{% import 'admin/lib.html' as lib with context %}
{% import 'admin/static.html' as admin_static with context%}
{% import 'admin/model/layout.html' as model_layout with context %}
{% import 'admin/actions.html' as actionlib with context %}
{% import 'admin/model/row_actions.html' as row_actions with context %}
{% block head %}
{{ super() }}
{{ lib.form_css() }}
{% endblock %}
{% block body %}
{% block model_menu_bar %}
<ul
class=
"nav nav-tabs actions-nav"
>
<li
class=
"nav-item"
>
<a
class=
"nav-link active"
href=
"javascript:void(0)"
>
{{ _gettext('List') }}{% if count %} ({{ count }}){% endif %}
</a>
</li>
{% if admin_view.can_create %}
<li
class=
"nav-item"
>
{%- if admin_view.create_modal -%}
{{ lib.add_modal_button(url=get_url('.create_view', url=return_url, modal=True), title=_gettext('Create New Record'), content=_gettext('Create')) }}
{% else %}
<a
class=
"nav-link"
href=
"{{ get_url('.create_view', url=return_url) }}"
title=
"{{ _gettext('Create New Record') }}"
>
{{ _gettext('Create') }}
</a>
{%- endif -%}
</li>
{% endif %}
{% if admin_view.can_export %}
{{ model_layout.export_options() }}
{% endif %}
{% block model_menu_bar_before_filters %}{% endblock %}
{% if filters %}
<li
class=
"dropdown"
>
{{ model_layout.filter_options() }}
</li>
{% endif %}
{% if can_set_page_size %}
<li
class=
"dropdown"
>
{{ model_layout.page_size_form(page_size_url) }}
</li>
{% endif %}
{% if actions %}
<li
class=
"dropdown"
>
{{ actionlib.dropdown(actions) }}
</li>
{% endif %}
{% if search_supported %}
<li>
{{ model_layout.search_form() }}
</li>
{% endif %}
{% block model_menu_bar_after_filters %}{% endblock %}
</ul>
{% endblock %}
{% if filters %}
{{ model_layout.filter_form() }}
<div
class=
"clearfix"
></div>
{% endif %}
{% block model_list_table %}
<div
class=
"table-responsive"
>
<table
class=
"table table-striped table-bordered table-hover model-list"
>
<thead>
<tr>
{% block list_header scoped %}
{% if actions %}
<th
class=
"list-checkbox-column"
>
<input
type=
"checkbox"
name=
"rowtoggle"
class=
"action-rowtoggle"
title=
"{{ _gettext('Select all records') }}"
/>
</th>
{% endif %}
{% block list_row_actions_header %}
{% if admin_view.column_display_actions %}
<th
class=
"col-md-1"
>
</th>
{% endif %}
{% endblock %}
{% for c, name in list_columns %}
{% set column = loop.index0 %}
<th
class=
"column-header col-{{c}}"
>
{% if admin_view.is_sortable(c) %}
{% if sort_column == column %}
<a
href=
"{{ sort_url(column, True) }}"
title=
"{{ _gettext('Sort by %(name)s', name=name) }}"
>
{{ name }}
{% if sort_desc %}
<span
class=
"fa fa-chevron-up glyphicon glyphicon-chevron-up"
></span>
{% else %}
<span
class=
"fa fa-chevron-down glyphicon glyphicon-chevron-down"
></span>
{% endif %}
</a>
{% else %}
<a
href=
"{{ sort_url(column) }}"
title=
"{{ _gettext('Sort by %(name)s', name=name) }}"
>
{{ name }}
</a>
{% endif %}
{% else %}
{{ name }}
{% endif %}
{% if admin_view.column_descriptions.get(c) %}
<a
class=
"fa fa-question-circle glyphicon glyphicon-question-sign"
title=
"{{ admin_view.column_descriptions[c] }}"
href=
"javascript:void(0)"
data-role=
"tooltip"
></a>
{% endif %}
</th>
{% endfor %}
{% endblock %}
</tr>
</thead>
{% for row in data %}
<tr>
{% block list_row scoped %}
{% if actions %}
<td>
<input
type=
"checkbox"
name=
"rowid"
class=
"action-checkbox"
value=
"{{ get_pk_value(row) }}"
title=
"{{ _gettext('Select record') }}"
/>
</td>
{% endif %}
{% block list_row_actions_column scoped %}
{% if admin_view.column_display_actions %}
<td>
{% block list_row_actions scoped %}
{% for action in list_row_actions %}
{{ action.render_ctx(get_pk_value(row), row) }}
{% endfor %}
{% endblock %}
</td>
{%- endif -%}
{% endblock %}
{% for c, name in list_columns %}
<td
class=
"col-{{c}}"
>
{% if admin_view.is_editable(c) %}
{% set form = list_forms[get_pk_value(row)] %}
{% if form.csrf_token %}
{{ form[c](pk=get_pk_value(row), display_value=get_value(row, c), csrf=form.csrf_token._value()) }}
{% else %}
{{ form[c](pk=get_pk_value(row), display_value=get_value(row, c)) }}
{% endif %}
{% else %}
{{ get_value(row, c) }}
{% endif %}
</td>
{% endfor %}
{% endblock %}
</tr>
{% else %}
<tr>
<td
colspan=
"999"
>
{% block empty_list_message %}
<div
class=
"text-center"
>
{{ admin_view.get_empty_list_message() }}
</div>
{% endblock %}
</td>
</tr>
{% endfor %}
</table>
</div>
{% block list_pager %}
{% if num_pages is not none %}
{{ lib.pager(page, num_pages, pager_url) }}
{% else %}
{{ lib.simple_pager(page, data|length == page_size, pager_url) }}
{% endif %}
{% endblock %}
{% endblock %}
{% block actions %}
{{ actionlib.form(actions, get_url('.action_view')) }}
{% endblock %}
{%- if admin_view.edit_modal or admin_view.create_modal or admin_view.details_modal -%}
{{ lib.add_modal_window() }}
{%- endif -%}
{% endblock %}
{% block tail %}
{{ super() }}
<script
src=
"{{ admin_static.url(filename='admin/js/filters.js', v='1.0.0') }}"
></script>
{{ lib.form_js() }}
{{ actionlib.script(_gettext('Please select at least one record.'),
actions,
actions_confirmation) }}
<script
language=
"javascript"
>
(
function
(
$
)
{
$
(
'[data-role=tooltip]'
).
tooltip
({
html
:
true
,
placement
:
'bottom'
});
{
%
if
filter_groups
%
}
var
filter
=
new
AdminFilters
(
'#filter_form'
,
'.field-filters'
,
{{
filter_groups
|
tojson
|
safe
}},
{{
active_filters
|
tojson
|
safe
}}
);
{
%
endif
%
}
})(
jQuery
);
// Catch exception when closing dialog with
<
esc
>
key
// and prevent accidental deletions.
function
safeConfirm
(
msg
)
{
try
{
var
isconfirmed
=
confirm
(
msg
);
if
(
isconfirmed
==
true
)
{
return
true
;
}
else
{
return
false
;
}
}
catch
(
err
)
{
return
false
;
}
}
</script>
{% endblock %}
flask_admin/templates/bootstrap4/admin/model/modals/create.html
0 → 100644
View file @
80ff3fcc
{% import 'admin/static.html' as admin_static with context%}
{% import 'admin/lib.html' as lib with context %}
{# store the jinja2 context for form_rules rendering logic #}
{% set render_ctx = h.resolve_ctx() %}
{% block body %}
<div
class=
"modal-header"
>
<button
type=
"button"
class=
"close"
data-dismiss=
"modal"
aria-label=
"Close"
><span
aria-hidden=
"true"
>
×
</span></button>
{% block header_text %}
<h3>
{{ _gettext('Create New Record') }}
</h3>
{% endblock %}
</div>
<div
class=
"modal-body"
>
{# "save and add" button is removed from modal (it won't function properly) #}
{% block create_form %}
{{ lib.render_form(form, return_url, extra=None, form_opts=form_opts,
action=url_for('.create_view', url=return_url),
is_modal=True) }}
{% endblock %}
</div>
{% endblock %}
{% block tail %}
<script
src=
"{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"
></script>
<script>
$
(
function
()
{
// Apply flask-admin form styles after the modal is loaded
window
.
faForm
.
applyGlobalStyles
(
document
);
});
</script>
{% endblock %}
flask_admin/templates/bootstrap4/admin/model/modals/details.html
0 → 100755
View file @
80ff3fcc
{% import 'admin/static.html' as admin_static with context%}
{% import 'admin/lib.html' as lib with context %}
{% block body %}
<div
class=
"modal-header"
>
<button
type=
"button"
class=
"close"
data-dismiss=
"modal"
aria-label=
"Close"
><span
aria-hidden=
"true"
>
×
</span></button>
{% block header_text %}
<h3>
{{ _gettext('View Record') + ' #' + request.args.get('id') }}
</h3>
{% endblock %}
</div>
<div
class=
"modal-body"
>
{% block details_search %}
<div
class=
"input-group fa_filter_container col-lg-6"
>
<span
class=
"input-group-addon"
>
{{ _gettext('Filter') }}
</span>
<input
id=
"fa_filter"
type=
"text"
class=
"form-control"
>
</div>
{% endblock %}
{% block details_table %}
<table
class=
"table table-hover table-bordered searchable"
>
{% for c, name in details_columns %}
<tr>
<td>
<b>
{{ name }}
</b>
</td>
<td>
{{ get_value(model, c) }}
</td>
</tr>
{% endfor %}
</table>
{% endblock %}
</div>
{% endblock %}
{% block tail %}
<script
src=
"{{ admin_static.url(filename='admin/js/details_filter.js', v='1.0.0') }}"
></script>
<script
src=
"{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"
></script>
{% endblock %}
flask_admin/templates/bootstrap4/admin/model/modals/edit.html
0 → 100644
View file @
80ff3fcc
{% import 'admin/static.html' as admin_static with context%}
{% import 'admin/lib.html' as lib with context %}
{# store the jinja2 context for form_rules rendering logic #}
{% set render_ctx = h.resolve_ctx() %}
{% block body %}
<div
class=
"modal-header"
>
<button
type=
"button"
class=
"close"
data-dismiss=
"modal"
aria-label=
"Close"
><span
aria-hidden=
"true"
>
×
</span></button>
{% block header_text %}
<h3>
{{ _gettext('Edit Record') + ' #' + request.args.get('id') }}
</h3>
{% endblock %}
</div>
<div
class=
"modal-body"
>
{# "save and continue" button is removed from modal (it won't function properly) #}
{% block edit_form %}
{{ lib.render_form(form, return_url, extra=None, form_opts=form_opts,
action=url_for('.edit_view', id=request.args.get('id'), url=return_url),
is_modal=True) }}
{% endblock %}
</div>
{% endblock %}
{% block tail %}
<script
src=
"{{ admin_static.url(filename='admin/js/bs3_modal.js', v='1.0.0') }}"
></script>
<script>
$
(
function
()
{
// Apply flask-admin form styles after the modal is loaded
window
.
faForm
.
applyGlobalStyles
(
document
);
});
</script>
{% endblock %}
flask_admin/templates/bootstrap4/admin/model/row_actions.html
0 → 100644
View file @
80ff3fcc
{% import 'admin/lib.html' as lib with context %}
{% macro link(action, url, icon_class=None) %}
<a
class=
"btn-link btn"
href=
"{{ url }}"
title=
"{{ action.title or '' }}"
>
<span
class=
"{{ icon_class or action.icon_class }}"
></span>
</a>
{% endmacro %}
{% macro view_row(action, row_id, row) %}
{{ link(action, get_url('.details_view', id=row_id, url=return_url), 'fa fa-eye glyphicon glyphicon-eye-open') }}
{% endmacro %}
{% macro view_row_popup(action, row_id, row) %}
{{ lib.add_modal_button(url=get_url('.details_view', id=row_id, url=return_url, modal=True), title=action.title, content='
<span
class=
"fa fa-eye glyphicon glyphicon-eye-open"
></span>
') }}
{% endmacro %}
{% macro edit_row(action, row_id, row) %}
{{ link(action, get_url('.edit_view', id=row_id, url=return_url), 'fas fa-pencil-alt') }}
{% endmacro %}
{% macro edit_row_popup(action, row_id, row) %}
{{ lib.add_modal_button(url=get_url('.edit_view', id=row_id, url=return_url, modal=True), title=action.title, content='
<span
class=
"fas fa-pencil-alt"
></span>
') }}
{% endmacro %}
{% macro delete_row(action, row_id, row) %}
<form
class=
"d-inline-block"
method=
"POST"
action=
"{{ get_url('.delete_view') }}"
>
{{ delete_form.id(value=get_pk_value(row)) }}
{{ delete_form.url(value=return_url) }}
{% if delete_form.csrf_token %}
{{ delete_form.csrf_token }}
{% elif csrf_token %}
<input
type=
"hidden"
name=
"csrf_token"
value=
"{{ csrf_token() }}"
/>
{% endif %}
<button
class=
"btn btn-link"
onclick=
"return safeConfirm('{{ _gettext('Are you sure you want to delete this record?') }}');"
title=
"Delete record"
>
<span
class=
"fa fa-trash glyphicon glyphicon-trash"
></span>
</button>
</form>
{% endmacro %}
flask_admin/templates/bootstrap4/admin/rediscli/console.html
0 → 100644
View file @
80ff3fcc
{% extends 'admin/master.html' %}
{% import 'admin/lib.html' as lib with context %}
{% import 'admin/static.html' as admin_static with context%}
{% block head %}
{{ super() }}
<link
href=
"{{ admin_static.url(filename='admin/css/bootstrap3/rediscli.css', v='1.0.0') }}"
rel=
"stylesheet"
>
{% endblock %}
{% block body %}
<div
class=
"console"
>
<div
class=
"console-container"
>
</div>
<div
class=
"console-line"
>
<form
action=
"#"
>
<input
type=
"text"
></input>
</form>
</div>
</div>
{% endblock %}
{% block tail %}
{{ super() }}
<script
src=
"{{ admin_static.url(filename='admin/js/rediscli.js', v='1.0.0') }}"
></script>
<script
language=
"javascript"
>
$
(
function
()
{
var
redisCli
=
new
RedisCli
({{
admin_view
.
get_url
(
'.execute_view'
)
|
tojson
}});
});
</script>
{% endblock %}
flask_admin/templates/bootstrap4/admin/rediscli/response.html
0 → 100644
View file @
80ff3fcc
{% macro render(item, depth=0) %}
{% set type = type_name(item) %}
{% if type == 'tuple' or type == 'list' %}
{% if not item %}
Empty {{ type }}.
{% else %}
{% for n in item %}
{{ loop.index }}) {{ render(n, depth + 1) }}
<br/>
{% endfor %}
{% endif %}
{% elif type == 'bool' %}
{% if depth == 0 and item %}
OK
{% else %}
<span
class=
"type-bool"
>
{{ item }}
</span>
{% endif %}
{% elif type == 'str' or type == 'unicode' %}
"{{ item }}"
{% elif type == 'bytes' %}
"{{ item.decode('utf-8') }}"
{% elif type == 'TextWrapper' %}
<pre>
{{ item }}
</pre>
{% elif type == 'dict' %}
{% for k, v in item.items() %}
{{ loop.index }}) {{ k }} - {{ render(v, depth + 1) }}
<br/>
{% endfor %}
{% else %}
{{ item }}
{% endif %}
{% endmacro %}
{{ render(result) }}
\ No newline at end of file
flask_admin/templates/bootstrap4/admin/static.html
0 → 100644
View file @
80ff3fcc
{% macro url() -%}
{{ get_url('admin.static', *varargs, **kwargs) }}
{%- endmacro %}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment