Skip to content

Commit b456bcc

Browse files
authored
Merge pull request galaxyproject#20026 from ahmedhamidawan/move_readme_to_split_view
Show workflow README in split view next to the form inputs
2 parents 45373ad + 2331abd commit b456bcc

3 files changed

Lines changed: 66 additions & 43 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<script setup lang="ts">
2+
import { BAlert, BCard } from "bootstrap-vue";
3+
4+
import type { StoredWorkflowDetailed } from "@/api/workflows";
5+
import { useMarkdown } from "@/composables/markdown";
6+
7+
import LoadingSpan from "@/components/LoadingSpan.vue";
8+
9+
const props = defineProps<{
10+
workflow?: StoredWorkflowDetailed;
11+
loading?: boolean;
12+
}>();
13+
14+
const { renderMarkdown } = useMarkdown({
15+
openLinksInNewPage: true,
16+
removeNewlinesAfterList: true,
17+
increaseHeadingLevelBy: 2,
18+
});
19+
</script>
20+
21+
<template>
22+
<BAlert v-if="props.loading" variant="info" show>
23+
<LoadingSpan message="Loading workflow help" />
24+
</BAlert>
25+
<BCard v-else-if="props.workflow" class="mx-1 flex-grow-1 overflow-auto">
26+
<!-- eslint-disable-next-line vue/no-v-html -->
27+
<p v-if="props.workflow.readme" class="container" v-html="renderMarkdown(props.workflow.readme)" />
28+
<template v-if="props.workflow.help">
29+
<hr v-if="props.workflow.readme" class="w-100" />
30+
<h4 class="text-center">Workflow Help</h4>
31+
<!-- eslint-disable-next-line vue/no-v-html -->
32+
<p class="container" v-html="renderMarkdown(props.workflow.help)" />
33+
</template>
34+
<div class="py-2 text-center">- End of help -</div>
35+
</BCard>
36+
</template>

