diff --git a/src/app/ErrorsView.ts b/src/app/ErrorsView.ts index 528cb161..5297dc38 100644 --- a/src/app/ErrorsView.ts +++ b/src/app/ErrorsView.ts @@ -1,19 +1,14 @@ -import { IView, locale, DataModel, ModelListener } from "minecraft-schemas"; +import { locale, DataModel, ModelListener } from "minecraft-schemas"; import { Errors } from "minecraft-schemas/lib/model/Errors"; -export class ErrorsView implements ModelListener, IView { +export class ErrorsView implements ModelListener { model: DataModel target: HTMLElement constructor(model: DataModel, target: HTMLElement) { this.model = model this.target = target - } - - setModel(newModel: DataModel) { - this.model.removeListener(this) - this.model = newModel - this.model.addListener(this) + model.addListener(this) } errors(errors: Errors): void { diff --git a/src/app/app.ts b/src/app/app.ts index 7a5dc030..6d974c28 100644 --- a/src/app/app.ts +++ b/src/app/app.ts @@ -1,7 +1,6 @@ import Split from 'split.js' import { DataModel, - IView, TreeView, SourceView, ConditionSchema, @@ -11,7 +10,8 @@ import { DimensionTypeSchema, LOCALES, locale, - COLLECTIONS + COLLECTIONS, + ModelListener } from 'minecraft-schemas' import { RegistryFetcher } from './RegistryFetcher' import { SandboxSchema } from './Sandbox' @@ -19,6 +19,8 @@ import { ErrorsView } from './ErrorsView' const LOCAL_STORAGE_THEME = 'theme' +const publicPath = process.env.NODE_ENV === 'production' ? '/dev/' : '/'; + const modelFromPath = (p: string) => p.split('/').filter(e => e.length !== 0).pop() ?? '' const addChecked = (el: HTMLElement) => { @@ -35,6 +37,15 @@ const languages: { [key: string]: string } = { 'zh-CN': '简体中文' } +const models: { [key: string]: DataModel } = { + 'loot-table': new DataModel(LootTableSchema), + 'predicate': new DataModel(ConditionSchema), + 'advancement': new DataModel(AdvancementSchema), + 'dimension': new DataModel(DimensionSchema), + 'dimension-type': new DataModel(DimensionTypeSchema), + 'sandbox': new DataModel(SandboxSchema) +} + const registries = [ 'attribute', 'biome', @@ -60,12 +71,9 @@ const treeViewObserver = (el: HTMLElement) => { e.insertAdjacentHTML('afterbegin', ``) }) el.querySelectorAll('.collapse.open, button.remove').forEach(e => { - e.insertAdjacentHTML('afterbegin', ` - `) + e.insertAdjacentHTML('afterbegin', ``) }) } - -const publicPath = process.env.NODE_ENV === 'production' ? '/dev/' : '/'; Promise.all([ fetch(publicPath + 'locales/schema/en.json').then(r => r.json()), fetch(publicPath + 'locales/app/en.json').then(r => r.json()), @@ -73,6 +81,8 @@ Promise.all([ ]).then(responses => { LOCALES.register('en', {...responses[0], ...responses[1]}) + const homeLink = document.getElementById('home-link')! + const homeGenerators = document.getElementById('home-generators')! const selectedModel = document.getElementById('selected-model')! const modelSelector = document.getElementById('model-selector')! const modelSelectorMenu = document.getElementById('model-selector-menu')! @@ -82,6 +92,7 @@ Promise.all([ const treeViewEl = document.getElementById('tree-view')! const sourceViewEl = document.getElementById('source-view')! const errorsViewEl = document.getElementById('errors-view')! + const homeViewEl = document.getElementById('home-view')! const errorsToggle = document.getElementById('errors-toggle')! const sourceViewOutput = (document.getElementById('source-view-output') as HTMLTextAreaElement) const treeViewOutput = document.getElementById('tree-view-output')! @@ -98,48 +109,33 @@ Promise.all([ const treeControlsUndo = document.getElementById('tree-controls-undo')! const treeControlsRedo = document.getElementById('tree-controls-redo')! - let selected = modelFromPath(location.pathname) - if (selected.length === 0) { - selected = 'loot-table' - } + let selected = '' - const models: { [key: string]: DataModel } = { - 'loot-table': new DataModel(LootTableSchema), - 'predicate': new DataModel(ConditionSchema), - 'advancement': new DataModel(AdvancementSchema), - 'dimension': new DataModel(DimensionSchema), - 'dimension-type': new DataModel(DimensionTypeSchema), - 'sandbox': new DataModel(SandboxSchema) - } + const updateModel = () => { + if (models[selected] === undefined) { + selectedModel.textContent = locale(`title.home`) + } else { + selectedModel.textContent = locale(`title.${selected}`) + new TreeView(models[selected], treeViewOutput, { + showErrors: true, + observer: treeViewObserver + }), + new SourceView(models[selected], sourceViewOutput, { + indentation: 2 + }), + new ErrorsView(models[selected], errorsViewEl) - const views: IView[] = [ - new TreeView(models[selected], treeViewOutput, { - showErrors: true, - observer: treeViewObserver - }), - new SourceView(models[selected], sourceViewOutput, { - indentation: 2 - }), - new ErrorsView(models[selected], errorsViewEl) - ] + models[selected].invalidate() + } - const updateModel = (newModel: string) => { - selected = newModel - views.forEach(v => v.setModel(models[selected])) - selectedModel.textContent = locale(`title.${selected}`) - modelSelectorMenu.innerHTML = '' Object.keys(models).forEach(m => { modelSelectorMenu.insertAdjacentHTML('beforeend', `