v3.30.2: the batch RU wording sweep completed

The v3.30.1 review follow-up.  The sweep fixed the two batch-state
strings but two more shared (kind-independent) batch strings were still
install-specific, so a delete/reinstall batch started under an "install"
label:

- 'Start batch' was «Запустить пакетную установку» - the ram-batch-start
  button starts every kind - now «Запустить пакетную операцию» (aligning
  with the optgroup «Пакетные операции (по картам)»).
- the shared panel hint's «...перезапустите пакетную установку» is now
  «...перезапустите пакетную операцию» (the EN was already neutral).

The RU help quoted the old button label: its install row now says
«Запустить пакетную операцию не требует карты», and the row's other
generic "the batch" statements (never retries, the test-run exclusion)
are neutral too; the genuinely install-specific ones (the workflow, the
shared install form) stay.

The v3.30.1 notes were corrected: the counts labels do follow the last
run's kind after a clear (the values stay zero) - the AGENTS entry and
the _ramBatchLastKind/ramBatchRender comments say so now.  The
cleared-title test seeds the state before opening the modal (no reliance
on the previous test's sandbox leftovers).

930 frontend + 945 Python; sw cache simple-v452.
This commit is contained in:
2026-10-15 09:41:29 +03:00
parent 19dc0c7d56
commit 3db6f59e69
6 changed files with 14 additions and 12 deletions
File diff suppressed because one or more lines are too long
+7 -6
View File
@@ -1932,7 +1932,7 @@
// ===== Version ===== // ===== Version =====
// Single source of truth for the PWA version: shown in the header and used // Single source of truth for the PWA version: shown in the header and used
// by the server version check in pysimConnect(). // by the server version check in pysimConnect().
const SIMPLE_VERSION = '3.30.1'; const SIMPLE_VERSION = '3.30.2';
document.getElementById('app-version').textContent = 'v' + SIMPLE_VERSION; document.getElementById('app-version').textContent = 'v' + SIMPLE_VERSION;
// ===== view history (the browser Back/Forward buttons) ===== // ===== view history (the browser Back/Forward buttons) =====
@@ -10192,8 +10192,8 @@ let _ramBatchSummary = null; // /api/status.ram_batch
let _ramBatchProgress = null; // /api/status.ram_progress let _ramBatchProgress = null; // /api/status.ram_progress
let _ramBatchModalShown = false; // the batch status modal is open (v3.30.0) let _ramBatchModalShown = false; // the batch status modal is open (v3.30.0)
let _ramBatchLastKind = null; // the last seen run kind: a cleared report let _ramBatchLastKind = null; // the last seen run kind: a cleared report
// (kind: null) keeps the modal's title right // (kind: null) keeps the modal's title and the
// (v3.30.1) // counts labels on that kind (v3.30.1)
// A fetch that never settled must not block the report forever (v3.28.7). // A fetch that never settled must not block the report forever (v3.28.7).
const RAM_BATCH_FETCH_STALE_MS = 10000; const RAM_BATCH_FETCH_STALE_MS = 10000;
@@ -10351,7 +10351,8 @@ function ramBatchRender() {
const phase = st.phase || (active ? 'waiting_card' : 'idle'); const phase = st.phase || (active ? 'waiting_card' : 'idle');
// The success labels follow the operation (v3.29.0): the counts bucket is // The success labels follow the operation (v3.29.0): the counts bucket is
// 'installed' for every kind - "the operation succeeded". The last seen // 'installed' for every kind - "the operation succeeded". The last seen
// kind is remembered for the modal's title (v3.30.1). // kind is remembered for the modal's title and these labels, so a cleared
// report keeps the run's kind (v3.30.1).
if (st.kind) _ramBatchLastKind = st.kind; if (st.kind) _ramBatchLastKind = st.kind;
const kind = st.kind || _ramBatchLastKind || 'install-cap'; const kind = st.kind || _ramBatchLastKind || 'install-cap';
const okLabel = kind === 'delete' ? t('Deleted') const okLabel = kind === 'delete' ? t('Deleted')
@@ -24681,7 +24682,7 @@ const LANG_RU = {
'Delete the package before installing (with its applications)': 'Удалить пакет перед установкой (с его приложениями)', 'Delete the package before installing (with its applications)': 'Удалить пакет перед установкой (с его приложениями)',
'AID must be 5-16 bytes of hex': 'AID должен быть 5-16 байт hex', 'AID must be 5-16 bytes of hex': 'AID должен быть 5-16 байт hex',
'not found': 'не найдено', 'not found': 'не найдено',
'Start batch': 'Запустить пакетную установку', 'Start batch': 'Запустить пакетную операцию',
'Stopping...': 'Остановка…', 'Stopping...': 'Остановка…',
'Batch stopped': 'Пакетная операция остановлена', 'Batch stopped': 'Пакетная операция остановлена',
'Batch finished': 'Пакетная операция завершена', 'Batch finished': 'Пакетная операция завершена',
@@ -24696,7 +24697,7 @@ const LANG_RU = {
'Skipped': 'Пропущено', 'Skipped': 'Пропущено',
'attempts': 'попыток', 'attempts': 'попыток',
'No cards processed yet.': 'Карты ещё не обрабатывались.', 'No cards processed yet.': 'Карты ещё не обрабатывались.',
'The preset, keyset and counter come from each card\'s own preset (matched by ICCID). A card is attempted once per run: re-equipping it reports it as already processed - restart the batch to retry. Stop finishes the current card first.': 'Пресет, keyset и счётчик берутся из пресета каждой карты (совпадение по ICCID). Карта обрабатывается один раз за запуск: повторная установка карты отмечается как уже обработанная — для повтора перезапустите пакетную установку. «Остановить» завершает работу после окончания обработки карты.', 'The preset, keyset and counter come from each card\'s own preset (matched by ICCID). A card is attempted once per run: re-equipping it reports it as already processed - restart the batch to retry. Stop finishes the current card first.': 'Пресет, keyset и счётчик берутся из пресета каждой карты (совпадение по ICCID). Карта обрабатывается один раз за запуск: повторная установка карты отмечается как уже обработанная — для повтора перезапустите пакетную операцию. «Остановить» завершает работу после окончания обработки карты.',
'Do not close or reload this window while the operation is running.': 'Не закрывайте и не перезагружайте окно, пока операция выполняется.', 'Do not close or reload this window while the operation is running.': 'Не закрывайте и не перезагружайте окно, пока операция выполняется.',
'Working...': 'Выполняется...', 'Working...': 'Выполняется...',
'APDU hex': 'APDU (hex)', 'APDU hex': 'APDU (hex)',
+1 -1
View File
@@ -1,4 +1,4 @@
const CACHE = 'simple-v451'; const CACHE = 'simple-v452';
const URLS = [ const URLS = [
'index.html', 'index.html',
'help.html', 'help.html',
+3 -2
View File
@@ -578,10 +578,11 @@ test('a cleared report keeps the run kind in the modal title (v3.30.1)', () => {
setModalEls(); setModalEls();
setPanelEls(); setPanelEls();
app.setSummary(null); app.setSummary(null);
app.ramBatchModalOpen(); // the state is seeded before the window opens: no reliance on the sandbox
// leftovers of the previous test (the modal opens into the run's kind)
app.setLast({ kind: 'delete', active: false, phase: 'finished', attempts: [], app.setLast({ kind: 'delete', active: false, phase: 'finished', attempts: [],
counts: { installed: 2 }, attempts_total: 2 }); counts: { installed: 2 }, attempts_total: 2 });
app.ramBatchRender(); app.ramBatchModalOpen();
assert.strictEqual(els['ram-op-title'].textContent, 'Batch delete (per card)'); assert.strictEqual(els['ram-op-title'].textContent, 'Batch delete (per card)');
// Clear empties the state (kind: null): the title must not flip to install // Clear empties the state (kind: null): the title must not flip to install
app.setLast({ kind: null, active: false, phase: 'idle', attempts: [], app.setLast({ kind: null, active: false, phase: 'idle', attempts: [],
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "pysim-simple-server" name = "pysim-simple-server"
version = "3.30.1" version = "3.30.2"
description = "HTTP REST server wrapping pysim for the SIMple PWA" description = "HTTP REST server wrapping pysim for the SIMple PWA"
requires-python = ">=3.8" requires-python = ">=3.8"
# pysim is a git-only dependency installed explicitly by setup.bat/setup.sh. # pysim is a git-only dependency installed explicitly by setup.bat/setup.sh.
+1 -1
View File
@@ -37,7 +37,7 @@ from osmocom.tlv import BER_TLV_IE
from osmocom.utils import rpad from osmocom.utils import rpad
VERSION = '3.30.1' VERSION = '3.30.2'
MAX_ENVELOPE_SEGMENTS = 5 # max SMS segments for outgoing C-APDU in ENVELOPE MAX_ENVELOPE_SEGMENTS = 5 # max SMS segments for outgoing C-APDU in ENVELOPE