|
|
|
@ -59,7 +59,7 @@ const pendingArtifactPath = ref<string | null>(null);
|
|
|
|
const packageOptions = ref<PackageOption[]>([]);
|
|
|
|
const packageOptions = ref<PackageOption[]>([]);
|
|
|
|
const packagesLoading = ref(false);
|
|
|
|
const packagesLoading = ref(false);
|
|
|
|
const packagesError = ref("");
|
|
|
|
const packagesError = ref("");
|
|
|
|
|
|
|
|
const shouldOpenDeploymentAfterLogin = ref(false);
|
|
|
|
/* ========= MLflow State ========= */
|
|
|
|
/* ========= MLflow State ========= */
|
|
|
|
const runs = ref<any[]>([]);
|
|
|
|
const runs = ref<any[]>([]);
|
|
|
|
const loadingRuns = ref(false);
|
|
|
|
const loadingRuns = ref(false);
|
|
|
|
@ -587,6 +587,12 @@ function restoreAuthFromStorage() {
|
|
|
|
/* no-op */
|
|
|
|
/* no-op */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function openLoginManually() {
|
|
|
|
|
|
|
|
shouldOpenDeploymentAfterLogin.value = false;
|
|
|
|
|
|
|
|
pendingArtifactPath.value = null;
|
|
|
|
|
|
|
|
loginDialog.value = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const handleLogout = () => {
|
|
|
|
const handleLogout = () => {
|
|
|
|
localStorage.removeItem(AUTH_KEY);
|
|
|
|
localStorage.removeItem(AUTH_KEY);
|
|
|
|
isAuthenticated.value = false;
|
|
|
|
isAuthenticated.value = false;
|
|
|
|
@ -602,6 +608,7 @@ const handleLogin = async () => {
|
|
|
|
loginError.value = "ID와 비밀번호를 입력하세요.";
|
|
|
|
loginError.value = "ID와 비밀번호를 입력하세요.";
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const res = await ExternalAuthControllerService.signIn(id, password);
|
|
|
|
const res = await ExternalAuthControllerService.signIn(id, password);
|
|
|
|
const raw = res?.data ?? res;
|
|
|
|
const raw = res?.data ?? res;
|
|
|
|
if (!raw) {
|
|
|
|
if (!raw) {
|
|
|
|
@ -615,6 +622,7 @@ const handleLogin = async () => {
|
|
|
|
loginError.value = "로그인에 실패했습니다. 아이디/비밀번호를 확인하세요.";
|
|
|
|
loginError.value = "로그인에 실패했습니다. 아이디/비밀번호를 확인하세요.";
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const toSave: ExternalAuth = {
|
|
|
|
const toSave: ExternalAuth = {
|
|
|
|
id: payload.id ?? id,
|
|
|
|
id: payload.id ?? id,
|
|
|
|
name: payload.name ?? id,
|
|
|
|
name: payload.name ?? id,
|
|
|
|
@ -626,8 +634,12 @@ const handleLogin = async () => {
|
|
|
|
|
|
|
|
|
|
|
|
loginDialog.value = false;
|
|
|
|
loginDialog.value = false;
|
|
|
|
loginForm.value = { id: "", password: "" };
|
|
|
|
loginForm.value = { id: "", password: "" };
|
|
|
|
await nextTick();
|
|
|
|
|
|
|
|
openDeploymentModal(); // pendingArtifactPath 활용
|
|
|
|
if (shouldOpenDeploymentAfterLogin.value) {
|
|
|
|
|
|
|
|
shouldOpenDeploymentAfterLogin.value = false;
|
|
|
|
|
|
|
|
await nextTick();
|
|
|
|
|
|
|
|
openDeploymentModal();
|
|
|
|
|
|
|
|
}
|
|
|
|
} catch (e: any) {
|
|
|
|
} catch (e: any) {
|
|
|
|
loginError.value =
|
|
|
|
loginError.value =
|
|
|
|
e?.response?.data?.message || e?.message || "로그인에 실패했습니다.";
|
|
|
|
e?.response?.data?.message || e?.message || "로그인에 실패했습니다.";
|
|
|
|
@ -644,6 +656,7 @@ const openDeploymentModal = async (fullPath?: string) => {
|
|
|
|
pendingArtifactPath.value = uri;
|
|
|
|
pendingArtifactPath.value = uri;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!isAuthenticated.value) {
|
|
|
|
if (!isAuthenticated.value) {
|
|
|
|
|
|
|
|
shouldOpenDeploymentAfterLogin.value = true;
|
|
|
|
loginDialog.value = true;
|
|
|
|
loginDialog.value = true;
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1260,7 +1273,7 @@ const artifactsLoading = ref(false);
|
|
|
|
size="small"
|
|
|
|
size="small"
|
|
|
|
color="primary"
|
|
|
|
color="primary"
|
|
|
|
variant="text"
|
|
|
|
variant="text"
|
|
|
|
@click="loginDialog = true"
|
|
|
|
@click="openLoginManually"
|
|
|
|
>
|
|
|
|
>
|
|
|
|
<v-icon start size="16">mdi-login</v-icon> Login
|
|
|
|
<v-icon start size="16">mdi-login</v-icon> Login
|
|
|
|
</v-btn>
|
|
|
|
</v-btn>
|
|
|
|
@ -1330,12 +1343,10 @@ const artifactsLoading = ref(false);
|
|
|
|
<td />
|
|
|
|
<td />
|
|
|
|
</tr>
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 하위(폴더/파일) -->
|
|
|
|
|
|
|
|
<tr
|
|
|
|
<tr
|
|
|
|
v-for="(it, idx) in grp.files"
|
|
|
|
v-for="(it, idx) in grp.files"
|
|
|
|
:key="grp.dir + '-' + idx"
|
|
|
|
:key="grp.dir + '-' + idx"
|
|
|
|
>
|
|
|
|
>
|
|
|
|
<!-- 아이콘 전용 칸 제거, 경로 칸이 아이콘 칸까지 흡수 -->
|
|
|
|
|
|
|
|
<td colspan="2">
|
|
|
|
<td colspan="2">
|
|
|
|
<div
|
|
|
|
<div
|
|
|
|
class="path-cell"
|
|
|
|
class="path-cell"
|
|
|
|
@ -1348,7 +1359,7 @@ const artifactsLoading = ref(false);
|
|
|
|
size="18"
|
|
|
|
size="18"
|
|
|
|
class="mr-2"
|
|
|
|
class="mr-2"
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
<code class="truncate">{{ it.path }}</code>
|
|
|
|
<span>{{ it.path }}</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</td>
|
|
|
|
</td>
|
|
|
|
|
|
|
|
|
|
|
|
@ -1488,6 +1499,6 @@ const artifactsLoading = ref(false);
|
|
|
|
background: rgba(255, 255, 255, 0.04);
|
|
|
|
background: rgba(255, 255, 255, 0.04);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.child-path {
|
|
|
|
.child-path {
|
|
|
|
padding-left: 18px; /* 들여쓰기로 디렉터리 소속임을 표시 */
|
|
|
|
padding-left: 18px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</style>
|
|
|
|
|