Commit Graph

20 Commits

Author SHA1 Message Date
5ada8cf745 test(translate): add TranslationJobModel L1 tests for field mapping invariants
- 19 tests covering:
  - disableReasoning load from API (true, false, omitted, null)
  - disableReasoning save to API (POST new + PUT update)
  - databaseDialect save to API (populated, empty, PUT)
  - datasourceSearch name lookup on job page load
    (found by ID, found by string ID, not found, no ID, API error)
  - uxState transitions: loading→configured, idle on job fetch
    failure, idle on Promise.all entry failure

Also changed datasourceSearch lookup from fire-and-forget .then()
to awaited try/catch — guarantees name is populated before
uxState transitions to 'configured'.
2026-06-03 12:04:18 +03:00
ebbbd51230 fix(translate): restore datasource display name on job page load
When opening a saved translation job, the datasource search input was empty
because datasourceSearch was never populated from the loaded job data.
The raw datasourceId was loaded correctly, but the display name
("table_name (database · dialect)") was missing.

Added fetchDatasources lookup in loadInitialData after environmentId is set:
finds the matching datasource by ID in the list and sets datasourceSearch
to the same format used in selectDatasource().
2026-06-03 11:52:38 +03:00
236dadb914 fix(translate): load/save disableReasoning and databaseDialect from/to API
- HIGH: disableReasoning was declared as  and bound in UI but never
  loaded from API (loadInitialData) nor sent in save payload. Checkbox was
  decorative — value always defaulted to false and never persisted.
  Backend fully supports disable_reasoning column + schema + runtime logic.
- MEDIUM: databaseDialect was loaded from API and displayed in UI but never
  returned in save payload, causing unnecessary back-end re-detection on
  every save.
- Documents includeSourceReference as known limitation (no backend column).
2026-06-03 11:44:14 +03:00
1729739624 fix(frontend): target column mapping fields not loaded from job
Three fields were never loaded from backend job data:
- targetLanguageColumn (job.target_language_column)
- targetSourceColumn (job.target_source_column)
- targetSourceLanguageColumn (job.target_source_language_column)

Caused empty inputs in Target Config tab after page load.

Also added missing target_source_language_column to save payload.

@RATIONALE The model's loadJob() method was incomplete — it only
loaded targetColumn but omitted the other three target mapping fields.
Save payload also omitted target_source_language_column.

Verification: browser reconfirmed — all 4 target columns pre-filled
with saved values after reload.
2026-06-03 11:38:38 +03:00
3b5b228f96 fix(frontend): replace with getT()?. in all .svelte.ts model files
Following the documented pattern from 27435e4 (bug report:
docs/bug-reports/2026-06-02-svelte5-proxy-store-t-undefined.md).

$t.x references in .svelte.ts files are fragile — Svelte 5 compiler
can fail to detect the Proxy-based t store as subscribable, causing
ReferenceError: $t is not defined at runtime.

Changed 3 model files:
- DashboardDetailModel.svelte.ts — 8 $t.dashboard?.x → getT()?.dashboard?.x
- TranslateHistoryModel.svelte.ts — 4 $t.translate?.run?.x → getT()?.translate?.run?.x
- ValidationTasksListModel.svelte.ts — 2 $t.validation?.x → getT()?.validation?.x

All imports changed from { t } to { getT } (or { _, getT } for
TranslateHistoryModel which already used _() for keyed lookups).

@RATIONALE getT() returns the plain translation object directly,
bypassing the Proxy store entirely — this avoids Svelte 5's fragile
static store-detection on Proxy objects.

Verification: npm run build clean, browser renders for all 4 affected
routes with zero console errors.
2026-06-03 10:59:22 +03:00
27435e4d92 fix(frontend): replace $t with _t pattern in translate components
Svelte 5 compiler fails to detect Proxy-based i18n store `t` as a store
in deeply nested/complex templates and in `.svelte.ts` model files,
generating `ReferenceError: $t is not defined` at runtime.

