Convert onSwap widgets to custom elements (issue #18)
Replaces the four onSwap-based widgets with TypeScript custom elements following the pattern from PR #16. Each widget gets a class extending HTMLElement with connectedCallback/disconnectedCallback, typed props via register_element + gen_element_types codegen, and lives in ts/elements/. - range-slider: RangeSliderElement; Python uses _RangeSlider builder - date-range-picker: DateRangePickerElement; Python uses _DateRangePicker builder - search-select: SearchSelectElement; Python uses _SearchSelect builder; data-* attrs become plain attrs (data-name -> name, data-search-url -> search-url, etc.) - filter-bar: FilterBarElement; props carry preset URLs; onclick/onsubmit attrs replaced with data-filter-bar-* sentinel attrs; all window.* globals removed Deletes ts/range_slider.ts, ts/search_select.ts, ts/date_range_picker.ts, ts/filter_bar.ts. Updates all tests and e2e pages to use the new element selectors and script paths (dist/elements/<tag>.js). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -555,8 +555,8 @@ class TestFilterBarRendering:
|
||||
|
||||
def test_status_uses_filter_select(self):
|
||||
html = str(FilterBar())
|
||||
assert 'data-search-select-mode="filter"' in html
|
||||
assert 'data-name="status"' in html
|
||||
assert 'filter-mode="true"' in html
|
||||
assert 'name="status"' in html
|
||||
|
||||
def test_mastered_not_checked_by_default(self):
|
||||
html = str(FilterBar(filter_json=""))
|
||||
@@ -602,13 +602,13 @@ class TestFilterBarRendering:
|
||||
def test_platform_uses_search_url(self):
|
||||
"""Platform is model-backed: rows are fetched, not pre-rendered."""
|
||||
html = str(FilterBar())
|
||||
assert 'data-search-url="/api/platforms/search"' in html
|
||||
assert 'search-url="/api/platforms/search"' in html
|
||||
|
||||
def test_status_has_no_modifiers(self):
|
||||
"""Non-nullable fields should not show (None) but MUST show (Any)."""
|
||||
html = str(FilterBar())
|
||||
status_start = html.find('data-name="status"')
|
||||
platform_start = html.find('data-name="platform"')
|
||||
status_start = html.find('name="status"')
|
||||
platform_start = html.find('name="platform"')
|
||||
status_section = html[status_start:platform_start]
|
||||
# Must have (Any) — always available
|
||||
assert "(Any)" in status_section
|
||||
@@ -618,7 +618,7 @@ class TestFilterBarRendering:
|
||||
def test_platform_has_modifiers(self):
|
||||
"""Nullable ForeignKey fields should show (Any)/(None)."""
|
||||
html = str(FilterBar())
|
||||
platform_start = html.find('data-name="platform"')
|
||||
platform_start = html.find('name="platform"')
|
||||
platform_section = html[platform_start:]
|
||||
# Should have at least one modifier option
|
||||
assert "(Any)" in platform_section or "(None)" in platform_section
|
||||
|
||||
Reference in New Issue
Block a user