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

File diff suppressed because one or more lines are too long