diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index c5a094e57..40dcd304e 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.23.24", + "version": "2.23.25", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index bdc70fed2..8a0be0c9e 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -218,7 +218,7 @@ class ContestEditHandler extends ContestHandler { domainId: string, beginAtDate: string, beginAtTime: string, duration: number, title: string, content: string, rule: string, _pids: string, rated = false, ) { - let pids = _pids.split(',').map((i) => { + let pids = _pids.replace(/,/g, ',').split(',').map((i) => { if (isSafeInteger(parseInt(i, 10))) return parseInt(i, 10); return i; }); @@ -422,7 +422,7 @@ class ContestCreateHandler extends ContestHandler { domainId: string, beginAtDate: string, beginAtTime: string, duration: number, title: string, content: string, rule: string, _pids: string, rated = false, ) { - let pids = _pids.split(',').map((i) => { + let pids = _pids.replace(/,/g, ',').split(',').map((i) => { if (isSafeInteger(parseInt(i, 10))) return parseInt(i, 10); return i; }); diff --git a/packages/hydrooj/src/handler/homework.ts b/packages/hydrooj/src/handler/homework.ts index 8cd2cc398..9fa314fe0 100644 --- a/packages/hydrooj/src/handler/homework.ts +++ b/packages/hydrooj/src/handler/homework.ts @@ -244,7 +244,7 @@ class HomeworkCreateHandler extends HomeworkHandler { penaltySinceDate: string, penaltySinceTime: string, extensionDays: number, penaltyRules: PenaltyRules, title: string, content: string, _pids: string, rated = false, ) { - const pids = _pids.split(',').map((i) => { + const pids = _pids.replace(/,/g, ',').split(',').map((i) => { if (isSafeInteger(parseInt(i, 10))) return parseInt(i, 10); return i; }); @@ -311,7 +311,7 @@ class HomeworkEditHandler extends HomeworkHandler { penaltySinceDate: string, penaltySinceTime: string, extensionDays: number, penaltyRules: string, title: string, content: string, _pids: string, rated = false, ) { - const pids = _pids.split(',').map((i) => { + const pids = _pids.replace(/,/g, ',').split(',').map((i) => { if (isSafeInteger(parseInt(i, 10))) return parseInt(i, 10); return i; }); diff --git a/packages/ui-default/components/autocomplete/index.js b/packages/ui-default/components/autocomplete/index.js index 0fb335cf6..a9695aaf4 100644 --- a/packages/ui-default/components/autocomplete/index.js +++ b/packages/ui-default/components/autocomplete/index.js @@ -95,16 +95,21 @@ export default class AutoComplete extends DOMAttachedObject { onItemClick(ev) { const idx = $(ev.currentTarget).attr('data-idx'); - if (idx === undefined) { - return; - } + if (idx === undefined) return; const item = this.currentItems[idx]; const text = this.options.text(item); this._value = item; this.$dom.trigger('vjAutoCompleteSelect', item); if (text != null) { if (!this.options.multi) this.$dom.val(text); - else this.$dom.val(`${this.$dom.val() + text}, `); + else { + const current = this.$dom.val().replace(/,/g, ','); + if (current.indexOf(',') !== -1) { + const items = current.split(','); + items[items.length - 1] = text; + this.$dom.val(items.join(', ')); + } else this.$dom.val(`${text}, `); + } } this.close(); } @@ -150,24 +155,23 @@ export default class AutoComplete extends DOMAttachedObject { } close() { - if (!this.isOpen) { - return; - } + if (!this.isOpen) return; this.dropInstance.close(); this.isOpen = false; } updateOpenState() { - if (this.isFocus && this.$dom.val().length >= this.options.minChar) { + let content = this.$dom.val(); + if (this.options.multi) { + content = content.split(','); + content = content[content.length - 1].trim(); + } + if (this.isFocus && content >= this.options.minChar) { if (!this.isOpen) { this.open(); this.renderList(); } - } else { - if (this.isOpen) { - this.close(); - } - } + } else if (this.isOpen) this.close(); } detach() { diff --git a/packages/ui-default/components/form/form.page.js b/packages/ui-default/components/form/form.page.js index 6b801d16a..20295b17e 100644 --- a/packages/ui-default/components/form/form.page.js +++ b/packages/ui-default/components/form/form.page.js @@ -1,5 +1,5 @@ import { AutoloadPage } from 'vj/misc/Page'; -import delay from 'vj/utils/delay' +import delay from 'vj/utils/delay'; const formPage = new AutoloadPage('formPage', () => { $(document).on('vjFormDisableUpdate', 'input, select, textarea', (ev) => { @@ -13,13 +13,14 @@ const formPage = new AutoloadPage('formPage', () => { }); const submitting = {}; - - $('[type="submit"]').on('click', async (ev) => { - if (!submitting[ev.currentTarget]) $(ev.currentTarget).closest('form').submit(); + $(document).on('click', '[type="submit"]', (ev) => { + const $dom = $(ev.currentTarget); + if ($dom.attr('name') && $dom.attr('value')) return; + ev.preventDefault(); + if (!submitting[ev.currentTarget]) $dom.closest('form').trigger('submit'); submitting[ev.currentTarget] = true; - await delay(5000); - submitting[ev.currentTarget] = false; - }) + delay(5000).then(() => { submitting[ev.currentTarget] = false; }); + }); }); export default formPage; diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index a02931f10..9fd3d84ad 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.6.11", + "version": "4.6.12", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/pages/contest_edit.page.js b/packages/ui-default/pages/contest_edit.page.js index 6aeeb3e67..876a27160 100644 --- a/packages/ui-default/pages/contest_edit.page.js +++ b/packages/ui-default/pages/contest_edit.page.js @@ -6,7 +6,7 @@ import i18n from 'vj/utils/i18n'; import request from 'vj/utils/request'; const page = new NamedPage(['contest_edit', 'contest_create', 'homework_create', 'homework_edit'], (pagename) => { - ProblemSelectAutoComplete.getOrConstruct($('[name="pids"]'), { multi: true }); + ProblemSelectAutoComplete.getOrConstruct($('[name="pids"]'), { multi: true, clearDefaultValue: false }); if (pagename.endsWith('edit')) { let confirmed = false; $(document).on('click', '[name="operation"]', (ev) => {