?_facet_size=max, ... now links to that, closes #1337

Refs #1332
This commit is contained in:
Simon Willison 2021-05-27 09:00:58 -07:00
commit 7e983fede6
5 changed files with 86 additions and 13 deletions

View file

@ -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)

View file

@ -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 {

View file

@ -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>

View file

@ -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,

View file

@ -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