Commit graph

75 commits

Author SHA1 Message Date
Luiz Gustavo
623c0df22b fix(readme): use standard review headings 2026-07-18 11:00:48 -03:00
Luiz Gustavo
d541e65bbc chore(release): prepare version 1.0.2 2026-07-18 10:59:28 -03:00
Luiz Gustavo
de22a00d3b fix(readme): expose installation and usage headings 2026-07-18 10:58:58 -03:00
Luiz Gustavo
656a9a1cac chore(release): prepare version 1.0.1 2026-07-18 10:55:05 -03:00
Luiz Gustavo
f9bdfc042d fix(release): address automated review findings 2026-07-18 10:54:43 -03:00
Luiz Gustavo
38e4641250 fix(release): synchronize version metadata 2026-07-17 21:12:58 -03:00
Luiz Gustavo
d347d830c9 Update manifest.json 2026-07-17 21:10:37 -03:00
Luiz Gustavo
2cec976722 updating version 2026-07-17 21:10:31 -03:00
Luiz Gustavo
15fb0effed chore(release): prepare community plugin publication 2026-07-17 21:02:57 -03:00
Luiz Gustavo
b5d80bb362 chore(sample-vault): update demo workspace state 2026-07-17 20:53:23 -03:00
Luiz Gustavo
1b6bc4eeda docs(readme): simplify project overview 2026-07-17 20:52:17 -03:00
Luiz Gustavo
ae919808d4 fix(ui): remove navigation rail label 2026-07-17 20:48:47 -03:00
Luiz Gustavo
bd8093fdfc fix(ui): clarify subject cycle status 2026-07-17 20:47:04 -03:00
Luiz Gustavo
6e9d3ca06b fix(ui): soften active contest status 2026-07-17 20:44:36 -03:00
Luiz Gustavo
b4e6450a0d feat(ui): link dashboard to study records 2026-07-17 20:43:07 -03:00
Luiz Gustavo
b7f0229b12 fix(ui): align status icons and selectors 2026-07-17 20:40:53 -03:00
Luiz Gustavo
6d3b402a7d refactor(ui): flatten study workspace 2026-07-17 20:32:44 -03:00
Luiz Gustavo
47e197df48 feat(ui): redesign Obsidian workspace 2026-07-17 20:17:13 -03:00
Luiz Gustavo
4dd3978d65 docs(readme): simplify project overview 2026-07-16 23:31:53 -03:00
Luiz Gustavo
5d7c27186c refactor(ui): simplify study workspace layout 2026-07-16 23:06:16 -03:00
Luiz Gustavo
2793fba430 Revert "refactor(ui): use field cards in tables"
This reverts commit 43f69e38e9.
2026-07-15 20:23:12 -03:00
Luiz Gustavo
43f69e38e9 refactor(ui): use field cards in tables 2026-07-15 20:22:02 -03:00
Luiz Gustavo
c3ff030c7d refactor(ui): share scannable metric layout 2026-07-15 20:18:42 -03:00
Luiz Gustavo
8b381c463c fix(cycle): simplify plan row layout 2026-07-15 20:12:42 -03:00
Luiz Gustavo
2d3ebd08b8 refactor(cycle): show plan as cards 2026-07-15 20:10:49 -03:00
Luiz Gustavo
b7be3c8969 feat(contests): add exam planning metadata 2026-07-15 20:02:52 -03:00
Luiz Gustavo
cd34a55607 refactor(ui): standardize editing controls 2026-07-15 19:57:36 -03:00
Luiz Gustavo
774dc48419 feat(sessions): filter study history 2026-07-15 19:37:01 -03:00
Luiz Gustavo
535b1adc74 fix(validation): enforce study input rules 2026-07-15 19:33:11 -03:00
Luiz Gustavo
ea8d3d8e34 refactor(ui): polish study workflow 2026-07-15 19:28:01 -03:00
Luiz Gustavo
0e9f697c1b refactor: centralize wall-link id template in wallLinkKey
The '${contestId}-notice' / '${contestId}-exam' id template was
duplicated in WallTab and the Seeder. Extract wallLinkKey(contestId,
kind) in the Wall module, import it at both call sites, and add three
tests covering format stability (regression for the 'second save
replaces first save' behaviour the form relies on).
2026-07-07 20:42:36 -03:00
Luiz Gustavo
b16c42b3d3 refactor: replace magic "questions" with StudySessionType.QUESTIONS
Discriminator literals in RegisterStudySessionUseCase,
DeleteStudySessionUseCase, registerCommands, SessionsTab's type
select, and the Seeder are now expressed via the StudySessionType
constant. The on-disk string value is unchanged ('questions'),
so existing data and the CSV-output literal tests keep working.
2026-07-07 20:40:03 -03:00
Luiz Gustavo
7d49967f65 refactor(data): drop dead 'version' literal, keep schemaVersion
LeifPluginData had two version fields; nothing read 'version' so it
is removed. schemaVersion is the canonical field used by
DataMigrations and remains untouched.
2026-07-07 20:38:02 -03:00
Luiz Gustavo
713e4f563a refactor(types): type DataMigrations input/output as LeifPluginData
Drop the 'any' signatures on migrate/migrateV1toV2/migrateV2toV3 in
favour of LeifPluginData, and the now-unused VersionedData interface.
Missing schemaVersion is treated as 1 via the existing ?? fallback,
so callers that pass unversioned plugin data keep working.
2026-07-07 20:37:24 -03:00
Luiz Gustavo
76d9dd1b2b refactor(types): type Contest.wall as Wall, drop EntityRepository double-casts
Contest.wall is now Wall (was an inline any[] shape) and defaults to
new Wall(). EntityRepository becomes generic over EntityCollectionKey
and reaches the live LeifPluginData via a single typed accessor, removing
the previous six 'as unknown as T[]' casts and the dubious assignment
cast. The RepositoryFactory port and concrete factory use EntityCollections
to infer the per-repo entity type, so use cases no longer pass <Entity>
(type-inferred from the key now). Net: 17 baseline typecheck errors drop
to 7.
2026-07-07 18:41:06 -03:00
Luiz Gustavo
1154027e43
Merge pull request #20 from ttusk/feat/i18n
feat(i18n): introduce t() lookup, standardize command names on pt-BR
2026-07-03 01:14:24 -03:00
Luiz Gustavo
d4dd35d51e feat(i18n): introduce t() lookup, standardize command names on pt-BR
Add a minimal i18n layer (src/ui/i18n.ts) with a pt-BR bundle and a t()
lookup. Route the command names, tab labels and the common action buttons
(Cancelar/Criar/Editar/Excluir/Fechar) through t(). Standardize all
command names on Portuguese so the palette is consistent (was a mix of
English and one Portuguese command).

Closes #10
2026-07-03 01:13:33 -03:00
Luiz Gustavo
c66d28f359
Merge pull request #19 from ttusk/test/close-gaps
test: close test gaps (CsvExport, ExportToCsv, DataMigrations)
2026-07-03 00:58:44 -03:00
Luiz Gustavo
9d3409f9b8 test: cover CsvExport, ExportToCsvUseCase, DataMigrations; fix dup test name
- Add tests for CsvExportService (headers, escaping, empty, nulls).
- Add tests for ExportToCsvUseCase (sessions/contests export, filtering).
- Add tests for DataMigrationService (version stamping, dedup,
  idempotency).
- Rename the duplicate 'rejects a questions session...' it() in
  LeifView.test.ts so both names are unique and accurate.

Closes #8
2026-07-03 00:58:39 -03:00
Luiz Gustavo
ae0ad4e796
Merge pull request #18 from ttusk/fix/id-factory
fix(ids): standardize ID generation via createId factory
2026-07-03 00:48:35 -03:00
Luiz Gustavo
4160e97610 fix(ids): standardize ID generation via createId factory
Replace 7 Date.now()-based ID generation sites (SessionsTab, ItemsTab,
TopicsTab, CycleTab, registerCommands, CreateStudyItemUseCase) with a
single createId factory using crypto.randomUUID with a fallback, so two
entities created in the same millisecond no longer collide.

Closes #7
2026-07-03 00:48:30 -03:00
Luiz Gustavo
08138c1d2a
Merge pull request #17 from ttusk/fix/error-handling
fix(errors): ValidationError for domain failures, runGuarded boundary
2026-07-03 00:40:45 -03:00
Luiz Gustavo
d85711657a fix(errors): ValidationError for domain failures, runGuarded boundary
- AdvanceCycleUseCase and ReorderSubjectsUseCase now throw ValidationError
  instead of plain Error for domain rule violations.
- Add DomHelpers.runGuarded error-boundary helper and use it in
  registerCommands (advance cycle, cycle snapshot, summary) to remove
  repeated try/catch + Notice boilerplate.

Closes #6
2026-07-03 00:40:41 -03:00
Luiz Gustavo
c5eb9cf1ab
Merge pull request #16 from ttusk/refactor/dedupe-helpers
refactor: drop dead domain services, dedupe shared helpers
2026-07-03 00:33:52 -03:00
Luiz Gustavo
1b048ed535 refactor: drop dead domain services, dedupe shared helpers
- Delete SubjectService, StudySessionService, QuestionNotebookService
  (only exercised by tests; logic lives in use cases) and DomainServices.test.ts.
- Consolidate notifyError into DomHelpers.notifyError (with shared
  NoActiveContestError handling) and drop the 6 per-component copies.
- Extract SubjectPicker (getSelectedSubject + create) shared by ItemsTab,
  TopicsTab and LeifView.
- Dedupe LeifTabId/TABS: LeifView now imports the constants version.

Closes #5
2026-07-03 00:33:42 -03:00
Luiz Gustavo
c496e96648
Merge pull request #15 from ttusk/chore/lint-tooling
chore: add eslint/prettier, lint script, CI lint, tighten tsconfig
2026-07-02 23:19:03 -03:00
Luiz Gustavo
cd34338152 chore: add eslint/prettier, lint script, CI lint, tighten tsconfig
- eslint (typescript-eslint) + prettier config with a lint script.
- Add a Lint step to the CI workflow (runs on PRs and master).
- Tighten tsconfig: noImplicitReturns, noFallthroughCasesInSwitch.

Closes #4
2026-07-02 23:18:52 -03:00
Luiz Gustavo
388e028da8
Merge pull request #14 from ttusk/fix/a11y-basics
fix(a11y): accessible tabs, modal focus trap, confirm dialogs
2026-07-02 23:13:52 -03:00
Luiz Gustavo
6ac9f3b87b fix(a11y): accessible tabs, modal focus trap, confirm dialogs
- Tab bar: role=tablist/tab, aria-selected, roving tabindex, arrow-key
  navigation and Enter/Space activation.
- Modal: role=dialog, aria-modal, aria-labelledby, focus trap, Escape to
  close, focus restore on close.
- Icon-only buttons now expose aria-label.
- Replace native window.confirm() deletes with an Obsidian-style confirm
  dialog (ContestsTab, ItemsTab, SessionsTab, TopicsTab).
- Add visible :focus-visible styles for buttons, inputs and selects.

Closes #3
2026-07-02 23:13:26 -03:00
Luiz Gustavo
8590b9ebdf
Merge pull request #13 from ttusk/fix/entity-repository-port
fix(application): introduce EntityRepositoryPort and inject via factory
2026-07-02 23:07:56 -03:00