Fill in the scaffolded file-tree filter:
- FS_FILTER_GROUPS: Identifiers, PLMN selection, Provider names,
WLAN/I-WLAN, SMS-related and CB-related (cell broadcast), each with
its exact file list; plus one option per file-backed feature of
SERVICES_FS_MAP (svc:<feature>).
- "All" is the default and exclusive; a top-level "Custom files"
option matches the injected custom-file nodes by their flag.
- fsFilterIndexBuild inverts name -> criterion set; pysimFsFilterMatch
matches by name (and custom by flag); pysimFsFilterShow keeps a
directory while it has a matching (loaded) descendant, and keeps
never-expanded directories. The dropdown renders All / Custom files
and three optgroups (Identifiers / PLMN / Services).
- i18n EN/RU for the new labels.
Frontend 1145 tests green (fs_filter.test.js 19).
Add a Filter multiselect next to the sort pills in the file tree toolbar.
The option list is large and undecided, so FS_FILTER_OPTIONS is empty and
the per-node match is a no-op for now; the mechanism is wired end to end:
- FS_FILTER_OPTIONS const (empty), pysimFsFilter state persisted to
simple_fs_filter, pysimFsSetFilter / pysimFsFilterMatch /
pysimFsFilterRender, and the render loop consults pysimFsFilterMatch.
- The dropdown re-renders on language switch; "Filter:" and
"(no filters yet)" are translated (EN/RU).
Frontend 1132 tests green (6 new scaffold pins).
Make the DF context from the resolver actually reach the live views:
- pysimFsSelected now stores the canonical path (pysimFsNodePath), not
the node name; pysimFsRenderNode emits the path in the click/toggle
handlers; every consumer resolves via pysimFsFindNodeByPath. The
name-based pysimFsFindNode is removed - two same-named files under
different DFs (EF.ECC/EF.AD, DF.PHONEBOOK copies) are now distinct.
- efDfFromPath maps ADF-rooted parent segments by RID (A0000000871002
-> ADF.USIM, A0000000871004 -> ADF.ISIM), so snapshot/profile paths
rooted by AID resolve to the same DF key as the named form.
- efDecEcc shares efEccCategory with efDecEccUsim (TS 24.008
Table 10.5.135d), so the SIM and USIM category displays can't drift.
Frontend 1087 + Python 1090 tests green. (Version/sw bump deferred -
this is part of the unreleased decoded-editing batch.)
- pysimFsLoadChildren failure now only marks exists=false and re-renders;
loaded children stay in the node and are hidden by the renderer (red
cross, no toggle, no (empty)), so a failed DF is re-attempted on the
next probe/refresh instead of being short-circuited
- dropped the parent_sel-less /api/tree retry: error payloads now carry
exists:false, so it doubled requests for every absent DF and re-selected
the same FID without its parent (pySim probe_file fallback)
- probe walks strictly on exists===true and never collects files under a
non-existing DF; no longer clears children on a failed EF select
- tests updated: single request per failed load, children untouched,
200 exists:false marks absent without retry, render hides stale
children, probe never fetches/selects them; SW cache v116 -> v117.
- pysimFsLoadChildren now treats {success:false,error} (and any error
payload) as a failed listing: absent DFs/ADFs render as a red cross
without an expand arrow instead of silently opening empty; the
/api/tree 500 body also carries exists:false for shape consistency
with /api/select
- an expanded directory with zero children shows a gray (empty)
placeholder
- new Probe all files button (data-needs=card) in the tree header:
walks the whole model tree from MF, verifies every DF/ADF via
/api/tree and every file (incl. custom entries) via /api/select,
skips subtrees of absent dirs, shows N/total progress, toggles to
Stop, and reports present/absent counts with elapsed time; results
colour the current tree only
- tests: fs_load (error/retry/empty), fs_render (red cross, (empty)),
fs_probe (flags, absent-dir skip, custom files, stop, summary);
html structural check; help EN/RU, READMEs, AGENTS updated;
SW cache v115 -> v116.