client/src/components/Workflow/Run/WorkflowRunFormSimple.vue

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
<script setup lang="ts">
2-
import { faArrowRight, faCog, faInfoCircle, faSitemap } from "@fortawesome/free-solid-svg-icons";
2+
import { faReadme } from "@fortawesome/free-brands-svg-icons";
3+
import { faArrowRight, faCog, faSitemap } from "@fortawesome/free-solid-svg-icons";
34
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
4-
import { BAlert, BButton, BButtonGroup, BCard, BFormCheckbox, BOverlay } from "bootstrap-vue";
5+
import { BAlert, BButton, BButtonGroup, BFormCheckbox, BOverlay } from "bootstrap-vue";
56
import { storeToRefs } from "pinia";
67
import { computed, ref, watch } from "vue";
78
89
import { isWorkflowInput } from "@/components/Workflow/constants";
910
import { useConfig } from "@/composables/config";
10-
import { useMarkdown } from "@/composables/markdown";
1111
import { usePersistentToggle } from "@/composables/persistentToggle";
1212
import { usePanels } from "@/composables/usePanels";
13+
import { useWorkflowInstance } from "@/composables/useWorkflowInstance";
1314
import { provideScopedWorkflowStores } from "@/composables/workflowStores";
1415
import { useHistoryStore } from "@/stores/historyStore";
1516
import { errorMessageAsString } from "@/utils/simple-error";
@@ -18,6 +19,7 @@ import { invokeWorkflow } from "./services";
1819
1920
import WorkflowAnnotation from "../WorkflowAnnotation.vue";
2021
import WorkflowNavigationTitle from "../WorkflowNavigationTitle.vue";
22+
import WorkflowHelpDisplay from "./WorkflowHelpDisplay.vue";
2123
import WorkflowRunGraph from "./WorkflowRunGraph.vue";
2224
import WorkflowStorageConfiguration from "./WorkflowStorageConfiguration.vue";
2325
import Heading from "@/components/Common/Heading.vue";
@@ -60,22 +62,29 @@ const splitObjectStore = ref(false);
6062
const preferredObjectStoreId = ref<string | null>(null);
6163
const preferredIntermediateObjectStoreId = ref<string | null>(null);
6264
const waitingForRequest = ref(false);
63-
const showRightPanel = ref<"help" | "graph" | null>(!showPanels.value && props.model.runData.help ? "help" : null);
65+
const showRightPanel = ref<"help" | "graph" | null>(null);
6466
6567
const showGraph = computed(() => showRightPanel.value === "graph");
6668
const showHelp = computed(() => showRightPanel.value === "help");
6769
68-
const { renderMarkdown } = useMarkdown({
69-
openLinksInNewPage: true,
70-
removeNewlinesAfterList: true,
71-
increaseHeadingLevelBy: 2,
72-
});
73-
7470
const { toggled: showRuntimeSettingsPanel, toggle: toggleRuntimeSettings } =
7571
usePersistentToggle("workflow-run-settings-panel");
7672
7773
const { changingCurrentHistory } = storeToRefs(useHistoryStore());
7874
75+
// Workflow REAME/help panel setup
76+
const { workflow, loading: workflowLoading } = useWorkflowInstance(props.model.runData.workflow_id);
77+
watch(
78+
() => workflow.value,
79+
(workflow) => {
80+
if (workflow) {
81+
// once the workflow loads, and if we are not showing panels, show the help if it exists by default
82+
showRightPanel.value = !showPanels.value && workflow.readme ? "help" : null;
83+
}
84+
},
85+
{ immediate: true }
86+
);
87+
7988
watch(
8089
() => showGraph.value,
8190
(show) => {
@@ -233,14 +242,14 @@ async function onExecute() {
233242
<FontAwesomeIcon :icon="faSitemap" fixed-width />
234243
</BButton>
235244
<BButton
236-
v-if="model.runData.help"
245+
v-if="workflow?.readme || workflow?.help"
237246
v-b-tooltip.hover.noninteractive.html
238247
size="sm"
239248
:title="!showHelp ? 'Show workflow help' : 'Hide workflow help'"
240249
variant="link"
241250
:pressed="showHelp"
242251
@click="showRightPanel = showHelp ? null : 'help'">
243-
<FontAwesomeIcon :icon="faInfoCircle" fixed-width />
252+
<FontAwesomeIcon :icon="faReadme" fixed-width />
244253
</BButton>
245254
<BButton
246255
v-b-tooltip.hover.noninteractive
@@ -312,7 +321,11 @@ async function onExecute() {
312321
</div>
313322
</div>
314323

315-
<WorkflowAnnotation :workflow-id="model.runData.workflow_id" :history-id="model.historyId" show-details />
324+
<WorkflowAnnotation
325+
:workflow-id="model.runData.workflow_id"
326+
:history-id="model.historyId"
327+
show-details
328+
:hide-hr="Boolean(showRightPanel)" />
316329

317330
<div class="overflow-auto h-100">
318331
<div class="d-flex h-100">
@@ -347,11 +360,7 @@ async function onExecute() {
347360
:form-inputs="formInputs" />
348361
<div v-else-if="showHelp" class="d-flex flex-column">
349362
<Heading class="sticky-top" h2 separator bold size="sm"> Help </Heading>
350-
<BCard class="mx-1 flex-grow-1 overflow-auto">
351-
<!-- eslint-disable-next-line vue/no-v-html -->
352-
<p class="container" v-html="renderMarkdown(model.runData.help)" />
353-
<div class="py-2 text-center">- End of help -</div>
354-
</BCard>
363+
<WorkflowHelpDisplay :workflow="workflow" :loading="workflowLoading" />
355364
</div>
356365
</div>
357366
</div>

client/src/components/Workflow/WorkflowAnnotation.vue

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ import { faClock } from "@fortawesome/free-regular-svg-icons";
33
import { faExclamation, faHdd } from "@fortawesome/free-solid-svg-icons";
44
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
55
import { BBadge } from "bootstrap-vue";
6-
import { computed, ref } from "vue";
6+
import { computed } from "vue";
77
8-
import { useMarkdown } from "@/composables/markdown";
98
import { useWorkflowInstance } from "@/composables/useWorkflowInstance";
109
import { useHistoryStore } from "@/stores/historyStore";
1110
12-
import Heading from "../Common/Heading.vue";
1311
import TextSummary from "../Common/TextSummary.vue";
1412
import SwitchToHistoryLink from "../History/SwitchToHistoryLink.vue";
1513
import StatelessTags from "../TagsMultiselect/StatelessTags.vue";
@@ -22,6 +20,7 @@ interface Props {
2220
invocationUpdateTime?: string;
2321
historyId: string;
2422
showDetails?: boolean;
23+
hideHr?: boolean;
2524
}
2625
2726
const props = withDefaults(defineProps<Props>(), {
@@ -45,14 +44,6 @@ const timeElapsed = computed(() => {
4544
const workflowTags = computed(() => {
4645
return workflow.value?.tags || [];
4746
});
48-
49-
const readmeShown = ref(false);
50-
51-
const { renderMarkdown } = useMarkdown({
52-
openLinksInNewPage: true,
53-
removeNewlinesAfterList: true,
54-
increaseHeadingLevelBy: 1,
55-
});
5647
</script>
5748

5849
<template>
@@ -91,20 +82,7 @@ const { renderMarkdown } = useMarkdown({
9182
<div v-if="props.showDetails">
9283
<TextSummary v-if="description" class="my-1" :description="description" one-line-summary component="span" />
9384
<StatelessTags v-if="workflowTags.length" :value="workflowTags" :disabled="true" />
94-
<div v-if="workflow.readme" class="mt-2">
95-
<Heading
96-
h2
97-
separator
98-
bold
99-
size="sm"
100-
:collapse="readmeShown ? 'open' : 'closed'"
101-
@click="readmeShown = !readmeShown">
102-
<span v-localize>Readme</span>
103-
</Heading>
104-
<!-- eslint-disable-next-line vue/no-v-html -->
105-
<p v-if="readmeShown" v-html="renderMarkdown(workflow.readme)" />
106-
</div>
107-
<hr v-if="!workflow.readme" class="mb-0 mt-2" />
85+
<hr v-if="!props.hideHr" class="mb-0 mt-2" />
10886
</div>
10987
</div>
11088
</template>

0 commit comments

Comments
 (0)