diff --git a/components.d.ts b/components.d.ts index 032d8a5..e769ff9 100644 --- a/components.d.ts +++ b/components.d.ts @@ -17,10 +17,11 @@ declare module 'vue' { IconDownloadBtn: typeof import('./src/components/button/IconDownloadBtn.vue')['default'] IconInfoBtn: typeof import('./src/components/button/IconInfoBtn.vue')['default'] IconModifyBtn: typeof import('./src/components/button/IconModifyBtn.vue')['default'] + IconSettingBtn: typeof import('./src/components/button/IconSettingBtn.vue')['default'] LayoutComponent: typeof import('./src/components/common/LayoutComponent.vue')['default'] ListComponent: typeof import('./src/components/home/ListComponent.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] - ViewComponent: typeof import('./src/components/run/experiment/ViewComponent.vue')['default'] + ViewComponent: typeof import('./src/components/run/executions/ViewComponent.vue')['default'] } } diff --git a/package-lock.json b/package-lock.json index ff10a4f..4919381 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@fontsource/roboto": "5.2.5", "@mdi/font": "7.4.47", + "monaco-editor": "^0.52.2", "plotly.js-dist-min": "^3.0.1", "prettier": "^3.5.3", "vue": "^3.5.13", @@ -4166,6 +4167,12 @@ "pathe": "^2.0.1" } }, + "node_modules/monaco-editor": { + "version": "0.52.2", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", diff --git a/package.json b/package.json index 9507b67..9fd5be0 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "@fontsource/roboto": "5.2.5", "@mdi/font": "7.4.47", + "monaco-editor": "^0.52.2", "plotly.js-dist-min": "^3.0.1", "prettier": "^3.5.3", "vue": "^3.5.13", diff --git a/src/components/button/IconSettingBtn.vue b/src/components/button/IconSettingBtn.vue new file mode 100644 index 0000000..858592f --- /dev/null +++ b/src/components/button/IconSettingBtn.vue @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/src/components/run/excutions/ListComponent.vue b/src/components/run/executions/ListComponent.vue similarity index 53% rename from src/components/run/excutions/ListComponent.vue rename to src/components/run/executions/ListComponent.vue index 2bbce78..c0702d1 100644 --- a/src/components/run/excutions/ListComponent.vue +++ b/src/components/run/executions/ListComponent.vue @@ -3,9 +3,10 @@ import IconDeleteBtn from "@/components/button/IconDeleteBtn.vue"; import { onMounted, ref, watch } from "vue"; import FormComponent from "../experiment/FormComponent.vue"; import IconDownloadBtn from "@/components/button/IconDownloadBtn.vue"; - +import ViewComponent from "@/components/run/executions/ViewComponent.vue"; // const store = commonStore(); +const openView = ref(false); const tableHeader = [ { label: "No", width: "5%", style: "word-break: keep-all;" }, { label: "Execution Name", width: "20%", style: "word-break: keep-all;" }, @@ -273,8 +274,9 @@ const changePageNum = (page) => { getData(); }; -const openInfoModal = (selectedItem) => { +const openInfoModal = () => { data.value.modalMode = "info"; + openView.value = true; }; const openModifyModal = (selectedItem) => { data.value.selectedData = selectedItem; @@ -285,7 +287,10 @@ const openDownloadModal = () => { data.value.selectedData = null; data.value.modalMode = "download"; }; - +const closeDetail = () => { + openView.value = false; + selectedExperiment.value = null; +}; const closeModal = () => { data.value.isModalVisible = false; data.value.selectedData = null; @@ -308,7 +313,8 @@ onMounted(() => { - - - - - - - Excutions - - - - - - - - - - - - - - - - - - - - - - mdi-magnify - + + + + + + Executions - + - - - - - 총 {{ data.totalDataLength.toLocaleString() }}개 - - - - + + + + + + + + + + + + + + + + + mdi-magnify + + + + + + + + + 총 {{ data.totalDataLength.toLocaleString() }}개 + + + + + + + + + + Terminate + + + Retry + + + Clone + + + Compare + + + Execution - - Terminate - - - Retry - - - Clone - - - Compare - - - Execution - - - - - - - - - - - - - - - - + + + + + + - {{ item.label }} - - - - - - - - - {{ item.no }} - {{ item.name }} - - mdi-check-circle + + + + + + + - mdi-close-circle - mdi-loading - - {{ item.duration }} - {{ item.experiment }} - {{ item.workflow }} - {{ item.startTime }} - {{ item.registryStatus }} - - - - - - - - - - - - - + {{ item.label }} + + + + + + + + + {{ item.no }} + {{ item.name }} + + mdi-check-circle + mdi-close-circle + mdi-loading + + {{ item.duration }} + {{ item.experiment }} + {{ item.workflow }} + {{ item.startTime }} + {{ item.registryStatus }} + + + + + + + + + + + + + + - - - - - + + + + + diff --git a/src/components/run/executions/ViewComponent.vue b/src/components/run/executions/ViewComponent.vue new file mode 100644 index 0000000..1cf10d3 --- /dev/null +++ b/src/components/run/executions/ViewComponent.vue @@ -0,0 +1,372 @@ + + + + + + + + + + Compare Executions + + + + + Details + Visualizations + + + + + Run Detail + + + + + Run ID: + {{ runA.id }} + {{ runB.id }} + + Run Name: + + {{ runA.name }} + {{ runB.name }} + + Start Name: + + {{ runA.start }} + {{ runB.start }} + + End Name: + + {{ runA.end }} + {{ runB.end }} + + Duration: + + {{ runA.duration }} + {{ runB.duration }} + + + + + Parameters + + + + + alpha + {{ runA.params.alpha }} + {{ runB.params.alpha }} + + + l1_ratio + + {{ runA.params.l1_ratio }} + {{ runB.params.l1_ratio }} + + + + + Metrics + + + + + mae + {{ runA.metrics.mae }} + {{ runA.metrics.mae }} + + r2 + {{ runA.metrics.r2 }} + {{ runA.metrics.r2 }} + rmse + {{ runA.metrics.rmse }} + {{ runA.metrics.rmse }} + + + + + + Tags + + + + + + estimator_class + + {{ runA.tags.estimator_class }} + {{ runA.tags.estimator_class }} + + estimator_name + + {{ runA.tags.estimator_name }} + {{ runA.tags.estimator_name }} + + + + + Artifacts + + + + Back to List + + + + 123213 + + + + + diff --git a/src/components/run/experiment/ListComponent.vue b/src/components/run/experiment/ListComponent.vue index 39a0807..7eed1b7 100644 --- a/src/components/run/experiment/ListComponent.vue +++ b/src/components/run/experiment/ListComponent.vue @@ -7,7 +7,7 @@ import ViewComponent from "@/components/run/experiment/ViewComponent.vue"; // const store = commonStore(); const detailDialog = ref(false); -const viewComponent = ref(false); +const openView = ref(false); const selectedExperiment = ref<{ name: string; description: string; @@ -260,10 +260,10 @@ const openDetail = (item: { createdID: string; }) => { selectedExperiment.value = item; - viewComponent.value = true; + openView.value = true; }; const closeDetail = () => { - viewComponent.value = false; + openView.value = false; selectedExperiment.value = null; }; const openCreateModal = () => { @@ -294,23 +294,7 @@ onMounted(() => { - - + { }, ]; data.value.totalDataLength = 5; + setPaginationLength(); // DeviceService.search(params).then((d) => { // if (d.status === 200) { // data.value.results = d.data.deviceList; @@ -139,16 +141,16 @@ const getData = () => { // }); }; -// const setPaginationLength = () => { -// if (data.value.totalDataLength % data.value.params.pageSize === 0) { -// data.value.pageLength = -// data.value.totalDataLength / data.value.params.pageSize; -// } else { -// data.value.pageLength = Math.ceil( -// data.value.totalDataLength / data.value.params.pageSize, -// ); -// } -// }; +const setPaginationLength = () => { + if (data.value.totalDataLength % data.value.params.pageSize === 0) { + data.value.pageLength = + data.value.totalDataLength / data.value.params.pageSize; + } else { + data.value.pageLength = Math.ceil( + data.value.totalDataLength / data.value.params.pageSize, + ); + } +}; const saveData = (formData) => { if (data.value.modalMode === "create") { @@ -259,33 +261,50 @@ onMounted(() => { Experiment Information - - - - Experiment Name - - {{ experimentInfo.experimentName }} - - - - Project Name - - {{ experimentInfo.projectName }} - - - - Created Date - {{ experimentInfo.createdDate }} - Created ID - {{ experimentInfo.createdId }} - - - Description - - {{ experimentInfo.description }} - - - + + + + + Experiment Name + {{ + experimentInfo.experimentName + }} + + + + + + Project Name + {{ + experimentInfo.projectName + }} + + + + + + Created Date + {{ + experimentInfo.createdDate + }} + Created ID + {{ experimentInfo.createdId }} + + + + + + Description + {{ + experimentInfo.description + }} + diff --git a/src/components/workflow/ListComponent.vue b/src/components/workflow/ListComponent.vue index 1a1ad67..2fd6d9c 100644 --- a/src/components/workflow/ListComponent.vue +++ b/src/components/workflow/ListComponent.vue @@ -1,11 +1,13 @@ - - - - - - - - - - - - - - - - - - - - - - Workflows - - - - - - - - - - - - - - - - mdi-magnify - + + + + + + + + + + + + + + + + + + + + + + + Workflows - + - - - - - 총 {{ data.totalDataLength.toLocaleString() }}개 - - - - + + + + + + + + + + + mdi-magnify + + + + + + + + + 총 {{ data.totalDataLength.toLocaleString() }}개 + + + + + + + + + + 선택 삭제 + + 등록 - - 선택 삭제 - - 등록 - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + {{ item.label }} + + + + + - {{ item.label }} - - - - - - - - - {{ item.no }} - {{ item.name }} - {{ item.version }} - {{ item.stepCount }} - {{ item.configProgress }} - {{ item.kubeflowStatus }} - {{ item.registDt }} - - - - - - - - - - - - + + + + {{ item.no }} + {{ item.name }} + {{ item.version }} + {{ item.stepCount }} + {{ item.configProgress }} + {{ item.kubeflowStatus }} + {{ item.registDt }} + + + + + + + + + + + + + + - - + + + + + diff --git a/src/components/workflow/ViewComponent.vue b/src/components/workflow/ViewComponent.vue new file mode 100644 index 0000000..e924bdb --- /dev/null +++ b/src/components/workflow/ViewComponent.vue @@ -0,0 +1,497 @@ + + + + + + + + + + View Details + + + + + Details + YAML + + + + + Workflow Information + + + + + + Workflow Name + + {{ experimentInfo.workflowName }} + Version + {{ experimentInfo.version }} + + + + + + + Workflow Description + + {{ experimentInfo.workflowDescription }} + + + + + + + Created Date + + {{ experimentInfo.createdDate }} + + Created ID + + {{ experimentInfo.createdId }} + + + + + + + + Step Overview + + + + + + {{ index + 1 }} + + + + + {{ item.status }} + + + + + + Back to List + + + + + + + + + + diff --git a/src/pages/ExcutionsView.vue b/src/pages/ExecutionsView.vue similarity index 58% rename from src/pages/ExcutionsView.vue rename to src/pages/ExecutionsView.vue index 88b551d..510834b 100644 --- a/src/pages/ExcutionsView.vue +++ b/src/pages/ExecutionsView.vue @@ -1,5 +1,5 @@ diff --git a/src/router/index.js b/src/router/index.js index 1c3cf2f..aaa01c3 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -73,13 +73,13 @@ const routes = [ component: () => import("@/pages/ExperimentView.vue"), }, { - name: "Excutions", - path: `/run/excutions`, + name: "Executions", + path: `/run/executions`, meta: { - title: "Excutions", + title: "Executions", requiresAuth: false, }, - component: () => import("@/pages/ExcutionsView.vue"), + component: () => import("@/pages/ExecutionsView.vue"), }, ], }, diff --git a/src/utils/menuUtils.js b/src/utils/menuUtils.js index fc71f9e..aaaac7c 100644 --- a/src/utils/menuUtils.js +++ b/src/utils/menuUtils.js @@ -25,7 +25,7 @@ export const menuUtils = { icon: "mdi-format-list-bulleted-square", depth: [ { title: "Experiment", path: "/run/experiment" }, - { title: "Excutions", path: "/run/excutions" }, + { title: "Executions", path: "/run/executions" }, ], }, { diff --git a/typed-router.d.ts b/typed-router.d.ts index e544b87..3a9e6f4 100644 --- a/typed-router.d.ts +++ b/typed-router.d.ts @@ -21,7 +21,7 @@ declare module 'vue-router/auto-routes' { '/': RouteRecordInfo<'/', '/', Record, Record>, '/DatasetView': RouteRecordInfo<'/DatasetView', '/DatasetView', Record, Record>, '/DeploymentView': RouteRecordInfo<'/DeploymentView', '/DeploymentView', Record, Record>, - '/ExcutionsView': RouteRecordInfo<'/ExcutionsView', '/ExcutionsView', Record, Record>, + '/ExecutionsView': RouteRecordInfo<'/ExecutionsView', '/ExecutionsView', Record, Record>, '/ExperimentView': RouteRecordInfo<'/ExperimentView', '/ExperimentView', Record, Record>, '/HomeView': RouteRecordInfo<'/HomeView', '/HomeView', Record, Record>, '/LoginView': RouteRecordInfo<'/LoginView', '/LoginView', Record, Record>,