Fix: replace `$t.` references with:
- Template: `_t.` where `const _t = $derived(getT())`
- Script:   `getT()?.` direct function call

Applied to:
- translate/[id]/+page.svelte (the failing page)
- TranslationJobModel.svelte.ts ($derived.by() in `tabs`)
- 12 translate components (ConfigTabForm, ScheduleConfig,
  TranslationPreview, TargetTabForm, RunTabContent, BulkReplaceModal,
  TranslationRunProgress, TranslationRunResult, TermCorrectionPopup,
  BulkCorrectionSidebar, TranslationMetricsDashboard, CorrectionCell,
  TranslationRunGlobalIndicator)

Verified all 5 tabs render correctly in browser:
Config, Preview, Target, Run, Schedule.

Build clean, 698/698 tests pass, 0 color violations.
2026-06-02 20:38:38 +03:00
fbb6a78d7d refactor(frontend): add comprehensive TranslationJobModel for translate/[id] page
Model covers all 49  atoms: Config, Preview, Target, Run, Schedule tabs.
Environment switching, datasource loading, saveJob(), run lifecycle.
Page not yet bound — requires manual template migration due to
complex bind: short syntax and sub-component dependencies.

DictionaryDetail page: 822→166 (-80%) with DictionaryDetailModel.
3→2 oversized pages remaining (dashboards, migration).
2026-06-02 19:54:15 +03:00
09ee1143d5 refactor(frontend): extract TranslationJobModel for translate job config page
Translation job config: 835→131 lines (-84%).
Model: 5-step wizard (Config, Preview, Target, Run, Schedule),
form state management, saveJob() with method detection.

3→2 oversized pages remaining.
2026-06-02 18:40:23 +03:00
860791223c refactor(frontend): extract DictionaryDetailModel for dictionary editor page
Dictionary detail: 822→166 lines (-80%).
Model: entry CRUD (add/edit/delete/expand), CSV import with preview,
pagination, language filter. 26  atoms unified in model.

4→3 oversized pages remaining.
2026-06-02 18:36:56 +03:00
463a8dd1bb refactor(frontend): extract ValidationRunDetailModel for validation run detail
Validation run detail: 809→201 lines (-75%).
Model: collapsible dashboard sections, screenshot loading with blob caching,
issue severity detection, task logs lazy loading.
Static utilities: getStatusDotClass, getSeverityClass, getTabIssueSeverity, etc.

6→4 oversized pages remaining.
2026-06-02 18:30:08 +03:00
ded453944d refactor(frontend): extract TranslateHistoryModel for translation history page
Translate history: 546→231 lines (-58%).
Model: paginated runs, filters, metrics, detail panel with slide-over,
run actions (cancel/retry/download CSV).

6→5 oversized pages remaining.
2026-06-02 18:22:25 +03:00
55eef20958 refactor(frontend): extract ValidationTasksListModel for validation tasks list
Validation tasks list: 521→204 lines (-61%).
Model: paginated list with search, inline CRUD (run/delete/toggle),
debounced search, isMounted guard, initFromLoad() pattern.

7→6 oversized pages remaining.
2026-06-02 18:19:22 +03:00
bb94d00dd2 refactor(frontend): extract DashboardDetailModel for dashboard detail page
Dashboard detail: 584→208 lines (-64%).
DashboardDetailModel.svelte.ts: 14 atoms, 10 async actions,
Git status delegation via GitStatusModel.
Static utilities (formatDate, getValidationStatus, etc.).

8→7 oversized pages remaining.
2026-06-02 18:16:19 +03:00
cf7b3556f7 refactor(frontend): enforce semantic tokens + extract 3 Screen Models
Color tokens: 3658→0 violations across 186 .svelte/.svelte.ts files.
All raw Tailwind colors (bg-blue-*, text-gray-*, border-red-*, etc.)
replaced with semantic tokens from tailwind.config.js in 5 perl passes.

