diff --git a/datasette/templates/query_list.html b/datasette/templates/query_list.html
index af974550..dbd607ab 100644
--- a/datasette/templates/query_list.html
+++ b/datasette/templates/query_list.html
@@ -2,6 +2,155 @@
{% block title %}{% if database %}{{ database }}: {% endif %}queries{% endblock %}
+{% block extra_head %}
+{{- super() -}}
+
+{% endblock %}
+
{% block body_class %}query-list{% if database %} db-{{ database|to_css_class }}{% endif %}{% endblock %}
{% block crumbs %}
@@ -10,49 +159,66 @@
{% block content %}
-
-
{% if queries %}
-
- {% for query in queries %}
- -
- {% if show_database %}
- {{ query.database }}:
- {% endif %}
- {{ query.title or query.name }}{% if query.private %} 🔒{% endif %}
- {% if query.is_write %}Writable{% endif %}
- {% if query.is_published %}Published{% endif %}
-
- {% endfor %}
-
+
+
+
+ {% if show_database %}| Database | {% endif %}
+ Query |
+ Mode |
+ Publication |
+
+
+
+ {% for query in queries %}
+
+ {% if show_database %}
+ | {{ query.database }} |
+ {% endif %}
+
+ {{ query.title or query.name }}{% if query.private %} 🔒{% endif %}
+ {% if query.description %} {{ query.description }} {% endif %}
+ |
+ {% if query.is_write %}Writable{% else %}Read-only{% endif %} |
+ {% if query.is_published %}Published{% else %}Unpublished{% endif %} |
+
+ {% endfor %}
+
+
{% else %}
No queries found.
{% endif %}
{% if next_url %}
-
Next page
+
{% endif %}
+
+
{% endblock %}
diff --git a/datasette/views/database.py b/datasette/views/database.py
index de02cd0f..3c660bc7 100644
--- a/datasette/views/database.py
+++ b/datasette/views/database.py
@@ -487,9 +487,9 @@ def _as_optional_bool(value, name):
raise QueryValidationError("{} must be 0 or 1".format(name))
-def _query_list_limit(value):
+def _query_list_limit(value, default=50):
if value in (None, ""):
- return 50
+ return default
try:
return min(max(1, int(value)), 1000)
except ValueError as ex:
@@ -1136,7 +1136,10 @@ class QueryListView(BaseView):
database = await self.database_name(request)
format_ = request.url_vars.get("format") or "html"
try:
- limit = _query_list_limit(request.args.get("_size"))
+ limit = _query_list_limit(
+ request.args.get("_size"),
+ default=20 if format_ == "html" else 50,
+ )
is_write = _as_optional_bool(request.args.get("is_write"), "is_write")
is_published = _as_optional_bool(
request.args.get("is_published"), "is_published"
@@ -1175,6 +1178,9 @@ class QueryListView(BaseView):
data = {
"ok": True,
"database": database,
+ "database_color": (
+ self.ds.get_database(database).color if database is not None else None
+ ),
"queries": page["queries"],
"next": page["next"],
"next_url": next_url,
diff --git a/tests/test_queries.py b/tests/test_queries.py
index c31d7205..b7416ac7 100644
--- a/tests/test_queries.py
+++ b/tests/test_queries.py
@@ -451,12 +451,34 @@ async def test_query_list_search_filter_and_html():
assert html_response.status_code == 200
assert "Demo query 02" in html_response.text
assert "Demo query 01" not in html_response.text
+ assert 'class="query-list-results"' in html_response.text
+ assert "