new search design basics + Boostrap fixes
This commit is contained in:
parent
b53f83a76c
commit
77e778caac
66
cookbook/static/recipe_no_image.svg
Normal file
66
cookbook/static/recipe_no_image.svg
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
aria-hidden="true"
|
||||||
|
focusable="false"
|
||||||
|
data-prefix="fas"
|
||||||
|
data-icon="pizza-slice"
|
||||||
|
class="svg-inline--fa fa-pizza-slice fa-w-16"
|
||||||
|
role="img"
|
||||||
|
viewBox="0 0 512 512"
|
||||||
|
version="1.1"
|
||||||
|
id="svg4"
|
||||||
|
sodipodi:docname="recipe_no_image.svg"
|
||||||
|
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||||
|
<metadata
|
||||||
|
id="metadata10">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs8" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="3840"
|
||||||
|
inkscape:window-height="2066"
|
||||||
|
id="namedview6"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.921875"
|
||||||
|
inkscape:cx="309.52383"
|
||||||
|
inkscape:cy="214.71807"
|
||||||
|
inkscape:window-x="2869"
|
||||||
|
inkscape:window-y="54"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg4" />
|
||||||
|
<rect
|
||||||
|
style="fill:#f5f5f6;fill-opacity:1;stroke:#d8dde0;stroke-width:3.77952766;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="rect817"
|
||||||
|
width="1717.1526"
|
||||||
|
height="1092.339"
|
||||||
|
x="-602.57629"
|
||||||
|
y="-290.16949" />
|
||||||
|
<path
|
||||||
|
d="m 198.99508,105.32039 c -9.4835,-0.89523 -18.30973,4.9591 -20.73342,14.20588 l -8.69126,33.14115 c 110.10488,3.23343 184.58794,76.92493 189.24752,186.70242 l 33.41527,-9.29389 c 9.22528,-2.56789 14.95881,-11.59086 13.8614,-21.1439 C 393.84116,202.45866 305.74904,115.43295 198.99508,105.32039 Z m -34.31314,65.96427 -58.59701,223.50695 a 9.5128449,9.5471493 0 0 0 11.73701,11.63209 l 222.4163,-61.9004 C 337.73239,241.51893 268.0087,172.46259 164.68194,171.30821 Z m 16.19707,178.95751 a 18.779213,18.846933 0 1 1 18.77921,-18.84693 18.779213,18.846933 0 0 1 -18.77921,18.84693 z m 28.16882,-89.52293 a 18.779213,18.846933 0 1 1 18.77921,-18.84693 18.779213,18.846933 0 0 1 -18.77921,18.84693 z m 61.03245,61.25253 a 18.779213,18.846933 0 1 1 18.77921,-18.84693 18.779213,18.846933 0 0 1 -18.77921,18.84693 z"
|
||||||
|
id="path2"
|
||||||
|
style="fill:#d9cfbe;fill-opacity:1;stroke-width:0.58790755"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
@ -6,16 +6,24 @@ from django_tables2.utils import A # alias for Accessor
|
|||||||
from .models import *
|
from .models import *
|
||||||
|
|
||||||
|
|
||||||
|
class ImageUrlColumn(tables.Column):
|
||||||
|
def render(self, value):
|
||||||
|
if value.url:
|
||||||
|
return value.url
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class RecipeTable(tables.Table):
|
class RecipeTable(tables.Table):
|
||||||
id = tables.LinkColumn('edit_recipe', args=[A('id')])
|
id = tables.LinkColumn('edit_recipe', args=[A('id')])
|
||||||
name = tables.LinkColumn('view_recipe', args=[A('id')])
|
name = tables.LinkColumn('view_recipe', args=[A('id')])
|
||||||
all_tags = tables.Column(
|
all_tags = tables.Column(
|
||||||
attrs={'td': {'class': 'd-none d-lg-table-cell'}, 'th': {'class': 'd-none d-lg-table-cell'}})
|
attrs={'td': {'class': 'd-none d-lg-table-cell'}, 'th': {'class': 'd-none d-lg-table-cell'}})
|
||||||
|
image = ImageUrlColumn()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Recipe
|
model = Recipe
|
||||||
template_name = 'generic/table_template.html'
|
template_name = 'recipes_table.html'
|
||||||
fields = ('id', 'name', 'all_tags')
|
fields = ('id', 'name', 'all_tags', 'image', 'instructions')
|
||||||
|
|
||||||
|
|
||||||
class KeywordTable(tables.Table):
|
class KeywordTable(tables.Table):
|
||||||
|
@ -54,20 +54,10 @@
|
|||||||
{% block extra_head %} <!-- block for templates to put stuff into header -->
|
{% block extra_head %} <!-- block for templates to put stuff into header -->
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
<style>
|
|
||||||
@media (max-width: 1025px) {
|
|
||||||
.container {
|
|
||||||
width: 95% !important;
|
|
||||||
margin-left: 20px !important;
|
|
||||||
margin-right: 20px !important;
|
|
||||||
max-width: 1200px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<nav class="navbar navbar-expand-lg navbar-dark bg-{% nav_color request %}" id="id_main_nav">
|
<nav class="navbar navbar-expand-lg navbar-dark bg-{% nav_color request %}" id="id_main_nav">
|
||||||
<!--<a class="navbar-brand" href="{% url 'index' %}">{% trans 'Cookbook' %}</a>-->
|
|
||||||
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText"
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText"
|
||||||
aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
|
aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
<span class="navbar-toggler-icon"></span>
|
<span class="navbar-toggler-icon"></span>
|
||||||
@ -168,13 +158,16 @@
|
|||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|
||||||
{% for message in messages %}
|
{% for message in messages %}
|
||||||
<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">
|
<div class="row">
|
||||||
{{ message }}
|
<div class="col col-md-12">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">
|
||||||
<span aria-hidden="true">×</span>
|
{{ message }}
|
||||||
</button>
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@
|
|||||||
{% block pagination %}
|
{% block pagination %}
|
||||||
{% if table.page and table.paginator.num_pages > 1 %}
|
{% if table.page and table.paginator.num_pages > 1 %}
|
||||||
<nav aria-label="Table navigation">
|
<nav aria-label="Table navigation">
|
||||||
<ul class="pagination justify-content-center">
|
<ul class="pagination justify-content-center flex-wrap">
|
||||||
{% if table.page.has_previous %}
|
{% if table.page.has_previous %}
|
||||||
{% block pagination.previous %}
|
{% block pagination.previous %}
|
||||||
<li class="previous page-item">
|
<li class="previous page-item">
|
||||||
|
@ -18,56 +18,62 @@
|
|||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% if filter %}
|
{% if filter %}
|
||||||
<form action="" method="get" id="search_form">
|
<div class="row">
|
||||||
{% csrf_token %}
|
<div class="col">
|
||||||
{{ form.non_field_errors }}
|
<form action="" method="get" id="search_form">
|
||||||
<div class="row">
|
{% csrf_token %}
|
||||||
<div class="col md-12">
|
{{ form.non_field_errors }}
|
||||||
<div class="input-group">
|
<div class="row">
|
||||||
<input type="text" class="form-control" placeholder="{% trans 'Search recipe ...' %}"
|
<div class="col md-12">
|
||||||
id="{{ filter.form.name.id_for_label }}" name="{{ filter.form.name.name }}"
|
<div class="input-group">
|
||||||
aria-describedby="button-addon4">
|
<input type="text" class="form-control" placeholder="{% trans 'Search recipe ...' %}"
|
||||||
|
id="{{ filter.form.name.id_for_label }}" name="{{ filter.form.name.name }}"
|
||||||
|
aria-describedby="button-addon4">
|
||||||
|
|
||||||
<div class="input-group-append">
|
<div class="input-group-append">
|
||||||
<button class="btn btn-primary" type="submit"><i class="fas fa-search"></i></button>
|
<button class="btn btn-primary" type="submit"><i class="fas fa-search"></i></button>
|
||||||
<button type="button" class="btn btn-light dropdown-toggle dropdown-toggle-split dropdown-toggle-no-arrow"
|
<button type="button"
|
||||||
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
class="btn btn-light dropdown-toggle dropdown-toggle-split dropdown-toggle-no-arrow"
|
||||||
<i class="fas fa-ellipsis-v"></i>
|
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
<span class="sr-only">Toggle Dropdown</span>
|
<i class="fas fa-ellipsis-v"></i>
|
||||||
</button>
|
<span class="sr-only">Toggle Dropdown</span>
|
||||||
<div class="dropdown-menu">
|
</button>
|
||||||
<button class="dropdown-item" type="button"
|
<div class="dropdown-menu">
|
||||||
onclick="location.href='{% url 'new_recipe' %}'"><i
|
<button class="dropdown-item" type="button"
|
||||||
class="fas fa-plus-circle fa-fw"></i> {% trans 'New Recipe' %}</button>
|
onclick="location.href='{% url 'new_recipe' %}'"><i
|
||||||
<button data-toggle="collapse" href="#collapse_adv_search"
|
class="fas fa-plus-circle fa-fw"></i> {% trans 'New Recipe' %}</button>
|
||||||
role="button" class="dropdown-item"
|
<button data-toggle="collapse" href="#collapse_adv_search"
|
||||||
aria-expanded="false" type="button"
|
role="button" class="dropdown-item"
|
||||||
aria-controls="collapse_adv_search"><i
|
aria-expanded="false" type="button"
|
||||||
class="fas fa-search-plus fa-fw"></i> {% trans 'Advanced Search' %}
|
aria-controls="collapse_adv_search"><i
|
||||||
</button>
|
class="fas fa-search-plus fa-fw"></i> {% trans 'Advanced Search' %}
|
||||||
<button class="dropdown-item" type="button"
|
</button>
|
||||||
onclick="window.location = window.location.pathname;"><i
|
<button class="dropdown-item" type="button"
|
||||||
class="fas fa-sync fa-fw"></i> {% trans 'Reset Search' %}</button>
|
onclick="window.location = window.location.pathname;"><i
|
||||||
|
class="fas fa-sync fa-fw"></i> {% trans 'Reset Search' %}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="collapse col-md-12" id="collapse_adv_search">
|
<div class="collapse col-md-12" id="collapse_adv_search">
|
||||||
<div style="margin-top: 1vh">
|
<div style="margin-top: 1vh">
|
||||||
{{ filter.form.keywords | as_crispy_field }}
|
{{ filter.form.keywords | as_crispy_field }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ filter.form.ingredients | as_crispy_field }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ filter.form.internal | as_crispy_field }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
</form>
|
||||||
{{ filter.form.ingredients | as_crispy_field }}
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
{{ filter.form.internal | as_crispy_field }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</div>
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
|
87
cookbook/templates/recipes_table.html
Normal file
87
cookbook/templates/recipes_table.html
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load django_tables2 %}
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<div class="table-container">
|
||||||
|
{% block table %}
|
||||||
|
<table {% render_attrs table.attrs class="table" %}>
|
||||||
|
{% for row in table.paginated_rows %}
|
||||||
|
<div class="card">
|
||||||
|
<div class="row no-gutters">
|
||||||
|
<div class="col-md-4">
|
||||||
|
{% if row.cells.image|length > 1 %}
|
||||||
|
<img src="{{ row.cells.image }}" class="card-img"
|
||||||
|
alt="{% trans 'Recipe Image' %}"
|
||||||
|
style="height: 100%;">
|
||||||
|
{% else %}
|
||||||
|
<img src="{% static 'recipe_no_image.svg' %}" class="card-img"
|
||||||
|
alt="{% trans 'Recipe Image' %}" style="height: 100%;">
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="col-md-8">
|
||||||
|
<div class="card-body">
|
||||||
|
<h5 class="card-title">{{ row.cells.name }}</h5>
|
||||||
|
<p class="card-text">This is a wider card with supporting text below as a
|
||||||
|
natural
|
||||||
|
lead-in to additional content. This content is a little bit longer.</p>
|
||||||
|
<p class="card-text"><small class="text-muted">Last updated 3 mins
|
||||||
|
ago</small></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</table>
|
||||||
|
{% endblock table %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% block pagination %}
|
||||||
|
{% if table.page and table.paginator.num_pages > 1 %}
|
||||||
|
<nav aria-label="Table navigation">
|
||||||
|
<ul class="pagination justify-content-center flex-wrap">
|
||||||
|
{% if table.page.has_previous %}
|
||||||
|
{% block pagination.previous %}
|
||||||
|
<li class="previous page-item">
|
||||||
|
<a href="{% querystring table.prefixed_page_field=table.page.previous_page_number %}"
|
||||||
|
class="page-link">
|
||||||
|
<span aria-hidden="true">«</span>
|
||||||
|
{% trans 'previous' %}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endblock pagination.previous %}
|
||||||
|
{% endif %}
|
||||||
|
{% if table.page.has_previous or table.page.has_next %}
|
||||||
|
{% block pagination.range %}
|
||||||
|
{% for p in table.page|table_page_range:table.paginator %}
|
||||||
|
<li class="page-item{% if table.page.number == p %} active{% endif %}">
|
||||||
|
<a class="page-link"
|
||||||
|
{% if p != '...' %}href="{% querystring table.prefixed_page_field=p %}"{% endif %}>
|
||||||
|
{{ p }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
{% endblock pagination.range %}
|
||||||
|
{% endif %}
|
||||||
|
{% if table.page.has_next %}
|
||||||
|
{% block pagination.next %}
|
||||||
|
<li class="next page-item">
|
||||||
|
<a href="{% querystring table.prefixed_page_field=table.page.next_page_number %}"
|
||||||
|
class="page-link">
|
||||||
|
{% trans 'next' %}
|
||||||
|
<span aria-hidden="true">»</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endblock pagination.next %}
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock pagination %}
|
||||||
|
{% endblock content %}
|
@ -5,10 +5,12 @@
|
|||||||
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col col-12">
|
||||||
|
<h3>{% trans 'Statistics' %} </h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h3>
|
|
||||||
{% trans 'Statistics' %}
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
@ -37,7 +39,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<ul class="list-group list-group-flush">
|
<ul class="list-group list-group-flush">
|
||||||
<li class="list-group-item">{% trans 'Recipes without Keywords' %} : <span
|
<li class="list-group-item">{% trans 'Recipes without Keywords' %} : <span
|
||||||
class="badge badge-pill badge-info">{{ counts.recipes_no_keyword}}</span></li>
|
class="badge badge-pill badge-info">{{ counts.recipes_no_keyword }}</span></li>
|
||||||
<li class="list-group-item">{% trans 'External Recipes' %} : <span
|
<li class="list-group-item">{% trans 'External Recipes' %} : <span
|
||||||
class="badge badge-pill badge-info">{{ counts.recipes_external }}</span></li>
|
class="badge badge-pill badge-info">{{ counts.recipes_external }}</span></li>
|
||||||
<li class="list-group-item">{% trans 'Internal Recipes' %} : <span
|
<li class="list-group-item">{% trans 'Internal Recipes' %} : <span
|
||||||
|
@ -1,24 +1,224 @@
|
|||||||
|
{% load static %}
|
||||||
|
{% load i18n %}
|
||||||
{% extends "base.html" %}
|
{% load theming_tags %}
|
||||||
|
{% load django_tables2 %}
|
||||||
{% load crispy_forms_tags %}
|
{% load crispy_forms_tags %}
|
||||||
|
|
||||||
{% block content %}
|
<html>
|
||||||
<form>
|
<head>
|
||||||
<div class="form-group">
|
<title>{% block title %}
|
||||||
<label for="exampleInputEmail1">Email address</label>
|
{% endblock %}</title>
|
||||||
<input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp"
|
<meta charset="utf-8">
|
||||||
placeholder="Enter email">
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
<small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
|
|
||||||
|
<!-- Bootstrap 4 -->
|
||||||
|
<link id="id_main_css" href="{% static 'themes/bootstrap.min.css' %}" rel="stylesheet">
|
||||||
|
<script src="https://code.jquery.com/jquery-3.4.1.js"
|
||||||
|
integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
|
||||||
|
crossorigin="anonymous"></script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
@media (max-width: 1025px) {
|
||||||
|
.container {
|
||||||
|
width: 95% !important;
|
||||||
|
margin-left: 20px !important;
|
||||||
|
margin-right: 20px !important;
|
||||||
|
max-width: 1200px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-dark bg-{% nav_color request %}" id="id_main_nav">
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText"
|
||||||
|
aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbarText">
|
||||||
|
<ul class="navbar-nav mr-auto">
|
||||||
|
<li class="nav-item {% if request.resolver_match.url_name in 'view_search,edit_recipe,edit_internal_recipe,edit_external_recipe,view_recipe' %}active{% endif %}">
|
||||||
|
<a class="nav-link" href="{% url 'view_search' %}"><i
|
||||||
|
class="fas fa-book"></i> {% trans 'Cookbook' %}<span
|
||||||
|
class="sr-only">(current)</span></a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="nav-item dropdown {% if request.resolver_match.url_name in 'view_books,view_plan,view_shopping,list_ingredient' %}active{% endif %}">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
|
||||||
|
aria-haspopup="true" aria-expanded="false">
|
||||||
|
<i class="fas fa-mortar-pestle"></i> {% trans 'Utensils' %}
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
|
||||||
|
<a class="dropdown-item" href="{% url 'view_books' %}"><i
|
||||||
|
class="fas fa-bookmark fa-fw"></i> {% trans 'Books' %}
|
||||||
|
</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'view_plan' %}"><i
|
||||||
|
class="fas fa-calendar fa-fw"></i> {% trans 'Meal-Plan' %}
|
||||||
|
</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'view_shopping' %}"><i
|
||||||
|
class="fas fa-shopping-cart fa-fw"></i> {% trans 'Shopping' %}
|
||||||
|
</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'list_ingredient' %}"><i
|
||||||
|
class="fas fa-leaf fa-fw"></i> {% trans 'Ingredients' %}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item dropdown {% if request.resolver_match.url_name in 'list_keyword,data_batch_edit' %}active{% endif %}">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
|
||||||
|
aria-haspopup="true" aria-expanded="false">
|
||||||
|
<i class="fas fa-tags"></i> {% trans 'Tags' %}
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
|
||||||
|
<a class="dropdown-item" href="{% url 'list_keyword' %}"><i
|
||||||
|
class="fas fa-tags fa-fw"></i> {% trans 'Keyword' %}</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'data_batch_edit' %}"><i
|
||||||
|
class="fas fa-edit fa-fw"></i> {% trans 'Batch Edit' %}</a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item dropdown {% if request.resolver_match.url_name in 'list_storage,data_sync,list_recipe_import,list_sync_log,data_stats,edit_ingredient' %}active{% endif %}">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
|
||||||
|
aria-haspopup="true" aria-expanded="false"><i class="fas fa-database"></i> {% trans 'Storage Data' %}
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
|
||||||
|
<a class="dropdown-item" href="{% url 'list_storage' %}"><i
|
||||||
|
class="fas fa-database fa-fw"></i> {% trans 'Storage Backends' %}</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'data_sync' %}"><i
|
||||||
|
class="fas fa-sync-alt fa-fw"></i> {% trans 'Configure Sync' %}</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'list_recipe_import' %}"><i
|
||||||
|
class="far fa-file-alt fa-fw"></i> {% trans 'Discovered Recipes' %}</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'list_sync_log' %}"><i
|
||||||
|
class="fas fa-history fa-fw"></i> {% trans 'Discovery Log' %}</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'data_stats' %}"><i
|
||||||
|
class="fas fa-chart-line fa-fw"></i> {% trans 'Statistics' %}</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'edit_ingredient' %}"><i
|
||||||
|
class="fas fa-balance-scale fa-fw"></i> {% trans 'Units & Ingredients' %}</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'view_import' %}"><i
|
||||||
|
class="fas fa-file-import"></i> {% trans 'Import Recipe' %}</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<ul class="navbar-nav ml-auto">
|
||||||
|
{% if user.is_authenticated %}
|
||||||
|
<li class="nav-item dropdown {% if request.resolver_match.url_name in 'view_settings' %}active{% endif %}">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
|
||||||
|
aria-haspopup="true" aria-expanded="false"><i
|
||||||
|
class="fas fa-user-alt"></i> {{ user.get_user_name }}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownMenuLink">
|
||||||
|
<a class="dropdown-item" href="{% url 'view_settings' %}"><i
|
||||||
|
class="fas fa-user-cog fa-fw"></i> {% trans 'Settings' %}</a>
|
||||||
|
{% if user.is_superuser %}
|
||||||
|
<a class="dropdown-item" href="{% url 'admin:index' %}"><i
|
||||||
|
class="fas fa-user-shield fa-fw"></i> {% trans 'Admin' %}</a>
|
||||||
|
{% endif %}
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
<a class="dropdown-item" href="{% url 'logout' %}"><i
|
||||||
|
class="fas fa-sign-out-alt fa-fw"></i> {% trans 'Logout' %}</a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{% url 'login' %}">{% trans 'Login' %} <i class="fas fa-sign-in-alt"></i></a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="container" style="background: #ffff00">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<form action="" method="get" id="search_form">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form.non_field_errors }}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col md-12">
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="text" class="form-control" placeholder="{% trans 'Search recipe ...' %}"
|
||||||
|
id="{{ filter.form.name.id_for_label }}" name="{{ filter.form.name.name }}"
|
||||||
|
aria-describedby="button-addon4">
|
||||||
|
|
||||||
|
<div class="input-group-append">
|
||||||
|
<button class="btn btn-primary" type="submit"><i class="fas fa-search"></i></button>
|
||||||
|
<button type="button"
|
||||||
|
class="btn btn-light dropdown-toggle dropdown-toggle-split dropdown-toggle-no-arrow"
|
||||||
|
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<i class="fas fa-ellipsis-v"></i>
|
||||||
|
<span class="sr-only">Toggle Dropdown</span>
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
<button class="dropdown-item" type="button"
|
||||||
|
onclick="location.href='{% url 'new_recipe' %}'"><i
|
||||||
|
class="fas fa-plus-circle fa-fw"></i> {% trans 'New Recipe' %}</button>
|
||||||
|
<button data-toggle="collapse" href="#collapse_adv_search"
|
||||||
|
role="button" class="dropdown-item"
|
||||||
|
aria-expanded="false" type="button"
|
||||||
|
aria-controls="collapse_adv_search"><i
|
||||||
|
class="fas fa-search-plus fa-fw"></i> {% trans 'Advanced Search' %}
|
||||||
|
</button>
|
||||||
|
<button class="dropdown-item" type="button"
|
||||||
|
onclick="window.location = window.location.pathname;"><i
|
||||||
|
class="fas fa-sync fa-fw"></i> {% trans 'Reset Search' %}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="collapse col-md-12" id="collapse_adv_search">
|
||||||
|
<div style="margin-top: 1vh">
|
||||||
|
{{ filter.form.keywords | as_crispy_field }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ filter.form.ingredients | as_crispy_field }}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ filter.form.internal | as_crispy_field }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
</div>
|
||||||
<label for="exampleInputPassword1">Password</label>
|
|
||||||
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<div class="table-container">
|
||||||
|
|
||||||
|
<table>
|
||||||
|
|
||||||
|
<div class="card">
|
||||||
|
<div class="row no-gutters">
|
||||||
|
<div class="col-md-4">
|
||||||
|
|
||||||
|
<img src="{% static 'recipe_no_image.svg' %}" class="card-img"
|
||||||
|
alt="{% trans 'Recipe Image' %}" style="height: 100%;">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-md-8">
|
||||||
|
<div class="card-body">
|
||||||
|
<h5 class="card-title">Test</h5>
|
||||||
|
<p class="card-text">This is a wider card with supporting text below as a
|
||||||
|
natural
|
||||||
|
lead-in to additional content. This content is a little bit longer.</p>
|
||||||
|
<p class="card-text"><small class="text-muted">Last updated 3 mins
|
||||||
|
ago</small></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
</div>
|
||||||
<input type="checkbox" class="form-check-input" id="exampleCheck1">
|
</div>
|
||||||
<label class="form-check-label" for="exampleCheck1">Check me out</label>
|
</body>
|
||||||
</div>
|
</html>
|
||||||
<button type="submit" class="btn btn-primary">Submit</button>
|
|
||||||
</form>
|
|
||||||
{% endblock %}
|
|
@ -31,6 +31,7 @@ SESSION_COOKIE_AGE = 365 * 60 * 24 * 60
|
|||||||
|
|
||||||
CRISPY_TEMPLATE_PACK = 'bootstrap4'
|
CRISPY_TEMPLATE_PACK = 'bootstrap4'
|
||||||
DJANGO_TABLES2_TEMPLATE = 'cookbook/templates/generic/table_template.html'
|
DJANGO_TABLES2_TEMPLATE = 'cookbook/templates/generic/table_template.html'
|
||||||
|
DJANGO_TABLES2_PAGE_RANGE = 8
|
||||||
|
|
||||||
MESSAGE_TAGS = {
|
MESSAGE_TAGS = {
|
||||||
messages.ERROR: 'danger'
|
messages.ERROR: 'danger'
|
||||||
|
Loading…
Reference in New Issue
Block a user