diff --git a/client/src/components/Common/VegaWrapper.vue b/client/src/components/Common/VegaWrapper.vue
index c75d5b920629..90abd6808fc4 100644
--- a/client/src/components/Common/VegaWrapper.vue
+++ b/client/src/components/Common/VegaWrapper.vue
@@ -3,14 +3,14 @@
{{ errorMessage }}
-
+
-
+
{{ error }}
-
+
+ Data for rendering this {{ name }} is not yet available.
+
+
{{ invocationLoadError }}
@@ -111,12 +118,10 @@ watch(
{{ args.collapse }}
-
-
-
{{ new Date().toUTCString() }}
-
+
+Galaxy Version {{ config.version_major }}
+ {{ new Date().toUTCString() }}
+
+
+ This cell type `{{ name }}` is not available.
+
+
+
diff --git a/client/src/components/Markdown/Utilities/parseInvocation.ts b/client/src/components/Markdown/Utilities/parseInvocation.ts
index bf6474e7c383..a6536fbd56d7 100644
--- a/client/src/components/Markdown/Utilities/parseInvocation.ts
+++ b/client/src/components/Markdown/Utilities/parseInvocation.ts
@@ -1,10 +1,4 @@
-interface Invocation {
- history_id: string;
- inputs: Record;
- outputs: Record;
- steps: { workflow_step_label?: string; job_id?: string; implicit_collection_jobs_id?: string }[];
- workflow_id: string;
-}
+import type { Invocation } from "@/components/Markdown/Editor/types";
interface ParsedAttributes {
history_id?: string;
@@ -19,35 +13,54 @@ interface ParsedAttributes {
workflow_id?: string;
}
+export function parseInput(invocation: Invocation, name: string | undefined) {
+ if (name && invocation.inputs) {
+ const inputs = Object.values(invocation.inputs);
+ const input = inputs.find((i) => i.label && i.label === name);
+ return input?.id;
+ }
+}
+
+export function parseOutput(invocation: Invocation, name: string | undefined) {
+ if (name && invocation.outputs) {
+ const output = invocation.outputs[name];
+ return output?.id;
+ }
+}
+
+export function parseStep(invocation: Invocation, name: string | undefined) {
+ if (name && invocation.steps) {
+ const step = invocation.steps.find((s) => s.workflow_step_label === name);
+ if (step) {
+ return {
+ job_id: step.job_id,
+ implicit_collection_jobs_id: step.implicit_collection_jobs_id,
+ };
+ }
+ }
+}
+
export function parseInvocation(
invocation: Invocation,
workflowId: string,
name: string,
attributes: ParsedAttributes
): ParsedAttributes {
- const result: ParsedAttributes = { ...attributes };
- result.invocation = invocation;
+ const result: ParsedAttributes = { ...attributes, invocation };
+ const inputId = parseInput(invocation, result.input);
+ const outputId = parseOutput(invocation, result.output);
+ const step = parseStep(invocation, result.step);
if (name === "history_link") {
result.history_id = invocation.history_id;
} else if (["workflow_display", "workflow_image", "workflow_license"].includes(name)) {
result.workflow_id = workflowId;
- } else if (result.input && invocation.inputs) {
- const inputs = Object.values(invocation.inputs);
- const input = inputs.find((i) => i.label && i.label === result?.input);
- if (input) {
- result.history_target_id = input.id;
- }
- } else if (result.output && invocation.outputs) {
- const output = invocation.outputs[result.output];
- if (output) {
- result.history_target_id = output.id;
- }
- } else if (result.step && invocation.steps) {
- const step = invocation.steps.find((s) => s.workflow_step_label === result.step);
- if (step) {
- result.job_id = step.job_id;
- result.implicit_collection_jobs_id = step.implicit_collection_jobs_id;
- }
+ } else if (inputId) {
+ result.history_target_id = inputId;
+ } else if (outputId) {
+ result.history_target_id = outputId;
+ } else if (step) {
+ result.job_id = step.job_id;
+ result.implicit_collection_jobs_id = step.implicit_collection_jobs_id;
}
return result;
}
diff --git a/client/src/components/Markdown/labels.ts b/client/src/components/Markdown/labels.ts
deleted file mode 100644
index 10048e834573..000000000000
--- a/client/src/components/Markdown/labels.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-// abstractions for dealing with workflows labels and
-// connecting them to the Markdown editor
-
-type WorkflowLabelKind = "input" | "output" | "step";
-
-export interface WorkflowLabel {
- label: string;
- type: WorkflowLabelKind;
-}
-
-interface StepOutput {
- label?: string;
-}
-
-interface Step {
- label?: string;
- type: string;
- workflow_outputs: StepOutput[];
-}
-
-export type WorkflowLabels = WorkflowLabel[];
-
-export function fromSteps(steps?: Step[]): WorkflowLabels {
- const labels: WorkflowLabels = [];
-
- if (!steps) {
- return labels;
- }
-
- Object.values(steps).forEach((step) => {
- const stepType = step.type;
- if (step.label) {
- const isInput = ["data_input", "data_collection_input", "parameter_input"].indexOf(stepType) >= 0;
- if (isInput) {
- labels.push({ type: "input", label: step.label });
- } else {
- labels.push({ type: "step", label: step.label });
- }
- }
- step.workflow_outputs.forEach((workflowOutput) => {
- if (workflowOutput.label) {
- labels.push({ type: "output", label: workflowOutput.label });
- }
- });
- });
-
- return labels;
-}
diff --git a/client/src/components/SelectionDialog/HistoryDatasetPicker.vue b/client/src/components/SelectionDialog/HistoryDatasetPicker.vue
index 7958c0a661ef..bd2eb978362a 100644
--- a/client/src/components/SelectionDialog/HistoryDatasetPicker.vue
+++ b/client/src/components/SelectionDialog/HistoryDatasetPicker.vue
@@ -19,7 +19,6 @@ interface HistoryRecord extends SelectionItem {
}
interface Props {
- folderId: string;
title?: string;
actionButtonText?: string;
}
diff --git a/client/src/components/Workflow/Editor/Index.vue b/client/src/components/Workflow/Editor/Index.vue
index e7855ba29e26..a8e431ac4a17 100644
--- a/client/src/components/Workflow/Editor/Index.vue
+++ b/client/src/components/Workflow/Editor/Index.vue
@@ -111,6 +111,7 @@
:markdown-text="report.markdown"
mode="report"
:title="'Workflow Report: ' + name"
+ :labels="getLabels"
:steps="steps"
@insert="insertMarkdown"
@update="onReportUpdate">
@@ -224,6 +225,7 @@ import { CopyIntoWorkflowAction, SetValueActionHandler } from "./Actions/workflo
import { defaultPosition } from "./composables/useDefaultStepPosition";
import { useActivityLogic, useSpecialWorkflowActivities, workflowEditorActivities } from "./modules/activities";
import { getWorkflowInputs } from "./modules/inputs";
+import { fromSteps } from "./modules/labels";
import { fromSimple } from "./modules/model";
import { getModule, getVersions, loadWorkflow, saveWorkflow } from "./modules/services";
import { getStateUpgradeMessages } from "./modules/utilities";
@@ -510,6 +512,8 @@ export default {
}))
);
+ const getLabels = computed(() => fromSteps(steps.value));
+
const saveWorkflowTitle = computed(() =>
hasInvalidConnections.value
? "Workflow has invalid connections, review and remove invalid connections"
@@ -536,6 +540,7 @@ export default {
setName,
report,
license,
+ getLabels,
setLicense,
creator,
setCreator,
diff --git a/client/src/components/Workflow/Editor/modules/labels.ts b/client/src/components/Workflow/Editor/modules/labels.ts
new file mode 100644
index 000000000000..5c4cdb4d36fb
--- /dev/null
+++ b/client/src/components/Workflow/Editor/modules/labels.ts
@@ -0,0 +1,44 @@
+// abstractions for dealing with workflows labels and
+// connecting them to the Markdown editor
+
+type WorkflowLabelKind = "input" | "output" | "step";
+
+export interface WorkflowLabel {
+ label: string;
+ type: WorkflowLabelKind;
+}
+
+interface StepOutput {
+ label?: string;
+}
+
+interface Step {
+ label?: string;
+ type: string;
+ workflow_outputs: StepOutput[];
+}
+
+export type WorkflowLabels = WorkflowLabel[];
+
+export function fromSteps(steps?: Step[]): WorkflowLabels {
+ const labels: WorkflowLabels = [];
+ if (steps) {
+ Object.values(steps).forEach((step) => {
+ const stepType = step.type;
+ if (step.label) {
+ const isInput = ["data_input", "data_collection_input", "parameter_input"].indexOf(stepType) >= 0;
+ if (isInput) {
+ labels.push({ type: "input", label: step.label });
+ } else {
+ labels.push({ type: "step", label: step.label });
+ }
+ }
+ step.workflow_outputs.forEach((workflowOutput) => {
+ if (workflowOutput.label) {
+ labels.push({ type: "output", label: workflowOutput.label });
+ }
+ });
+ });
+ }
+ return labels;
+}
diff --git a/client/src/style/scss/base.scss b/client/src/style/scss/base.scss
index 748868bf1b34..c3e1e0d98127 100644
--- a/client/src/style/scss/base.scss
+++ b/client/src/style/scss/base.scss
@@ -35,7 +35,6 @@ $fa-font-path: "../../../node_modules/@fortawesome/fontawesome-free/webfonts/";
@import "flex.scss";
@import "charts.scss";
@import "message.scss";
-@import "markdown.scss";
@import "multiselect.scss";
@import "icon-btn.scss";
@import "peek-columns.scss";
diff --git a/client/src/style/scss/markdown.scss b/client/src/style/scss/markdown.scss
deleted file mode 100644
index 62292052aee4..000000000000
--- a/client/src/style/scss/markdown.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-.markdown-wrapper {
- @extend .px-4;
- .markdown-components {
- @extend .py-2;
- }
-}
diff --git a/config/plugins/visualizations/PCA_3Dplot/config/PCA_3Dplot.xml b/config/plugins/visualizations/PCA_3Dplot/config/PCA_3Dplot.xml
index 933e57f03238..fb5dae15fe42 100644
--- a/config/plugins/visualizations/PCA_3Dplot/config/PCA_3Dplot.xml
+++ b/config/plugins/visualizations/PCA_3Dplot/config/PCA_3Dplot.xml
@@ -1,6 +1,6 @@
-
+
Plotly-based 3D PCA visualization plugin.
diff --git a/config/plugins/visualizations/annotate_image/config/annotate_image.xml b/config/plugins/visualizations/annotate_image/config/annotate_image.xml
index b5bcfe76a7ab..5d9f82c73ed3 100644
--- a/config/plugins/visualizations/annotate_image/config/annotate_image.xml
+++ b/config/plugins/visualizations/annotate_image/config/annotate_image.xml
@@ -1,6 +1,6 @@
-
+
An image annotater built using PaperJS at https://github.com/paperjs/paper.js.
diff --git a/config/plugins/visualizations/cytoscape/config/cytoscape.xml b/config/plugins/visualizations/cytoscape/config/cytoscape.xml
index 79de685142fa..39b9933de02f 100644
--- a/config/plugins/visualizations/cytoscape/config/cytoscape.xml
+++ b/config/plugins/visualizations/cytoscape/config/cytoscape.xml
@@ -1,6 +1,6 @@
-
+
A viewer based on graph theory/ network library for analysis and visualisation hosted at http://js.cytoscape.org.
@@ -14,7 +14,7 @@
dataset_id
-
+
diff --git a/config/plugins/visualizations/editor/config/editor.xml b/config/plugins/visualizations/editor/config/editor.xml
index 8038f9fd2e88..b6a50718b687 100644
--- a/config/plugins/visualizations/editor/config/editor.xml
+++ b/config/plugins/visualizations/editor/config/editor.xml
@@ -1,6 +1,6 @@
-
+
Manually edit text
diff --git a/config/plugins/visualizations/example/config/example.xml b/config/plugins/visualizations/example/config/example.xml
index 7ebf2f643a12..7c052c1ee539 100644
--- a/config/plugins/visualizations/example/config/example.xml
+++ b/config/plugins/visualizations/example/config/example.xml
@@ -1,6 +1,6 @@
-
+
Welcome to the Minimal JS-Based Example Plugin.
diff --git a/config/plugins/visualizations/fits_graph_viewer/config/fits_graph_viewer.xml b/config/plugins/visualizations/fits_graph_viewer/config/fits_graph_viewer.xml
index 4d67c16da013..a8c455130dfe 100644
--- a/config/plugins/visualizations/fits_graph_viewer/config/fits_graph_viewer.xml
+++ b/config/plugins/visualizations/fits_graph_viewer/config/fits_graph_viewer.xml
@@ -1,6 +1,6 @@
-
+
Basic plugin for fits file table visualization
diff --git a/config/plugins/visualizations/fits_image_viewer/config/fits_image_viewer.xml b/config/plugins/visualizations/fits_image_viewer/config/fits_image_viewer.xml
index 9affd764bb58..90bdbc75e317 100644
--- a/config/plugins/visualizations/fits_image_viewer/config/fits_image_viewer.xml
+++ b/config/plugins/visualizations/fits_image_viewer/config/fits_image_viewer.xml
@@ -1,6 +1,6 @@
-
+
Basic plugin for fits file visualization with aladin-lite viewer
diff --git a/config/plugins/visualizations/h5web/config/h5web.xml b/config/plugins/visualizations/h5web/config/h5web.xml
index 48a767d8bf2a..a06faaabe49c 100644
--- a/config/plugins/visualizations/h5web/config/h5web.xml
+++ b/config/plugins/visualizations/h5web/config/h5web.xml
@@ -1,6 +1,6 @@
-
+
HDF5 data visualization and exploration
diff --git a/config/plugins/visualizations/heatmap/config/heatmap.xml b/config/plugins/visualizations/heatmap/config/heatmap.xml
index e69a5ffb1b58..c1a95a5c4781 100644
--- a/config/plugins/visualizations/heatmap/config/heatmap.xml
+++ b/config/plugins/visualizations/heatmap/config/heatmap.xml
@@ -1,9 +1,9 @@
-
+
Renders a heatmap from matrix data provided in 3-column format (x, y, observation).
-
+
diff --git a/config/plugins/visualizations/heatmap/static/logo.svg b/config/plugins/visualizations/heatmap/static/logo.svg
index 41c80b8f2c16..7dab3d8c7567 100644
--- a/config/plugins/visualizations/heatmap/static/logo.svg
+++ b/config/plugins/visualizations/heatmap/static/logo.svg
@@ -1,4 +1,4 @@
-