Skip to content

Release 0.30.0#1023

Merged
Tim020 merged 10 commits into
mainfrom
dev
May 13, 2026
Merged

Release 0.30.0#1023
Tim020 merged 10 commits into
mainfrom
dev

Conversation

@Tim020
Copy link
Copy Markdown
Contributor

@Tim020 Tim020 commented May 13, 2026

No description provided.

Tim020 and others added 9 commits May 8, 2026 22:26
* Fix Reset/Submit buttons always enabled in system settings (#1003)

Both buttons now disable when no settings differ from their stored values,
and re-enable as soon as any value changes — reverting a setting back to
its original value correctly disables them again.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix Prettier formatting in ConfigSettings.vue

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Update store.js reference to store.ts
- Add npm run typecheck to the contributing linting checklist

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* TypeScript migration: Stage 1 — infrastructure (#1005)

* Add TypeScript infrastructure (Stage 1 of TS migration)

Installs TypeScript tooling and wires it into the build/lint/CI pipeline
without renaming any existing files. All current tests remain green.

- Add tsconfig.json with allowJs/checkJs:false for incremental migration,
  useDefineForClassFields:false for Vue 2 reactivity compatibility
- Install typescript ~5.4.5, @typescript-eslint parser/plugin, @types/node,
  @types/lodash
- Add eslint.config.mjs block for **/*.ts files using @typescript-eslint
- Add .ts to vite resolve.extensions
- Add typecheck script (tsc --noEmit); extend ci-lint to include it
- Add run-typecheck CI job to nodelint.yml
- Add src/types/index.ts placeholder (populated in Stage 2)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Remove typecheck from ci-lint to avoid duplicate runs in CI

The dedicated run-typecheck CI job in nodelint.yml already covers type
checking. Running it inside ci-lint as well would execute it twice on
every push.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Stage 2: Type definitions + utility file migration to TypeScript (#1007)

- Create src/types/api/ with interfaces for all API shapes (show, script,
  cues, stage, microphones, session, user, settings, websocket)
- Create src/types/shims/ with vendor.d.ts (deep-object-diff) and
  vue-shims.d.ts (Vue socket/toast plugin augmentations)
- Rename all utility .js → .ts with explicit parameter and return types:
  utils, logger, http-interceptor, customValidators, scriptUtils,
  blockOrphanUtils, micConflictUtils, platform/{browser,electron,index}
- Rename constants to .ts with 'as const' and derived type exports
- Rename .test.js → .test.ts for Vitest test files
- Update tsconfig: add vite/client types, exclude test files from typecheck
- 106 tests passing, typecheck clean, lint clean, build succeeds

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* TypeScript migration Stage 3: type all Vuex store modules (#1008)

Renames all 10 store modules from .js to .ts and adds typed state
interfaces, mutation payloads, and action parameters throughout.

Key changes:
- New src/types/store.ts with RootState interface
- src/types/api/settings.ts: add SystemSettings interface
- src/types/api/user.ts: add CueColourOverride interface
- All 10 modules: Module<ModuleState, RootState> wrapper, named state
  interfaces, typed mutation params, typed action payloads
- websocket.ts: fix router.currentRoute → .path comparisons and add
  missing $toast.info to VueToast cast

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* TypeScript migration Stage 4: mixins and router (#1009)

Converts all 7 mixin files and the Vue Router index from .js to .ts
using defineComponent wrappers and explicit parameter/return types.

Also fixes a type correctness bug discovered during migration: the
ScriptCut API type was modelled as an object (line_part_id, revision_id)
but the server endpoint returns a plain array of number IDs. Changed
ScriptCut to a number type alias and updated all usages accordingly.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* TypeScript migration Stage 5A: leaf components and simple views (#1010)

Converts 17 Vue SFCs to <script lang="ts"> with defineComponent wrappers:
views/404View, AboutView, HomeView, HelpDocView, ForcePasswordChangeView,
LoginView, Settings; vue_components/MarkdownRenderer, ConfigLogs,
ConfigSettings, ConfigShows, ConfigSystem, ConfigUsers, ConfigRbac,
CreateUser, RbacResource, ResetPassword.

Also updates eslint.config.mjs to use tsParser as the <script lang="ts">
sub-parser inside .vue files, enabling TypeScript-aware linting for SFCs.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* TypeScript migration Stage 5B: views and user settings SFCs (#1011)

Convert 11 Vue SFCs to <script lang="ts"> with defineComponent wrapper:
- views/HelpView.vue, config/ConfigView.vue, electron/ServerSelector.vue
- views/show/ShowConfigView.vue, ShowLiveView.vue
- vue_components/user/settings: AboutUser, ApiToken, ChangePassword,
  CueColourPreferences, Settings, StageDirectionStyles

Key changes: typed timer fields as ReturnType<typeof setInterval>|null,
fixed Date arithmetic to use .getTime() instead of implicit coercion,
added SavedConnection/ServerStatus/DiscoveredServer interfaces in
ServerSelector, removed verbose JSDoc comments now captured by types.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Stage 5C TypeScript migration: show config acts/scenes, cast, characters, sessions SFCs (#1012)

Convert 13 Vue SFCs to <script lang="ts"> with defineComponent wrapper covering
ConfigActsAndScenes, ConfigSessions, ConfigCast, ConfigCharacters, ConfigShow,
ConfigActs, ConfigScenes, CastLineStats, CharacterLineStats, CharacterGroups,
SessionList, SessionTagDropdown, and SessionTagList.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* TypeScript migration Stage 5D: script, live, App, main.ts + tsconfig improvements (#1014)

* TypeScript migration Stage 5D: script, live, App, main.ts + tsconfig improvements (#1013)

Completes the full TypeScript migration (issue #906). This is the final PR.

Changes:
- All script config SFCs: ScriptEditor, ScriptLineEditor, ScriptLinePart,
  ScriptLineViewer, ScriptRevisions, RevisionGraph, RevisionDetailModal,
  BulkActSceneModal, CompiledScripts, StageDirectionStyles
- All live view SFCs: ScriptViewPane, StageManagerPane, ScriptLineViewer,
  ScriptLineViewerCompact
- All stage config SFCs: StageManager, StageTimeline, CrewTimeline, TimelineSidePanel,
  PropsList, SceneryList, CrewList
- All mics config SFCs: MicTimeline, MicAllocations, MicList, ResourceAvailability,
  SceneDensityHeatmap, MicAutoPopulateModal
- All cues config SFCs: CueEditor, ScriptLineCueEditor, CueCountStats, JumpToCueModal
- Config views: ConfigCues, ConfigMics, ConfigScript, ConfigScriptRevisions, ConfigStage
- App.vue
- src/main.js renamed to src/main.ts (index.html entry point updated)
- tsconfig.json: enabled strictNullChecks, strictFunctionTypes, noImplicitReturns,
  noFallthroughCasesInSwitch, forceConsistentCasingInFileNames; added .vue to include;
  added comments documenting deferred strict settings and their rationale
- Fixed strictNullChecks errors in logger.ts and micConflictUtils.ts

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Convert scriptConfig.test.js to TypeScript; fix tsconfig allowJs comment

Renames scriptConfig.test.js → scriptConfig.test.ts, adding ScriptLine
import and typing the makeLine helper. All 7 tests pass unchanged.

Updates the allowJs tsconfig comment — the .js test file was the only reason
cited for the flag, but allowJs is still needed for tooling config files
(vite.config.js etc.) outside src/.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Convert all remaining JS tooling files to TypeScript; remove Babel

All JavaScript files in the client package are now TypeScript:
- vite.config.js → vite.config.ts
- vitest.config.js → vitest.config.ts
- prettier.config.mjs → prettier.config.ts (adds Config type annotation)
- eslint.config.mjs → eslint.config.ts (removes Babel parser; now uses
  @typescript-eslint/parser for both .ts and .vue files since all SFCs
  have <script lang="ts">; requires jiti for ESLint TypeScript config loading)
- scripts/generate-doc-manifest.js → generate-doc-manifest.ts (converts
  CommonJS require() to ESM imports; adds types; runs via node --strip-types)
- babel.config.js → deleted

Package changes:
- Remove @babel/core, @babel/eslint-parser, @babel/preset-env
- Add jiti (required by ESLint 9.39+ for TypeScript config file loading)
- Add "type": "module" to eliminate Node ESM detection warnings
- Update lint/format globs to drop .js (no .js files remain)
- Update prebuild script to use node --strip-types for the .ts manifest script

tsconfig.json: remove allowJs / checkJs (no .js source files remain)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Update development.md to reflect TypeScript migration

- Update store.js reference to store.ts
- Add npm run typecheck to the contributing linting checklist

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Fix stage direction text input not auto-focusing on add (#1017)

Wrap the focus() call in $nextTick so it fires after Vue's DOM update
cycle is fully committed. When a new stage direction is added,
ScriptLineEditor.created() is async — it awaits previousLineFn before
calling addLinePart(), so ScriptLinePart mounts during a reactive
re-render rather than the initial mount sequence. A synchronous focus()
during mid-flush is unreliable; deferring to $nextTick fixes this.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix auto-focus for new stage direction using rAF + $nextTick (#1017)

Bootstrap Vue's b-dropdown-item calls closeDropdown() → requestAF(() =>
hide(true)) after emitting the click. hide(true) triggers focusToggler()
which uses $nextTick to restore focus to the toggle button. This ran after
our plain $nextTick, stealing focus from the newly added input.

Fix: use requestAnimationFrame + $nextTick in ScriptLinePart.mounted().
Our rAF is registered during the post-click microtask phase (ScriptLinePart
mounts as part of Vue's reactive flush), so it fires after the dropdown's
earlier-registered rAF in the same animation frame. Our subsequent $nextTick
is therefore queued after focusToggler's $nextTick, so input focus wins.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds an optional user setting to sort character and character group
dropdowns in the script editor by frequency of appearance across the
5 most recently loaded pages, so the most relevant characters for a
given scene surface at the top without manual scrolling.

- Backend: `character_mru_sort` bool field on UserSettings + Alembic migration
- Frontend: user settings toggle; `mruSortUtils.ts` pure sort helpers
  with 13 Vitest unit tests; ScriptLinePart reads TMP_SCRIPT for counts;
  ScriptEditor pre-loads 4 look-back pages into TMP_SCRIPT on navigation
- Docs: user_settings.md updated

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Add combined character/group dropdown setting (#1020)

Adds an optional user setting to merge the separate Character and
Character Group dropdowns in the script editor into a single grouped
dropdown with two labelled sections. Integrates with the existing MRU
sort setting so each section is independently frequency-sorted when both
options are active. Includes Alembic migration, TypeScript types, 8 new
Vitest tests, and user documentation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix ruff import order in migration file

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
@Tim020 Tim020 added the release Pull requests for creating a new release label May 13, 2026
@Tim020 Tim020 enabled auto-merge May 13, 2026 00:11
@github-actions
Copy link
Copy Markdown

Client Test Results

128 tests   128 ✅  0s ⏱️
  6 suites    0 💤
  1 files      0 ❌

Results for commit 6cee58f.

@sonarqubecloud
Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
4.8% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

@github-actions
Copy link
Copy Markdown

Python Test Results

  1 files    1 suites   1m 19s ⏱️
587 tests 587 ✅ 0 💤 0 ❌
592 runs  592 ✅ 0 💤 0 ❌

Results for commit 6cee58f.

@Tim020 Tim020 merged commit 5ba124d into main May 13, 2026
31 of 32 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release Pull requests for creating a new release xlarge-diff

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant