diff --git a/packages/ui-default/components/editor/index.js b/packages/ui-default/components/editor/index.js index 9404294d4..3ec3cc9aa 100644 --- a/packages/ui-default/components/editor/index.js +++ b/packages/ui-default/components/editor/index.js @@ -119,7 +119,7 @@ export default class Editor extends DOMAttachedObject { value(val) { this.ensureValid(); - if (val) return this.editor.setValue(val); + if (typeof val === 'string') return this.editor.setValue(val); return this.editor.getValue(); } diff --git a/packages/ui-default/components/tab/Tab.js b/packages/ui-default/components/tab/Tab.js index d73c5e9fb..fc134dd1b 100644 --- a/packages/ui-default/components/tab/Tab.js +++ b/packages/ui-default/components/tab/Tab.js @@ -13,7 +13,7 @@ export default class Tab extends DOMAttachedObject { } static initEventListeners() { - $(document).on('click', '.section__tab-header-item', (ev) => { + $(document).on('click', '[data-tab-index]', (ev) => { const targetIndex = $(ev.currentTarget).attr('data-tab-index'); const $container = $(ev.currentTarget).closest('.section__tab-container'); const tabInstance = Tab.get($container); @@ -61,19 +61,21 @@ export default class Tab extends DOMAttachedObject { // 2. Animate transition $currentTab - .transition({ - opacity: 0, - }, { - duration: TAB_TRANSITION_DURATION, - easing: 'linear', - }); + .transition( + { opacity: 0 }, + { + duration: TAB_TRANSITION_DURATION, + easing: 'linear', + } + ); $newTab - .transition({ - opacity: 1, - }, { - duration: TAB_TRANSITION_DURATION, - easing: 'linear', - }); + .transition( + { opacity: 1 }, + { + duration: TAB_TRANSITION_DURATION, + easing: 'linear', + } + ); await this.$content .transition({ x: animateParameter.to, @@ -97,9 +99,7 @@ export default class Tab extends DOMAttachedObject { } attach() { - if (this.attached) { - return false; - } + if (this.attached) return false; const $container = this.$dom .closest('.section__tab-container'); diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index d64481778..68d188391 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.6.31", + "version": "4.6.32", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/pages/problem_edit.page.js b/packages/ui-default/pages/problem_edit.page.js index 13d247daf..0e3268e1f 100644 --- a/packages/ui-default/pages/problem_edit.page.js +++ b/packages/ui-default/pages/problem_edit.page.js @@ -177,14 +177,17 @@ export default new NamedPage(['problem_create', 'problem_edit'], (pagename) => { }); }, 50); - const $main = $('textarea[data-markdown-upload]'); - let content = $main.val(); + const $main = $('textarea[data-editor]'); + const $field = $('textarea[data-markdown-upload]'); + let content = $field.val(); let isObject = false; + let activeTab = $('[data-lang]').first().attr('data-lang'); try { content = JSON.parse(content); isObject = !(content instanceof Array); if (!isObject) content = JSON.stringify(content); } catch (e) { } + if (!isObject) content = { [activeTab]: content }; const upload = { accept: 'image/*,.mp3, .wav, .zip', url: './files', @@ -229,30 +232,35 @@ export default new NamedPage(['problem_create', 'problem_edit'], (pagename) => { }, validate: () => (pagename === 'problem_create' ? i18n('Cannot upload file before problem is created.') : true), }; - $('textarea[data-content]').each(function () { - const $dom = $(this); - let i = $dom.attr('data-content'); + function getContent(lang) { let c = ''; - if (isObject) { - if (content[i]) c = content[i]; - else { - const list = Object.keys(content).filter((l) => l.startsWith(i)); - if (list.length) c = content[list[0]]; - [i] = list; - } - } else c = content; - if (typeof c !== 'string') c = JSON.stringify(c); - $dom.val(c); - function onChange(val) { - if (!isObject) { - content = { [i]: val }; - isObject = true; - } - const empty = /^\s*$/g.test(val); - if (empty) delete content[i]; - else content[i] = val; - $main.val(JSON.stringify(content)); + if (content[lang]) c = content[lang]; + else { + const list = Object.keys(content).filter((l) => l.startsWith(lang)); + if (list.length) c = content[list[0]]; } - Editor.getOrConstruct($dom, { upload, onChange }); + if (typeof c !== 'string') c = JSON.stringify(c); + return c; + } + $main.val(getContent(activeTab)); + function onChange(val) { + console.log('onChange', activeTab, val); + try { + val = JSON.parse(val); + if (!(val instanceof Array)) val = JSON.stringify(val); + } catch { } + const empty = /^\s*$/g.test(val); + if (empty) delete content[activeTab]; + else content[activeTab] = val; + console.log(content); + if (!Object.keys(content).length) $field.text(''); + else $field.text(JSON.stringify(content)); + } + const editor = Editor.getOrConstruct($main, { upload, onChange }); + $('[data-lang]').on('click', (ev) => { + const lang = $(ev.currentTarget).attr('data-lang'); + activeTab = lang; + const val = getContent(lang); + editor.value(val); }); }); diff --git a/packages/ui-default/templates/problem_edit.html b/packages/ui-default/templates/problem_edit.html index 2ef188ff8..c93c38e1a 100644 --- a/packages/ui-default/templates/problem_edit.html +++ b/packages/ui-default/templates/problem_edit.html @@ -38,29 +38,18 @@ value:pdoc['tag']|default([])|join(', ') }) }}
-
+