diff --git a/client/src/components/Job/UserJobsList.vue b/client/src/components/Job/UserJobsList.vue new file mode 100644 index 000000000000..3db98ceb3e7c --- /dev/null +++ b/client/src/components/Job/UserJobsList.vue @@ -0,0 +1,63 @@ + + + + + Jobs + {{ jobCount }} jobs loaded. + + + + {{ data.value }} + + + + + + + + + {{ new Date(data.value).toLocaleString() }} + + + {{ data.value }} + + + + diff --git a/client/src/entry/analysis/router.js b/client/src/entry/analysis/router.js index 9615f6e299d2..5184b9333b9d 100644 --- a/client/src/entry/analysis/router.js +++ b/client/src/entry/analysis/router.js @@ -71,6 +71,7 @@ import GridInvocation from "@/components/Grid/GridInvocation.vue"; import GridVisualization from "@/components/Grid/GridVisualization.vue"; import HistoryArchiveWizard from "@/components/History/Archiving/HistoryArchiveWizard.vue"; import HistoryDatasetPermissions from "@/components/History/HistoryDatasetPermissions.vue"; +import UserJobsList from "@/components/Job/UserJobsList.vue"; import NotificationsList from "@/components/Notifications/NotificationsList.vue"; import EditObjectStoreInstance from "@/components/ObjectStore/Instances/EditInstance.vue"; import ManageObjectStoreIndex from "@/components/ObjectStore/Instances/ManageIndex.vue"; @@ -344,6 +345,10 @@ export function getRouter(Galaxy) { path: "interactivetool_entry_points/list", component: InteractiveTools, }, + { + path: "jobs/list", + component: UserJobsList, + }, { path: "jobs/submission/success", component: ToolSuccess, diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index d2d9b0fcfba2..15ed458cd38a 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -1975,13 +1975,15 @@ def requires_shareable_storage(self, security_agent): return requires_sharing def to_dict(self, view="collection", system_details=False): - if view == "admin_job_list": + if view == "admin_job_list" or view == "list": rval = super().to_dict(view="collection") else: rval = super().to_dict(view=view) rval["tool_id"] = self.tool_id rval["tool_version"] = self.tool_version rval["history_id"] = self.history_id + if view == "list": + rval["invocation_id"] = getattr(self.workflow_invocation_step, "workflow_invocation_id", None) if system_details or view == "admin_job_list": # System level details that only admins should have. rval["external_id"] = self.job_runner_external_id diff --git a/lib/galaxy/schema/schema.py b/lib/galaxy/schema/schema.py index e6e92e79334e..3290f376fd18 100644 --- a/lib/galaxy/schema/schema.py +++ b/lib/galaxy/schema/schema.py @@ -2032,6 +2032,11 @@ class JobSummary(JobBaseModel): "Only the owner of the job and administrators can see this value." ), ) + invocation_id: Optional[EncodedDatabaseIdField] = Field( + None, + title="Invocation ID", + description="The id of the workflow invocation associated with this job.", + ) class DatasetSourceIdBase(Model): diff --git a/lib/galaxy/webapps/galaxy/buildapp.py b/lib/galaxy/webapps/galaxy/buildapp.py index 8f428563426d..f859e6928d5e 100644 --- a/lib/galaxy/webapps/galaxy/buildapp.py +++ b/lib/galaxy/webapps/galaxy/buildapp.py @@ -270,6 +270,7 @@ def app_pair(global_conf, load_app_kwds=None, wsgi_preflight=True, **kwargs): webapp.add_client_route("/datasets/{dataset_id}/preview") webapp.add_client_route("/datasets/{dataset_id}/show_params") webapp.add_client_route("/collection/{collection_id}/edit") + webapp.add_client_route("/jobs/list") webapp.add_client_route("/jobs/submission/success") webapp.add_client_route("/jobs/{job_id}/view") webapp.add_client_route("/workflows/list") diff --git a/lib/galaxy/webapps/galaxy/services/jobs.py b/lib/galaxy/webapps/galaxy/services/jobs.py index 9ecfb718b963..4358ee5d24f8 100644 --- a/lib/galaxy/webapps/galaxy/services/jobs.py +++ b/lib/galaxy/webapps/galaxy/services/jobs.py @@ -29,6 +29,7 @@ class JobIndexViewEnum(str, Enum): collection = "collection" admin_job_list = "admin_job_list" + list = "list" class JobIndexPayload(JobIndexQueryPayload):
{{ jobCount }} jobs loaded.