mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
parent
51d7881140
commit
7e983fede6
5 changed files with 86 additions and 13 deletions
|
|
@ -105,7 +105,9 @@ class Facet:
|
||||||
facet_size = self.ds.setting("default_facet_size")
|
facet_size = self.ds.setting("default_facet_size")
|
||||||
max_returned_rows = self.ds.setting("max_returned_rows")
|
max_returned_rows = self.ds.setting("max_returned_rows")
|
||||||
custom_facet_size = self.request.args.get("_facet_size")
|
custom_facet_size = self.request.args.get("_facet_size")
|
||||||
if custom_facet_size and custom_facet_size.isdigit():
|
if custom_facet_size == "max":
|
||||||
|
facet_size = max_returned_rows
|
||||||
|
elif custom_facet_size and custom_facet_size.isdigit():
|
||||||
facet_size = int(custom_facet_size)
|
facet_size = int(custom_facet_size)
|
||||||
return min(facet_size, max_returned_rows)
|
return min(facet_size, max_returned_rows)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -645,13 +645,20 @@ form button[type=button] {
|
||||||
.facet-info a.cross:active {
|
.facet-info a.cross:active {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
ul li.facet-truncated {
|
||||||
|
list-style-type: none;
|
||||||
|
position: relative;
|
||||||
|
top: -0.35em;
|
||||||
|
text-indent: 0.85em;
|
||||||
|
}
|
||||||
|
|
||||||
.advanced-export {
|
.advanced-export {
|
||||||
margin-top: 1em;
|
margin-top: 1em;
|
||||||
padding: 0.01em 2em 0.01em 1em;
|
padding: 0.01em 2em 0.01em 1em;
|
||||||
width: auto;
|
width: auto;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
box-shadow: 1px 2px 8px 2px rgba(0,0,0,0.08);
|
box-shadow: 1px 2px 8px 2px rgba(0,0,0,0.08);
|
||||||
background-color: white;
|
background-color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.download-sqlite em {
|
.download-sqlite em {
|
||||||
|
|
|
||||||
|
|
@ -162,7 +162,9 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if facet_info.truncated %}
|
{% if facet_info.truncated %}
|
||||||
<li>...</li>
|
<li class="facet-truncated">{% if request.args._facet_size != "max" -%}
|
||||||
|
<a href="{{ path_with_replaced_args(request, {"_facet_size": "max"}) }}">…</a>{% else -%}…{% endif %}
|
||||||
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -129,16 +129,16 @@ def make_app_client(
|
||||||
files.append(extra_filepath)
|
files.append(extra_filepath)
|
||||||
os.chdir(os.path.dirname(filepath))
|
os.chdir(os.path.dirname(filepath))
|
||||||
config = config or {}
|
config = config or {}
|
||||||
config.update(
|
for key, value in {
|
||||||
{
|
"default_page_size": 50,
|
||||||
"default_page_size": 50,
|
"max_returned_rows": max_returned_rows or 100,
|
||||||
"max_returned_rows": max_returned_rows or 100,
|
"sql_time_limit_ms": sql_time_limit_ms or 200,
|
||||||
"sql_time_limit_ms": sql_time_limit_ms or 200,
|
# Default is 3 but this results in "too many open files"
|
||||||
# Default is 3 but this results in "too many open files"
|
# errors when running the full test suite:
|
||||||
# errors when running the full test suite:
|
"num_sql_threads": 1,
|
||||||
"num_sql_threads": 1,
|
}.items():
|
||||||
}
|
if key not in config:
|
||||||
)
|
config[key] = value
|
||||||
ds = Datasette(
|
ds = Datasette(
|
||||||
files,
|
files,
|
||||||
immutables=immutables,
|
immutables=immutables,
|
||||||
|
|
|
||||||
|
|
@ -1612,3 +1612,65 @@ def test_navigation_menu_links(
|
||||||
assert (
|
assert (
|
||||||
details.find("a", {"href": link}) is None
|
details.find("a", {"href": link}) is None
|
||||||
), f"{link} found but should not have been in nav menu"
|
), f"{link} found but should not have been in nav menu"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"max_returned_rows,path,expected_num_facets,expected_ellipses,expected_ellipses_url",
|
||||||
|
(
|
||||||
|
(
|
||||||
|
5,
|
||||||
|
# Default should show 2 facets
|
||||||
|
"/fixtures/facetable?_facet=neighborhood",
|
||||||
|
2,
|
||||||
|
True,
|
||||||
|
"/fixtures/facetable?_facet=neighborhood&_facet_size=max",
|
||||||
|
),
|
||||||
|
# _facet_size above max_returned_rows should show max_returned_rows (5)
|
||||||
|
(
|
||||||
|
5,
|
||||||
|
"/fixtures/facetable?_facet=neighborhood&_facet_size=50",
|
||||||
|
5,
|
||||||
|
True,
|
||||||
|
"/fixtures/facetable?_facet=neighborhood&_facet_size=max",
|
||||||
|
),
|
||||||
|
# If max_returned_rows is high enough, should return all
|
||||||
|
(
|
||||||
|
20,
|
||||||
|
"/fixtures/facetable?_facet=neighborhood&_facet_size=max",
|
||||||
|
14,
|
||||||
|
False,
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
# If num facets > max_returned_rows, show ... without a link
|
||||||
|
# _facet_size above max_returned_rows should show max_returned_rows (5)
|
||||||
|
(
|
||||||
|
5,
|
||||||
|
"/fixtures/facetable?_facet=neighborhood&_facet_size=max",
|
||||||
|
5,
|
||||||
|
True,
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
def test_facet_more_links(
|
||||||
|
max_returned_rows,
|
||||||
|
path,
|
||||||
|
expected_num_facets,
|
||||||
|
expected_ellipses,
|
||||||
|
expected_ellipses_url,
|
||||||
|
):
|
||||||
|
with make_app_client(
|
||||||
|
config={"max_returned_rows": max_returned_rows, "default_facet_size": 2}
|
||||||
|
) as client:
|
||||||
|
response = client.get(path)
|
||||||
|
soup = Soup(response.body, "html.parser")
|
||||||
|
lis = soup.select("#facet-neighborhood ul li:not(.facet-truncated)")
|
||||||
|
facet_truncated = soup.select_one(".facet-truncated")
|
||||||
|
assert len(lis) == expected_num_facets
|
||||||
|
if not expected_ellipses:
|
||||||
|
assert facet_truncated is None
|
||||||
|
else:
|
||||||
|
if expected_ellipses_url:
|
||||||
|
assert facet_truncated.find("a")["href"] == expected_ellipses_url
|
||||||
|
else:
|
||||||
|
assert facet_truncated.find("a") is None
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue