ui: Parser pill — C-APDU / R-APDU parsers as sub-pills; R-APDU rename (v3.5.0)

Remote APDU now has six top-level pills (SIM RFM, USIM RFM, RAM/GP,
Expanded Script, Push commands, Parser); the C-APDU and R-APDU parsers are
nested panels behind the Parser pill, switched by parserSwitchSubtab().

- "Response parser" renamed to "R-APDU parser" (RU: «Разбор R-APDU»), the
  umbrella is "Parser" / «Разбор»; the C-APDU panel keeps its id and label.
- cApduSwitchSubtab() routes nested names through the Parser pill first, so
  pysimSendOta()'s post-send jump keeps working; the help deep-link anchor
  follows the selected parser (c-apdu-parser / response-parser) and the Push
  commands pill now links to the renamed #push-commands section.
- The small C-APDU panel moved next to the R-APDU panel so both live in the
  #c-apdu-sub-parser container; html.test.js checks the nesting and sub-pills.
- Pill lists updated in help EN/RU (2.6 note, 2.8 heading), READMEs, AGENTS;
  sw cache -> simple-v248.
This commit is contained in:
2026-09-23 09:55:40 +03:00
parent c011c02f8e
commit 731cb53105
7 changed files with 77 additions and 33 deletions
+13 -3
View File
@@ -119,9 +119,19 @@ test('profile rows have a Clone action', () => {
assert.match(html, /t\('Clone'\)/);
});
test('response parser is a Remote APDU pill', () => {
assert.match(html, /data-sub="response" onclick="cApduSwitchSubtab\('response'\)"/);
assert.ok(html.includes('id="c-apdu-sub-response"'));
test('the C-APDU and R-APDU parsers are sub-pills of the Parser pill', () => {
// The Parser pill is a top-level Remote APDU subtab...
assert.match(html, /data-sub="parser" onclick="cApduSwitchSubtab\('parser'\)"/);
// ...and both parser panels live inside its container, one after the other.
const container = html.indexOf('id="c-apdu-sub-parser"');
const parse = html.indexOf('id="c-apdu-sub-parse"');
const response = html.indexOf('id="c-apdu-sub-response"');
assert.ok(container > 0, 'Parser container missing');
assert.ok(parse > container, 'C-APDU panel must be inside the Parser container');
assert.ok(response > parse, 'R-APDU panel must follow the C-APDU panel');
// Their sub-pill buttons exist and switch through parserSwitchSubtab.
assert.match(html, /id="parser-btn-parse" onclick="parserSwitchSubtab\('parse'\)"/);
assert.match(html, /id="parser-btn-response" onclick="parserSwitchSubtab\('response'\)"/);
});
test('profiler and phone simulator are top-level tab contents', () => {