Phase 16D/16E Fix - Separate Structure Import from Character Creation

This commit is contained in:
Nick Beckley 2026-06-27 21:29:12 +01:00
parent 35eef02322
commit 908199c802
3 changed files with 37 additions and 4 deletions

View File

@ -80,6 +80,7 @@
<div class="word-companion-actions" data-first-run-character-actions hidden>
<button type="button" class="word-companion-primary-action" data-first-run-create-characters>Create Selected Characters</button>
<button type="button" data-first-run-skip-characters>Skip Character Creation</button>
<button type="button" data-first-run-continue hidden>Continue</button>
</div>
</section>
<div class="word-companion-actions" data-first-run-import-actions hidden>

View File

@ -31,6 +31,7 @@
const firstRunCharacterActions = document.querySelector("[data-first-run-character-actions]");
const firstRunCreateCharactersButton = document.querySelector("[data-first-run-create-characters]");
const firstRunSkipCharactersButton = document.querySelector("[data-first-run-skip-characters]");
const firstRunContinueButton = document.querySelector("[data-first-run-continue]");
const firstRunImportActions = document.querySelector("[data-first-run-import-actions]");
const firstRunImportButton = document.querySelector("[data-first-run-import]");
const firstRunImportCancelButton = document.querySelector("[data-first-run-import-cancel]");
@ -186,6 +187,8 @@
let firstRunImportStructure = null;
let firstRunCharacterCandidatesModel = [];
let firstRunStructureImported = false;
let firstRunCharacterStepActive = false;
let firstRunCharacterStepActivatedAt = 0;
let isFirstRunImporting = false;
let isCreatingFirstRunCharacters = false;
let isApplyingStructureSync = false;
@ -1021,6 +1024,7 @@
const updateFirstRunButtons = () => {
const project = selectedFirstRunProject();
const book = selectedFirstRunBook();
const characterStepReady = firstRunCharacterStepActive && Date.now() - firstRunCharacterStepActivatedAt >= 750;
if (firstRunScanButton) {
firstRunScanButton.disabled = !project || !book || isFirstRunImporting;
}
@ -1031,7 +1035,9 @@
firstRunImportButton.disabled = !firstRunAnalysis?.canImport || !firstRunImportStructure || isFirstRunImporting;
}
if (firstRunCreateCharactersButton) {
firstRunCreateCharactersButton.disabled = isCreatingFirstRunCharacters || selectedFirstRunCharacterNames().length === 0;
firstRunCreateCharactersButton.disabled = !characterStepReady
|| isCreatingFirstRunCharacters
|| selectedFirstRunCharacterNames().length === 0;
}
};
@ -1091,6 +1097,8 @@
firstRunImportStructure = null;
firstRunCharacterCandidatesModel = [];
firstRunStructureImported = false;
firstRunCharacterStepActive = false;
firstRunCharacterStepActivatedAt = 0;
setHidden(firstRunSummary, true);
setHidden(firstRunImportActions, true);
setHidden(firstRunCharacterSection, true);
@ -1125,6 +1133,9 @@
firstRunCharacterCandidates.innerHTML = "";
setHidden(firstRunCharacterSection, false);
setHidden(firstRunCharacterActions, !firstRunStructureImported || firstRunCharacterCandidatesModel.length === 0);
setHidden(firstRunCreateCharactersButton, false);
setHidden(firstRunSkipCharactersButton, false);
setHidden(firstRunContinueButton, true);
if (firstRunCharacterCandidatesModel.length === 0) {
setText(firstRunCharacterStatus, "No likely major characters found.");
@ -2693,6 +2704,8 @@
await loadBooks(response.projectId, response.bookId);
setConnectionStatus("Connected");
firstRunStructureImported = true;
firstRunCharacterStepActive = discoveredCharacters.length > 0;
firstRunCharacterStepActivatedAt = firstRunCharacterStepActive ? Date.now() : 0;
firstRunCharacterCandidatesModel = discoveredCharacters;
if (discoveredCharacters.length > 0) {
setFirstRunMode(true);
@ -2701,8 +2714,18 @@
setHidden(firstRunCharacterActions, false);
setFirstRunStatus(response.message || "Manuscript structure imported.");
setDocumentMessage(response.message || "Manuscript structure imported.");
window.setTimeout(updateFirstRunButtons, 750);
} else {
setFirstRunMode(false);
setFirstRunMode(true);
setHidden(firstRunSummary, true);
setHidden(firstRunImportActions, true);
setHidden(firstRunCharacterSection, false);
setHidden(firstRunCharacterActions, false);
setHidden(firstRunCreateCharactersButton, true);
setHidden(firstRunSkipCharactersButton, true);
setHidden(firstRunContinueButton, false);
setText(firstRunCharacterStatus, "No likely characters found.");
setFirstRunStatus(response.message || "Manuscript structure imported.");
setDocumentMessage(response.message || "Manuscript structure imported.");
}
} catch (error) {
@ -2715,15 +2738,23 @@
};
const finishFirstRunOnboarding = () => {
firstRunCharacterStepActive = false;
firstRunCharacterStepActivatedAt = 0;
firstRunCharacterCandidatesModel = [];
if (firstRunCharacterCandidates) {
firstRunCharacterCandidates.innerHTML = "";
}
setHidden(firstRunCharacterSection, true);
setFirstRunMode(false);
setFirstRunStatus("");
setHidden(firstRunCharacterActions, true);
loadRuntimeDocumentAwareness();
};
const createFirstRunCharacters = async () => {
const project = selectedFirstRunProject() || selectedProject();
const candidateNames = selectedFirstRunCharacterNames();
if (!project || candidateNames.length === 0) {
if (!firstRunCharacterStepActive || Date.now() - firstRunCharacterStepActivatedAt < 750 || !project || candidateNames.length === 0) {
updateFirstRunButtons();
return;
}
@ -4201,6 +4232,7 @@
firstRunImportButton?.addEventListener("click", importFirstRunManuscript);
firstRunCreateCharactersButton?.addEventListener("click", createFirstRunCharacters);
firstRunSkipCharactersButton?.addEventListener("click", finishFirstRunOnboarding);
firstRunContinueButton?.addEventListener("click", finishFirstRunOnboarding);
firstRunCancelButton?.addEventListener("click", () => setFirstRunMode(false));
firstRunImportCancelButton?.addEventListener("click", () => resetFirstRunPreview("Import cancelled."));

File diff suppressed because one or more lines are too long