diff --git a/common/components/filters.py b/common/components/filters.py index e25038e..9883557 100644 --- a/common/components/filters.py +++ b/common/components/filters.py @@ -208,13 +208,21 @@ def _filter_mins_to_hrs(val) -> str: return str(int(hrs)) if hrs == int(hrs) else f"{hrs:.1f}" -def _filter_field(label: str, widget) -> SafeText: - """A labelled filter field:
{widget}
.""" +def _filter_field(label: str, widget, for_widget: str = None) -> SafeText: + """A labelled filter field:
{widget}
. + TODO: Use widget.attributes.get("id", "") to get the widget's ID + instead of the superfluous "for" argument. This requires refactoring + the Component function to be a class intead. + Also see RangeSlider's TODO + """ return Div( attributes=[("class", "flex flex-col gap-1")], children=[ Label( - attributes=[("class", _FILTER_LABEL_CLASS)], + attributes=[ + ("class", _FILTER_LABEL_CLASS), + ("for", for_widget), + ], children=[label], ), widget, @@ -292,13 +300,14 @@ def RangeSlider( Div( attributes=[("class", "flex items-center gap-2 mb-1")], children=[ - Label( - attributes=[ - ("class", _FILTER_LABEL_CLASS), - ("for", min_input_id), - ], - children=[label], - ), + # TODO: This should be done outside the RangeSlider component, but the current Component function doesn't allow getting the id + # Label( + # attributes=[ + # ("class", _FILTER_LABEL_CLASS), + # ("for", min_input_id), + # ], + # children=[label], + # ), Input( attributes=[ ("type", "number"), @@ -781,28 +790,172 @@ def FilterBar( placeholder="Type a note substring…", ), ), + _filter_field( + "Year", + RangeSlider( + label="Year", + input_name_prefix="filter-year", + min_value=year_min, + max_value=year_max, + range_min=year_range_min, + range_max=year_range_max, + min_placeholder="e.g. 2020", + max_placeholder="e.g. 2024", + ), + ), + _filter_field( + "Original Year", + RangeSlider( + label="Original Year", + input_name_prefix="filter-original-year", + min_value=original_year_min, + max_value=original_year_max, + range_min=original_year_range_min, + range_max=original_year_range_max, + min_placeholder="e.g. 1985", + max_placeholder="e.g. 2010", + ), + ), + _filter_field( + "Total playtime", + RangeSlider( + label="Total playtime", + input_name_prefix="filter-playtime", + min_value=playtime_min, + max_value=playtime_max, + range_min=0, + range_max=playtime_range_max, + step="1", + min_placeholder="e.g. 1", + max_placeholder="e.g. 100", + ), + ), + _filter_field( + "Manual Playtime (mins)", + RangeSlider( + label="Manual Playtime (mins)", + input_name_prefix="filter-manual-playtime-minutes", + min_value=manual_pt_min, + max_value=manual_pt_max, + range_min=0, + range_max=max(playtime_range_max * 60, 240), + step="1", + min_placeholder="e.g. 10", + max_placeholder="e.g. 120", + ), + ), + _filter_field( + "Calculated Playtime (mins)", + RangeSlider( + label="Calculated Playtime (mins)", + input_name_prefix="filter-calculated-playtime-minutes", + min_value=calc_pt_min, + max_value=calc_pt_max, + range_min=0, + range_max=max(playtime_range_max * 60, 240), + step="1", + min_placeholder="e.g. 30", + max_placeholder="e.g. 120", + ), + ), + _filter_field( + "Calculated Playtime (mins)", + RangeSlider( + label="Calculated Playtime (mins)", + input_name_prefix="filter-calculated-playtime-minutes", + min_value=calc_pt_min, + max_value=calc_pt_max, + range_min=0, + range_max=max(playtime_range_max * 60, 240), + step="1", + min_placeholder="e.g. 30", + max_placeholder="e.g. 180", + ), + ), + _filter_field( + "Session Count", + RangeSlider( + label="Session Count", + input_name_prefix="filter-session-count", + min_value=session_count_min, + max_value=session_count_max, + range_min=0, + range_max=100, + step="1", + min_placeholder="e.g. 1", + max_placeholder="e.g. 50", + ), + ), + _filter_field( + "Average Session Duration (mins)", + RangeSlider( + label="Average Session Duration (mins)", + input_name_prefix="filter-session-average", + min_value=session_avg_min, + max_value=session_avg_max, + range_min=0, + range_max=240, + step="1", + min_placeholder="e.g. 10", + max_placeholder="e.g. 120", + ), + ), + _filter_field( + "Number of Purchases", + RangeSlider( + label="Number of Purchases", + input_name_prefix="filter-purchase-count", + min_value=purchase_count_min, + max_value=purchase_count_max, + range_min=0, + range_max=20, + step="1", + min_placeholder="e.g. 1", + max_placeholder="e.g. 5", + ), + ), + _filter_field( + "Number of Play Events", + RangeSlider( + label="Number of Play Events", + input_name_prefix="filter-playevent-count", + min_value=playevent_count_min, + max_value=playevent_count_max, + range_min=0, + range_max=20, + step="1", + min_placeholder="e.g. 1", + max_placeholder="e.g. 5", + ), + ), + _filter_field( + "Total Purchase Price", + RangeSlider( + label="Total Purchase Price", + input_name_prefix="filter-purchase-price-total", + min_value=price_total_min, + max_value=price_total_max, + range_min=price_range_min, + range_max=price_range_max, + min_placeholder="0", + max_placeholder=str(price_range_max), + ), + ), + _filter_field( + "Any Purchase Price", + RangeSlider( + label="Any Purchase Price", + input_name_prefix="filter-purchase-price-any", + min_value=price_any_min, + max_value=price_any_max, + range_min=price_range_min, + range_max=price_range_max, + min_placeholder="0", + max_placeholder=str(price_range_max), + ), + ), ], ), - RangeSlider( - label="Year", - input_name_prefix="filter-year", - min_value=year_min, - max_value=year_max, - range_min=year_range_min, - range_max=year_range_max, - min_placeholder="e.g. 2020", - max_placeholder="e.g. 2024", - ), - RangeSlider( - label="Original Year", - input_name_prefix="filter-original-year", - min_value=original_year_min, - max_value=original_year_max, - range_min=original_year_range_min, - range_max=original_year_range_max, - min_placeholder="e.g. 1985", - max_placeholder="e.g. 2010", - ), Div( attributes=[("class", "flex items-end gap-4 mb-4 flex-wrap")], children=[ @@ -818,103 +971,6 @@ def FilterBar( ), ], ), - RangeSlider( - label="Total playtime", - input_name_prefix="filter-playtime", - min_value=playtime_min, - max_value=playtime_max, - range_min=0, - range_max=playtime_range_max, - step="1", - min_placeholder="e.g. 1", - max_placeholder="e.g. 100", - ), - RangeSlider( - label="Manual Playtime (mins)", - input_name_prefix="filter-manual-playtime-minutes", - min_value=manual_pt_min, - max_value=manual_pt_max, - range_min=0, - range_max=max(playtime_range_max * 60, 240), - step="1", - min_placeholder="e.g. 10", - max_placeholder="e.g. 120", - ), - RangeSlider( - label="Calculated Playtime (mins)", - input_name_prefix="filter-calculated-playtime-minutes", - min_value=calc_pt_min, - max_value=calc_pt_max, - range_min=0, - range_max=max(playtime_range_max * 60, 240), - step="1", - min_placeholder="e.g. 30", - max_placeholder="e.g. 180", - ), - RangeSlider( - label="Session Count", - input_name_prefix="filter-session-count", - min_value=session_count_min, - max_value=session_count_max, - range_min=0, - range_max=100, - step="1", - min_placeholder="e.g. 1", - max_placeholder="e.g. 50", - ), - RangeSlider( - label="Average Session Duration (mins)", - input_name_prefix="filter-session-average", - min_value=session_avg_min, - max_value=session_avg_max, - range_min=0, - range_max=240, - step="1", - min_placeholder="e.g. 10", - max_placeholder="e.g. 120", - ), - RangeSlider( - label="Number of Purchases", - input_name_prefix="filter-purchase-count", - min_value=purchase_count_min, - max_value=purchase_count_max, - range_min=0, - range_max=20, - step="1", - min_placeholder="e.g. 1", - max_placeholder="e.g. 5", - ), - RangeSlider( - label="Number of Play Events", - input_name_prefix="filter-playevent-count", - min_value=playevent_count_min, - max_value=playevent_count_max, - range_min=0, - range_max=20, - step="1", - min_placeholder="e.g. 1", - max_placeholder="e.g. 5", - ), - RangeSlider( - label="Total Purchase Price", - input_name_prefix="filter-purchase-price-total", - min_value=price_total_min, - max_value=price_total_max, - range_min=price_range_min, - range_max=price_range_max, - min_placeholder="0", - max_placeholder=str(price_range_max), - ), - RangeSlider( - label="Any Purchase Price", - input_name_prefix="filter-purchase-price-any", - min_value=price_any_min, - max_value=price_any_max, - range_min=price_range_min, - range_max=price_range_max, - min_placeholder="0", - max_placeholder=str(price_range_max), - ), ] return _filter_bar(fields, filter_json, preset_list_url, preset_save_url)