Conversation
* 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>
This reverts commit 41d8418.
* 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>
Client Test Results128 tests 128 ✅ 0s ⏱️ Results for commit 6cee58f. |
|
Python Test Results 1 files 1 suites 1m 19s ⏱️ Results for commit 6cee58f. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


No description provided.