- {{ preview.error }}
+
+
+
Loading file preview...
-
-
+
-
-
{{ preview.text }}
+
+
+
+
+
-
-
+
{{ preview.text }}
+
+
+
+
-
-
+
-
- No preview available for this file type. Use Download.
+
+
+
No preview available for this file type.
+
Use the Download Artifact button above to view Artifact.
+
+
+
+
\ No newline at end of file
+
diff --git a/src/frontend/src/views/EditPluginView.vue b/src/frontend/src/views/EditPluginView.vue
index 2d7c7692c..88b0aac93 100644
--- a/src/frontend/src/views/EditPluginView.vue
+++ b/src/frontend/src/views/EditPluginView.vue
@@ -1,22 +1,21 @@
-
@@ -24,106 +23,119 @@
- {{ showMetadata ? 'Hide' : 'Show' }} "{{ ORIGINAL_PLUGIN.name }}" Metadata
+ {{ showMetadata ? "Hide" : "Show" }} "{{ ORIGINAL_PLUGIN.name }}"
+ Metadata
-
+
{{ truncateString(ORIGINAL_PLUGIN.description, 100) }}
+
-
- {{ name }}
-
-
-
-
+
+
+ {{ name }}
+
+
+
+
+
-
-
-
- {{ description }}
+
+
+
+
+ {{ description || "No description provided" }}
-
+
+
+
+
-
-
-
-
+
+
-
- No changes detected — nothing to save
-
+ No changes detected
-
(openTab
? openWindow.open(`/plugins/${route.params.id}/files/${selected[0].id}`, '_blank')
: router.push(`/plugins/${route.params.id}/files/${selected[0].id}`)
)"
- @delete="showDeleteDialog = true"
+ :loading="isLoading"
@request="getFiles"
- ref="tableRef"
- @editTags="(row) => { editObjTags = row; showTagsDialog = true }"
@create="router.push(`/plugins/${route.params.id}/files/new`)"
- >
-
- {{ props.row.tasks.functions.length }}
-
-
- {{ props.row.tasks.artifacts.length }}
-
-
+ @delete="
+ (row) => {
+ selected = [row];
+ showDeleteDialog = true;
+ }
+ "
+ @editTags="
+ (row) => {
+ editObjTags = row;
+ showTagsDialog = true;
+ }
+ "
+ />
-
-
-
\ No newline at end of file
+
diff --git a/src/frontend/src/views/EntryPointsView.vue b/src/frontend/src/views/EntryPointsView.vue
index 9805a50ce..8e63d5e1d 100644
--- a/src/frontend/src/views/EntryPointsView.vue
+++ b/src/frontend/src/views/EntryPointsView.vue
@@ -1,237 +1,368 @@
-
- (openTab
? openWindow.open(`/entrypoints/${selected[0].id}`, '_blank')
: router.push(`/entrypoints/${selected[0].id}`)
)"
- @delete="showDeleteDialog = true"
@request="getEntrypoints"
- ref="tableRef"
@editTags="(row) => { editObjTags = row; showTagsDialog = true }"
@create="router.push('/entrypoints/new')"
:loading="isLoading"
+ @edit="(row) => router.push(`/entrypoints/${row.id}`)"
+ @delete="
+ (row) => {
+ selected = [row];
+ showDeleteDialog = true;
+ }
+ "
>
-
- {{ props.row.group.name }}
-
-
- EMPTY
-
-
-
- Empty
+ View '{{ props.row.name || "Entrypoint" }}' Task Graph YAML
-
- {{ plugin.name }}
-
-
-
-
- Sync to latest version of plugin
-
-
-
-
-
-
-
- {{ plugin.name }}
-
-
-
+
+
-
- Sync to latest version of plugin
-
-
-
-
+
+ Manage Attached Plugins
+
+
+
+
+
+
+
+ {{ plugin.name }}
+ Plugin ID: {{ plugin.id }}
+
+
+
+
+
+
+ Plugin out of date
+
+
+ Sync to latest
+
+
+
+
+
+
+
+
+ +{{ props.row[colName].length - 3 }} more
+
+
+
+ Additional {{ colName === 'plugins' ? 'Plugins' : 'Artifact Plugins' }}
+
+
+
+
+ {{ plugin.name }}
+ ID: {{ plugin.id }}
+
+
+
+
+
+
+
+
+
+
+ No {{ colName === 'plugins' ? 'plugins' : 'artifact plugins' }}
+
+
+
+
+
+
+
+
+
-
-
-
- Task Graph YAML
-
-
-
+
+ Task Graph YAML
+
-
-
-
+
diff --git a/src/frontend/src/views/ExperimentsView.vue b/src/frontend/src/views/ExperimentsView.vue
index 8140bd071..cba211425 100644
--- a/src/frontend/src/views/ExperimentsView.vue
+++ b/src/frontend/src/views/ExperimentsView.vue
@@ -1,40 +1,44 @@
-
-
+
+ (openTab
? openWindow.open(`/experiments/${selected[0].id}`, '_blank')
: router.push(`/experiments/${selected[0].id}`)
)"
- @delete="showDeleteDialog = true"
@request="getExperiments"
- ref="tableRef"
- @editTags="(row) => { editObjTags = row; showTagsDialog = true }"
@create="router.push('/experiments/new')"
:loading="isLoading"
- >
-
-
- {{ entrypoint.name }}
-
-
-
+ @delete="
+ (row) => {
+ selected = [row];
+ showDeleteDialog = true;
+ }
+ "
+ @editTags="
+ (row) => {
+ editObjTags = row;
+ showTagsDialog = true;
+ }
+ "
+ />
-
-
diff --git a/src/frontend/src/views/GroupsAdminView.vue b/src/frontend/src/views/GroupsAdminView.vue
index a7710a264..112f5df86 100644
--- a/src/frontend/src/views/GroupsAdminView.vue
+++ b/src/frontend/src/views/GroupsAdminView.vue
@@ -1,149 +1,261 @@
-
+
Basic Info
-
-
-
-
- Group Name:
-
-
-
-
-
-
+
+
+
+ Group Name:
+
+
+
-
- Owner Only Options
-
+
+ Owner Options
+
Delete Group
- Once you delete a group it CAN NOT be undone.
+
+ Action is permanent and cannot be undone.
+
-
-
-
+
Add User
-
-
-
-
- Search User:
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
- Search Results
-
-
-
-
+
+
+ Results
+
+
+
+
+
+ {{
+ user.charAt(0)
+ }}
+
- {{ user }}
+ {{
+ user
+ }}
+ size="sm"
+ >
+ Add to Group
+
-
-
+
-
-
-
+
+
Group Members
- {selectedParam = param; selectedParamIndex = i; showEditParamDialog = true}"
- @delete="(param) => {selectedParam = param; showDeleteDialog = true}"
- style="max-height: 500px;"
- class="q-mt-xl"
- />
+ :columns="memberColumns"
+ :hideToggleDraft="true"
+ :hideCreateBtn="true"
+ :hideSearch="true"
+ :disableSelect="true"
+ :hideOpenBtn="true"
+ :hideDeleteBtn="true"
+ class="full-height"
+ >
+
+
+
+ Edit Permissions
+
+
+ Remove User
+
+
+
+
-
\ No newline at end of file
+
diff --git a/src/frontend/src/views/GroupsView.vue b/src/frontend/src/views/GroupsView.vue
index 73e5882ed..051732370 100644
--- a/src/frontend/src/views/GroupsView.vue
+++ b/src/frontend/src/views/GroupsView.vue
@@ -1,77 +1,157 @@
-
-
+
+
-
-
-
-
-
-
+ @request="getUserGroups"
+ @open="router.push('/groups/admin')"
+ @delete="showDeleteDialog = true"
+ />
+
+
diff --git a/src/frontend/src/views/JobDashboardView.vue b/src/frontend/src/views/JobDashboardView.vue
index b766d8776..052bac191 100644
--- a/src/frontend/src/views/JobDashboardView.vue
+++ b/src/frontend/src/views/JobDashboardView.vue
@@ -1,117 +1,166 @@
-
+
+
-
-
-
-
-
-
+ v-model="tab"
+ indicator-color="primary"
+ dense
+ no-caps
+ align="left"
+ class="text-grey-8"
+ active-color="primary"
+ >
+
+
+
+
+
+
-
-
-
Details
+
+
+
+
Details
+
-
-
-
- {{ tag.name.length <= 18 ? tag.name : tag.name.replace(/(.{17})..+/, "$1…") }}
-
- {{ tag.name }}
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
- {{ name.length < 18 ? name : name.replace(/(.{18})..+/, "$1…") }}
-
- {{ name }}
-
-
+
+
+
+ -
+
+
+
+
+ -
-
-
- {{ name.length < 18 ? name : name.replace(/(.{18})..+/, "$1…") }}
-
- {{ name }}
-
-
+
+
+
+ -
-
-
+
+
-
-
Entrypoint Parameters
-
-
-
-
Artifact Parameters
-
+
+
+
+
Entrypoint Parameters
+
+
+
+
+
Artifact Parameters
+
{
+ if (selectedUsedArtifact.length) {
+ const row = selectedUsedArtifact[0];
+ const routePath = `/artifacts/${row.id}?snapshotId=${row.snapshotId}`;
+ openTab ? window.open(routePath, '_blank') : router.push(routePath);
+ }
+ }"
+ >
+
+
+
+
+
+
@@ -135,92 +182,75 @@
class="code-cell"
/>
+
-
-
-
-
-
-
- {{ opt }}
-
-
-
-
-
-
-
-
+
+
+
+
+
-
+
+
+
+
-
-
No metrics found
+
+
+
No metrics available
+
+
-
-
+
+
-
+:deep(.q-table .code-cell .cm-gutters) {
+ cursor: default !important;
+}
+
\ No newline at end of file
diff --git a/src/frontend/src/views/JobsView.vue b/src/frontend/src/views/JobsView.vue
index a6e4ba8a4..f4053bff0 100644
--- a/src/frontend/src/views/JobsView.vue
+++ b/src/frontend/src/views/JobsView.vue
@@ -1,184 +1,225 @@
-
+
+
{ editObjTags = row; showTagsDialog = true }"
- @create="pushToJobRoute"
:hideOpenBtn="true"
@open="openTab => (openTab
? openWindow.open(`/jobs/${selected[0].id}`, '_blank')
: router.push(`/jobs/${selected[0].id}`)
)"
:loading="isLoading"
+ @request="getJobs"
+ @create="pushToJobRoute"
+ @delete="
+ (row) => {
+ selected = [row];
+ showDeleteDialog = true;
+ }
+ "
+ @edit="(row) => router.push(`/jobs/${row.id}`)"
+ @editTags="
+ (row) => {
+ editObjTags = row;
+ showTagsDialog = true;
+ }
+ "
>
-
- {{ props.row.experiment.name }}
-
-
- {{ props.row.entrypoint.name }}
-
-
- {{ props.row.queue.name }}
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/frontend/src/views/ModelsView.vue b/src/frontend/src/views/ModelsView.vue
index 82708b818..5414dc707 100644
--- a/src/frontend/src/views/ModelsView.vue
+++ b/src/frontend/src/views/ModelsView.vue
@@ -3,7 +3,6 @@
-
+
{
+ if (!success) return;
+
if(jsonError.value) return
if(route.params.id === 'new') {
createPluginParamType()
diff --git a/src/frontend/src/views/PluginParamsView.vue b/src/frontend/src/views/PluginParamsView.vue
index 0cc52e2f6..4f09541ca 100644
--- a/src/frontend/src/views/PluginParamsView.vue
+++ b/src/frontend/src/views/PluginParamsView.vue
@@ -1,34 +1,40 @@
-
+
+
(openTab
? openWindow.open(`/pluginParams/${selected[0].id}`, '_blank')
: router.push(`/pluginParams/${selected[0].id}`)
)"
- @delete="showDeleteDialog = true"
@request="getPluginParameterTypes"
- ref="tableRef"
- :hideToggleDraft="true"
@editTags="(row) => { editObjTags = row; showTagsDialog = true }"
@create="router.push('/pluginParams/new')"
:loading="isLoading"
- >
-
- {{ props.row.group.name }}
-
-
+ :hideToggleDraft="true"
+ @delete="
+ (row) => {
+ selected = [row];
+ showDeleteDialog = true;
+ }
+ "
+ />
-
-
\ No newline at end of file
+}
+
diff --git a/src/frontend/src/views/PluginsView.vue b/src/frontend/src/views/PluginsView.vue
index 2b87d7d13..c25c32acb 100644
--- a/src/frontend/src/views/PluginsView.vue
+++ b/src/frontend/src/views/PluginsView.vue
@@ -1,38 +1,45 @@
-
+
(openTab
? openWindow.open(`/plugins/${selected[0].id}`, '_blank')
: router.push(`/plugins/${selected[0].id}`)
)"
- @delete="showDeleteDialog = true"
- @request="getPlugins"
- ref="tableRef"
- @editTags="(row) => { editObjTags = row; showTagsDialog = true }"
- @create="router.push('/plugins/new')"
- :loading="isLoading"
- >
-
-
- {{ props.row.group.name }}
-
-
- {{ props.row.files?.length }}
-
-
+ @delete="
+ (row) => {
+ selected = [row];
+ showDeleteDialog = true;
+ }
+ "
+ @editTags="
+ (row) => {
+ editObjTags = row;
+ showTagsDialog = true;
+ }
+ "
+ />
-
-
\ No newline at end of file
+}
+
diff --git a/src/frontend/src/views/QueuesFormDraftView.vue b/src/frontend/src/views/QueuesFormDraftView.vue
index 6b66f246d..9db872aed 100644
--- a/src/frontend/src/views/QueuesFormDraftView.vue
+++ b/src/frontend/src/views/QueuesFormDraftView.vue
@@ -2,7 +2,7 @@
diff --git a/src/frontend/src/views/QueuesFormView.vue b/src/frontend/src/views/QueuesFormView.vue
index 4d8c72be1..08193806a 100644
--- a/src/frontend/src/views/QueuesFormView.vue
+++ b/src/frontend/src/views/QueuesFormView.vue
@@ -1,9 +1,12 @@
-
-
+
{
+ if (route.params.id === 'new') {
+ return 'Create Queue'
+ }
+
+ if (store.showRightDrawer && store.selectedSnapshot) {
+ return `${queue.value?.name || 'Loading...'} (Snapshot ${store.selectedSnapshot.snapshot})`
+ }
+
+ if (route.query.snapshotId) {
+ return `${queue.value?.name || 'Loading...'} (Snapshot ${route.query.snapshotId})`
+ }
+
+ return copyAtEditStart.value?.name || queue.value?.name || 'Loading...'
+})
+
const copyAtEditStart = ref()
const valuesChangedFromEditStart = computed(() => {
diff --git a/src/frontend/src/views/QueuesView.vue b/src/frontend/src/views/QueuesView.vue
index 2a717f938..a4a50b11a 100644
--- a/src/frontend/src/views/QueuesView.vue
+++ b/src/frontend/src/views/QueuesView.vue
@@ -1,19 +1,33 @@
-
-
+
+ { editObjTags = row; showTagsDialog = true }"
- @create="router.push('/queues/new')"
:loading="isLoading"
+ @request="getQueues"
+ @create="router.push('/queues/new')"
+ @edit="(row) => openQueue(false, row)"
+ @open="(openTab) => openQueue(openTab)"
+ @delete="
+ (row) => {
+ selected = [row];
+ showDeleteDialog = true;
+ }
+ "
+ @editTags="
+ (row) => {
+ editObjTags = row;
+ showTagsDialog = true;
+ }
+ "
>
-
-
+ if (openTab) openWindow.open(url, "_blank", "noopener,noreferrer");
+ else router.push(url);
+}
+
\ No newline at end of file
diff --git a/src/frontend/src/views/TagsView.vue b/src/frontend/src/views/TagsView.vue
index 10779d97a..915d8dfa7 100644
--- a/src/frontend/src/views/TagsView.vue
+++ b/src/frontend/src/views/TagsView.vue
@@ -1,129 +1,165 @@
-
-
+
+
-
-
- {{ props.row.name }}
-
-
-
+ @edit="(row) => {
+ selected = [row];
+ editing = true;
+ showAddDialog = true;
+ }"
+ @delete="
+ (row) => {
+ selected = [row];
+ showDeleteDialog = true;
+ }
+ "
+ />
-
-