Skip to content

Commit 674ce1b

Browse files
committed
Add better local schema handling
1 parent a63a750 commit 674ce1b

2 files changed

Lines changed: 50 additions & 31 deletions

File tree

index.html

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,6 @@ <h1 class="mb-1">MLB LED Scoreboard Config Editor</h1>
2929
<option value="config-gen-schemas">config-gen-schemas (Testing)</option>
3030
</select>
3131
</div>
32-
<div class="d-flex align-items-center gap-3 mb-3">
33-
<span>Or load local schema:</span>
34-
<input type="file" id="local-schema-input" accept=".json" class="d-none">
35-
<button class="btn btn-outline-secondary btn-sm" id="local-schema-btn">
36-
<i class="bi bi-folder2-open"></i> Choose file...
37-
</button>
38-
<span id="local-schema-name" class="text-secondary small"></span>
39-
</div>
40-
4132
<ul class="nav nav-tabs mb-4" role="tablist">
4233
<li class="nav-item">
4334
<button class="nav-link active" data-bs-toggle="tab" data-bs-target="#tab-config" type="button">config.json</button>
@@ -51,6 +42,9 @@ <h1 class="mb-1">MLB LED Scoreboard Config Editor</h1>
5142
<li class="nav-item">
5243
<button class="nav-link" data-bs-toggle="tab" data-bs-target="#tab-wxhy" type="button">coordinates/wXhY.json</button>
5344
</li>
45+
<li class="nav-item">
46+
<button class="nav-link" data-bs-toggle="tab" data-bs-target="#tab-local" type="button">Local Schema</button>
47+
</li>
5448
</ul>
5549

5650
<div class="tab-content">
@@ -113,11 +107,11 @@ <h1 class="mb-1">MLB LED Scoreboard Config Editor</h1>
113107
<div class="d-flex align-items-center gap-3 mb-4">
114108
<label for="size-select" class="text-secondary mb-0">Matrix dimensions:</label>
115109
<select id="size-select" class="form-select form-select-sm w-auto">
116-
<option value="w32h32">w32h32</option>
110+
<option value="w32h32" selected>w32h32</option>
117111
<option value="w64h32">w64h32</option>
118112
<option value="w64h64">w64h64</option>
119113
<option value="w128h32">w128h32</option>
120-
<option value="w128h64" selected>w128h64</option>
114+
<option value="w128h64">w128h64</option>
121115
<option value="w192h64">w192h64</option>
122116
</select>
123117
</div>
@@ -138,6 +132,31 @@ <h1 class="mb-1">MLB LED Scoreboard Config Editor</h1>
138132
</div>
139133
</div>
140134

135+
<div class="tab-pane fade" id="tab-local">
136+
<div class="d-flex align-items-center gap-3 mb-4">
137+
<input type="file" id="local-schema-input" accept=".json" class="d-none">
138+
<button class="btn btn-outline-secondary btn-sm" id="local-schema-btn">
139+
<i class="bi bi-folder2-open"></i> Choose file...
140+
</button>
141+
<span id="local-schema-name" class="text-secondary small"></span>
142+
</div>
143+
<div class="row">
144+
<div class="col-lg-7">
145+
<div id="jedison-local"></div>
146+
</div>
147+
<div class="col-lg-5">
148+
<div class="sticky-top pt-2">
149+
<div class="d-flex gap-2 mt-2">
150+
<button class="btn btn-primary btn-sm download-btn" data-target="output-local" data-filename="">Download</button>
151+
<button class="btn btn-secondary btn-sm copy-btn" data-target="output-local">Copy</button>
152+
</div>
153+
<p class="text-secondary small mb-1" id="local-output-label"></p>
154+
<textarea id="output-local" class="json-output form-control font-monospace" wrap="off" readonly></textarea>
155+
</div>
156+
</div>
157+
</div>
158+
</div>
159+
141160
</div>
142161
</div>
143162

src/main.js

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ function createEditor(schema, data, containerId, outputId) {
105105

106106
function 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+
128131
function 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

213222
init();
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

224226
const localSchemaInput = document.querySelector('#local-schema-input');
225227
const localSchemaBtn = document.querySelector('#local-schema-btn');
226228
const 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

228232
localSchemaBtn.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(/\.schema\.json$/, '.json');
240+
localDownloadBtn.dataset.filename = file.name.replace(/\.schema\.json$/, '.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

Comments
 (0)