From 17aa4afc0424144e6c3f1790d0ee99d85b3fd9ef Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Tue, 31 Jan 2023 22:16:41 +0800 Subject: [PATCH] refactor editor and panel. --- src/components.d.ts | 4 + src/oj/problem/components/Editor.vue | 52 +++++++-- .../components/{Panel.vue => Submit.vue} | 101 +++++++----------- src/oj/problem/detail.vue | 3 - src/oj/store/contest.ts | 1 + src/oj/submission/detail.vue | 12 ++- src/shared/Copy.vue | 8 +- src/shared/Header.vue | 8 +- 8 files changed, 115 insertions(+), 74 deletions(-) rename src/oj/problem/components/{Panel.vue => Submit.vue} (68%) diff --git a/src/components.d.ts b/src/components.d.ts index 0fbb508..c4e0309 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -11,6 +11,9 @@ declare module '@vue/runtime-core' { IEpCaretRight: typeof import('~icons/ep/caret-right')['default'] IEpLoading: typeof import('~icons/ep/loading')['default'] IEpLock: typeof import('~icons/ep/lock')['default'] + IEpMenu: typeof import('~icons/ep/menu')['default'] + IEpMore: typeof import('~icons/ep/more')['default'] + IEpMoreFilled: typeof import('~icons/ep/more-filled')['default'] NAlert: typeof import('naive-ui')['NAlert'] NButton: typeof import('naive-ui')['NButton'] NButtonGroup: typeof import('naive-ui')['NButtonGroup'] @@ -36,6 +39,7 @@ declare module '@vue/runtime-core' { NModal: typeof import('naive-ui')['NModal'] NNotificationProvider: typeof import('naive-ui')['NNotificationProvider'] NPagination: typeof import('naive-ui')['NPagination'] + NPopover: typeof import('naive-ui')['NPopover'] NScrollbar: typeof import('naive-ui')['NScrollbar'] NSelect: typeof import('naive-ui')['NSelect'] NSpace: typeof import('naive-ui')['NSpace'] diff --git a/src/oj/problem/components/Editor.vue b/src/oj/problem/components/Editor.vue index b26dd44..dab3ffb 100644 --- a/src/oj/problem/components/Editor.vue +++ b/src/oj/problem/components/Editor.vue @@ -3,12 +3,17 @@ import { SOURCES } from "utils/constants" import { Problem } from "utils/types" import Monaco from "~/shared/Monaco.vue" import { code } from "oj/composables/code" +import { isDesktop, isMobile } from "~/shared/composables/breakpoints" +import { DropdownOption } from "naive-ui" + +const Submit = defineAsyncComponent(() => import("./Submit.vue")) interface Props { problem: Problem } const props = defineProps() +const router = useRouter() code.language = props.problem.languages[0] || "C" code.value = props.problem.template[code.language] || SOURCES[code.language] @@ -22,8 +27,10 @@ function reset() { function change(value: string) { code.value = value } - -const options = props.problem.languages.map((it) => ({ +function goSubmissions() { + router.push(`/submission?problem=${props.problem._id}`) +} +const options: DropdownOption[] = props.problem.languages.map((it) => ({ label: () => [ h("img", { src: `/${it}.svg`, @@ -38,11 +45,27 @@ const options = props.problem.languages.map((it) => ({ ], value: it, })) + +const menu: DropdownOption[] = [ + { label: "重置", key: "reset" }, + { label: "提交信息", key: "submissions" }, +] + +function select(key: string) { + switch (key) { + case "reset": + reset() + break + case "submissions": + goSubmissions() + break + } +} diff --git a/src/oj/problem/components/Panel.vue b/src/oj/problem/components/Submit.vue similarity index 68% rename from src/oj/problem/components/Panel.vue rename to src/oj/problem/components/Submit.vue index 32d60ee..f3185f4 100644 --- a/src/oj/problem/components/Panel.vue +++ b/src/oj/problem/components/Submit.vue @@ -1,5 +1,4 @@ diff --git a/src/oj/problem/detail.vue b/src/oj/problem/detail.vue index 6813fd5..3bd5922 100644 --- a/src/oj/problem/detail.vue +++ b/src/oj/problem/detail.vue @@ -4,7 +4,6 @@ import { isDesktop, isMobile } from "~/shared/composables/breakpoints" import { Problem } from "utils/types" const Editor = defineAsyncComponent(() => import("./components/Editor.vue")) -const Panel = defineAsyncComponent(() => import("./components/Panel.vue")) const ProblemContent = defineAsyncComponent( () => import("./components/ProblemContent.vue") ) @@ -42,7 +41,6 @@ provide("problem", readonly(problem)) - - diff --git a/src/oj/store/contest.ts b/src/oj/store/contest.ts index 53fa7ac..46576e2 100644 --- a/src/oj/store/contest.ts +++ b/src/oj/store/contest.ts @@ -49,6 +49,7 @@ export const useContestStore = defineStore("contest", () => { } async function _getProblems(contestID: string) { + problems.value = [] try { problems.value = await getContestProblem(contestID) } catch (err) { diff --git a/src/oj/submission/detail.vue b/src/oj/submission/detail.vue index dccb45a..85b1513 100644 --- a/src/oj/submission/detail.vue +++ b/src/oj/submission/detail.vue @@ -16,12 +16,20 @@ const props = defineProps<{ }>() const submission = ref() +const [copied, toggle] = useToggle() +const { start } = useTimeoutFn(() => toggle(false), 1000, { immediate: false }) async function init() { const res = await getSubmission(props.submissionID) submission.value = res.data } +function handleCopy(v: string) { + copy(v) + toggle(true) + start() +} + const columns: DataTableColumn[] = [ { title: "测试用例", key: "test_case" }, { @@ -59,7 +67,9 @@ onMounted(init) - 复制代码 + + {{ copied ? "已复制" : "复制代码" }} + {{ copied ? "已复制" : "复制" }} + diff --git a/src/shared/Header.vue b/src/shared/Header.vue index 2182fb3..cc65078 100644 --- a/src/shared/Header.vue +++ b/src/shared/Header.vue @@ -107,7 +107,13 @@ const options = computed>(() => [ 注册 - 菜单 + + +