@@ -105,6 +105,7 @@ function createEditor(schema, data, containerId, outputId) {
105105
106106function initEditor ( { schemaUrl, exampleUrl, containerId, outputId } ) {
107107 const container = document . querySelector ( `#${ containerId } ` ) ;
108+ container . innerHTML = '<div class="loader"></div>' ;
108109
109110 loadEditorData ( schemaUrl , exampleUrl )
110111 . then ( ( { schema, data } ) => createEditor ( schema , data , containerId , outputId ) )
@@ -125,7 +126,13 @@ function initCoordinatesEditor(repoBase, size) {
125126 } ) ;
126127}
127128
129+ let editorsController = null ;
130+
128131function initEditors ( version ) {
132+ if ( editorsController ) editorsController . abort ( ) ;
133+ editorsController = new AbortController ( ) ;
134+ const { signal } = editorsController ;
135+
129136 const REPO_BASE = `https://raw.githubusercontent.com/MLB-LED-Scoreboard/mlb-led-scoreboard/${ version } ` ;
130137
131138 const lazyEditors = {
@@ -169,7 +176,7 @@ function initEditors(version) {
169176 if ( activeTab ) maybeInit ( activeTab . dataset . bsTarget ?. slice ( 1 ) ) ;
170177
171178 document . querySelectorAll ( '[data-bs-toggle="tab"]' ) . forEach ( btn => {
172- btn . addEventListener ( 'shown.bs.tab' , ( ) => maybeInit ( btn . dataset . bsTarget . slice ( 1 ) ) ) ;
179+ btn . addEventListener ( 'shown.bs.tab' , ( ) => maybeInit ( btn . dataset . bsTarget . slice ( 1 ) ) , { signal } ) ;
173180 } ) ;
174181
175182 const sizeSelect = document . querySelector ( '#size-select' ) ;
@@ -180,7 +187,7 @@ function initEditors(version) {
180187 sizeLabel . textContent = sizeSelect . value ;
181188 wxhyDownload . dataset . filename = `${ sizeSelect . value } .json` ;
182189 initCoordinatesEditor ( REPO_BASE , sizeSelect . value ) ;
183- } ) ;
190+ } , { signal } ) ;
184191}
185192
186193// --- Bootstrap version selector ---
@@ -203,27 +210,24 @@ async function init() {
203210 versionSelect . value = version ;
204211
205212 versionSelect . addEventListener ( 'change' , ( ) => {
206- params . set ( 'version' , versionSelect . value ) ;
207- window . location . search = params . toString ( ) ;
213+ const p = new URLSearchParams ( window . location . search ) ;
214+ p . set ( 'version' , versionSelect . value ) ;
215+ history . replaceState ( null , '' , '?' + p . toString ( ) ) ;
216+ initEditors ( versionSelect . value ) ;
208217 } ) ;
209218
210219 initEditors ( version ) ;
211220}
212221
213222init ( ) ;
214223
215- // --- Local schema file picker ---
216-
217- const TAB_EDITOR_MAP = {
218- 'tab-config' : { containerId : 'jedison-config' , outputId : 'output-config' } ,
219- 'tab-teams' : { containerId : 'jedison-teams' , outputId : 'output-teams' } ,
220- 'tab-scoreboard' : { containerId : 'jedison-scoreboard' , outputId : 'output-scoreboard' } ,
221- 'tab-wxhy' : { containerId : 'jedison-wxhy' , outputId : 'output-wxhy' }
222- } ;
224+ // --- Local schema tab ---
223225
224226const localSchemaInput = document . querySelector ( '#local-schema-input' ) ;
225227const localSchemaBtn = document . querySelector ( '#local-schema-btn' ) ;
226228const localSchemaName = document . querySelector ( '#local-schema-name' ) ;
229+ const localOutputLabel = document . querySelector ( '#local-output-label' ) ;
230+ const localDownloadBtn = document . querySelector ( '.download-btn[data-target="output-local"]' ) ;
227231
228232localSchemaBtn . addEventListener ( 'click' , ( ) => localSchemaInput . click ( ) ) ;
229233
@@ -232,14 +236,10 @@ localSchemaInput.addEventListener('change', async () => {
232236 if ( ! file ) return ;
233237
234238 localSchemaName . textContent = file . name ;
239+ localOutputLabel . textContent = file . name . replace ( / \. s c h e m a \. j s o n $ / , '.json' ) ;
240+ localDownloadBtn . dataset . filename = file . name . replace ( / \. s c h e m a \. j s o n $ / , '.json' ) ;
235241
236- const activeTabBtn = document . querySelector ( '.nav-link.active[data-bs-target]' ) ;
237- const tabId = activeTabBtn ?. dataset . bsTarget ?. slice ( 1 ) ;
238- const editorConfig = TAB_EDITOR_MAP [ tabId ] ;
239- if ( ! editorConfig ) return ;
240-
241- const { containerId, outputId } = editorConfig ;
242- const container = document . querySelector ( `#${ containerId } ` ) ;
242+ const container = document . querySelector ( '#jedison-local' ) ;
243243 container . innerHTML = '<div class="loader"></div>' ;
244244
245245 try {
@@ -250,7 +250,7 @@ localSchemaInput.addEventListener('change', async () => {
250250 await refParser . dereference ( schema ) ;
251251 refParser . expandRecursive ( schema ) ;
252252
253- createEditor ( schema , null , containerId , outputId ) ;
253+ createEditor ( schema , null , 'jedison-local' , 'output-local' ) ;
254254 } catch ( err ) {
255255 container . textContent = `Failed to load local schema: ${ err . message } ` ;
256256 }
0 commit comments