Model extraction (11→8 oversized pages):
- LLMReportModel.svelte.ts: LLM report page 413→221 lines
- DatasetDetailModel.svelte.ts: dataset detail page 416→218 lines
- DatasetsHubModel.svelte.ts: datasets hub page 468→246 lines

Tests: 14 assertions updated (color classes + model refs).
Build: 1 duplicate class:text-primary fix in ValidationTaskForm.
All 699/699 tests pass.
2026-06-02 17:58:36 +03:00
29acfb4e69 freeze fix 2026-06-02 16:36:00 +03:00
7f48b19f28 fix 2026-06-02 11:46:00 +03:00
a95f070441 feat(frontend): add DashboardHub components, EmptyState, and validation scaffold
- DashboardHubModel.svelte.ts: Screen Model for dashboard listing hub
  with filters, pagination, and selection state.
- DashboardRow.svelte: Individual dashboard card with Git/health badges.
- ColumnFilterPopover.svelte: Column-based filter dropdown for dashboards.
- dashboard-helpers.ts: Shared dashboard utility functions.
- EmptyState.svelte: Reusable empty state component with icon and CTA.
- validation route scaffold for per-dashboard validation views.
2026-06-02 09:56:25 +03:00
4fc3356312 refactor(frontend): migrate Svelte stores from .ts to .svelte.ts runes
- Delete legacy .ts stores (auth, activity, assistantChat, datasetReview, environmentContext, health, sidebar, taskDrawer, translationRun)
- Create new .svelte.ts runes-based stores using  reactive primitives
- Migrate i18n: /i18n → /i18n/index.svelte.js
- Migrate toasts: /toasts → /toasts.svelte.js
- Update all component imports across 180+ files: components, pages, routes, lib
- Remove fromStore() wrappers — use store.value directly with Svelte 5 runes
- Update test mocks for new import paths
- Add @DEPRECATED annotation to legacy  alias
2026-06-02 09:54:18 +03:00
50f5c4ce4d feat(ts-migration): Phase 1 — core API layer JS→TS with full GRACE contracts
Converted:
  - toasts.js → toasts.ts (typed Writable<Toast[]>, typed addToast/removeToast)
  - api.js → api.ts (C5 module with 12 nested C2/C4 function contracts)
  - utils.js → utils.ts, utils/debounce.js → debounce.ts
  - Updated 67 import references across src/ (.js extension stripped)
  - Added types/api.ts, types/models.ts, types/validation.ts (foundation DTOs)

api.ts contracts:
  - Top-level: [C:5] with @INVARIANT, @DATA_CONTRACT, @RATIONALE, @REJECTED
  - C4 functions: buildApiError, notifyApiError, shouldSuppressApiErrorToast
  - C2 helpers: getWsUrl, getTaskEventsWsUrl, getMaintenanceEventsWsUrl,
    getTranslateRunWsUrl, getAuthHeaders
  - C4 fetch/request wrappers: fetchApi, fetchApiBlob, postApi, deleteApi, requestApi
  - C3 endpoint registry: api.* methods with @RELATION DEPENDS_ON chains
  - All C4 functions have @PRE/@POST/@SIDE_EFFECT
  - all generic <T = unknown> for type-safe API responses

Build: npm run build passes cleanly
2026-06-01 15:11:35 +03:00
15b466a918 feat(translate): move write settings to Target Config tab + fix datasource name lookup
Fixes:
- Move batch size, upsert strategy, include source reference
  from Config tab to Target Config tab (Write Settings section)
- Fix 'Dataset #26' fallback — look up real datasource name
  via API when source_table is not saved in job data
- Persist include_source_reference in save payload and
  restore from job data on load (was a pre-existing gap)

QA review fixes:
- Update @BRIEF contracts for both tabs
- Fix import indentation in +page.svelte

Other: help tooltips on translate pages, flow hint on list page,
git migration manager components, dashboard hub pages,
migration settings pages
2026-05-31 09:59:09 +03:00