diff --git a/src/app/ErrorsView.ts b/src/app/ErrorsView.ts
new file mode 100644
index 00000000..41c5d2d1
--- /dev/null
+++ b/src/app/ErrorsView.ts
@@ -0,0 +1,17 @@
+import { AbstractView, Path, locale } from "minecraft-schemas";
+
+export class ErrorsView extends AbstractView {
+ render(): void {
+ this.target.style.display = this.model.errors.count() > 0 ? 'flex' : 'none'
+
+ const errors = this.model.errors.get(new Path())
+ this.target.children[0].innerHTML = errors.map(err =>
+ `
+
+
${err.path.toString()}
+
-
+
${locale(err.error, err.params)}
+
`
+ ).join('')
+ }
+}
diff --git a/src/app/app.ts b/src/app/app.ts
index 2b981d74..e54f875f 100644
--- a/src/app/app.ts
+++ b/src/app/app.ts
@@ -16,6 +16,7 @@ import {
import Split from 'split.js'
import { SandboxSchema } from './Sandbox'
+import { ErrorsView } from './ErrorsView'
const LOCAL_STORAGE_THEME = 'theme'
@@ -51,6 +52,12 @@ const registries = [
'structure_feature'
]
+const treeViewObserver = (el: HTMLElement) => {
+ el.querySelectorAll('.node-header[data-error]').forEach(e => {
+ e.insertAdjacentHTML('beforeend', ``)
+ })
+}
+
const publicPath = process.env.NODE_ENV === 'production' ? '/dev/' : '/';
Promise.all([
fetch(publicPath + 'locales/schema/en.json').then(r => r.json()),
@@ -60,13 +67,15 @@ Promise.all([
LOCALES.register('en', {...responses[0], ...responses[1]})
const selectedModel = document.getElementById('selected-model')!
- const modelSelector = (document.getElementById('model-selector') as HTMLInputElement)
+ const modelSelector = document.getElementById('model-selector')!
const modelSelectorMenu = document.getElementById('model-selector-menu')!
const languageSelector = document.getElementById('language-selector')!
const languageSelectorMenu = document.getElementById('language-selector-menu')!
const themeSelector = document.getElementById('theme-selector')!
const treeViewEl = document.getElementById('tree-view')!
const sourceViewEl = document.getElementById('source-view')!
+ const errorsViewEl = document.getElementById('errors-view')!
+ const errorsToggle = document.getElementById('errors-toggle')!
const sourceViewOutput = (document.getElementById('source-view-output') as HTMLTextAreaElement)
const sourceControlsToggle = document.getElementById('source-controls-toggle')!
const sourceControlsMenu = document.getElementById('source-controls-menu')!
@@ -86,8 +95,14 @@ Promise.all([
}
const views: { [key: string]: IView } = {
- 'tree': new TreeView(models[selected], treeViewEl),
- 'source': new SourceView(models[selected], sourceViewOutput, {indentation: 2})
+ 'tree': new TreeView(models[selected], treeViewEl, {
+ showErrors: true,
+ observer: treeViewObserver
+ }),
+ 'source': new SourceView(models[selected], sourceViewOutput, {
+ indentation: 2
+ }),
+ 'errors': new ErrorsView(models[selected], errorsViewEl)
}
const updateModel = (newModel: string) => {
@@ -208,5 +223,15 @@ Promise.all([
downloadAnchor.click()
})
+ errorsToggle.addEventListener('click', evt => {
+ if (errorsViewEl.classList.contains('hidden')) {
+ errorsViewEl.classList.remove('hidden')
+ errorsToggle.classList.remove('toggled')
+ } else {
+ errorsViewEl.classList.add('hidden')
+ errorsToggle.classList.add('toggled')
+ }
+ })
+
document.body.style.visibility = 'initial'
})
diff --git a/src/generator.html b/src/generator.html
index c581ba70..b67c04e7 100644
--- a/src/generator.html
+++ b/src/generator.html
@@ -11,7 +11,7 @@