Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Render Useful Markdown Components for Mapped Over Steps #17198

Merged
merged 3 commits into from
Jan 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions client/src/api/schema/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5495,6 +5495,11 @@ export interface components {
* @example 0123456789ABCDEF
*/
id: string;
/**
* Implicit Collection Jobs Id
* @description Encoded ID for the ICJ object describing the collection of jobs corresponding to this collection
*/
implicit_collection_jobs_id?: string | null;
/**
* Job Source ID
* @description The encoded ID of the Job that produced this dataset collection. Used to track the state of the job.
Expand Down Expand Up @@ -16846,6 +16851,7 @@ export interface operations {
/** @description Limit listing of jobs to those that match the history_id. If none, jobs from any history may be returned. */
/** @description Limit listing of jobs to those that match the specified workflow ID. If none, jobs from any workflow (or from no workflows) may be returned. */
/** @description Limit listing of jobs to those that match the specified workflow invocation ID. If none, jobs from any workflow invocation (or from no workflows) may be returned. */
/** @description Limit listing of jobs to those that match the specified implicit collection job ID. If none, jobs from any implicit collection execution (or from no implicit collection execution) may be returned. */
/** @description Sort results by specified field. */
/**
* @description A mix of free text and GitHub-style tags used to filter the index operation.
Expand Down Expand Up @@ -16897,6 +16903,7 @@ export interface operations {
history_id?: string | null;
workflow_id?: string | null;
invocation_id?: string | null;
implicit_collection_jobs_id?: string | null;
order_by?: components["schemas"]["JobIndexSortByEnum"];
search?: string | null;
limit?: number;
Expand Down
11 changes: 9 additions & 2 deletions client/src/components/JobMetrics/JobMetrics.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { computed, ref, unref } from "vue";
import { computed, ref, unref, watch } from "vue";

import { useJobMetricsStore } from "@/stores/jobMetricsStore";

Expand Down Expand Up @@ -60,7 +60,14 @@ async function getJobMetrics() {
await jobMetricsStore.fetchJobMetricsForDatasetId(props.datasetId, props.datasetType);
}
}
getJobMetrics();

watch(
props,
() => {
getJobMetrics();
},
{ immediate: true }
);

const ec2Instances = ref<EC2[]>();
import("./awsEc2ReferenceData.js").then((data) => (ec2Instances.value = data.ec2Instances));
Expand Down
24 changes: 16 additions & 8 deletions client/src/components/JobParameters/JobParameters.vue
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,25 @@ export default {
return parameter ? parameter.value : `Parameter "${this.param}" is not found!`;
},
},
watch: {
jobId: function (newValue) {
this.initJob();
},
},
created: function () {
let url;
if (this.jobId) {
url = `${getAppRoot()}api/jobs/${this.jobId}/parameters_display`;
} else {
url = `${getAppRoot()}api/datasets/${this.datasetId}/parameters_display?hda_ldda=${this.datasetType}`;
}
this.ajaxCall(url);
this.isSingleParam = this.param !== undefined && this.param !== "undefined";
this.initJob();
},
methods: {
initJob() {
let url;
if (this.jobId) {
url = `${getAppRoot()}api/jobs/${this.jobId}/parameters_display`;
} else {
url = `${getAppRoot()}api/datasets/${this.datasetId}/parameters_display?hda_ldda=${this.datasetType}`;
}
this.ajaxCall(url);
this.isSingleParam = this.param !== undefined && this.param !== "undefined";
},
appRoot: function () {
return getAppRoot();
},
Expand Down
51 changes: 40 additions & 11 deletions client/src/components/Markdown/Elements/JobMetrics.vue
Original file line number Diff line number Diff line change
@@ -1,35 +1,57 @@
<script setup lang="ts">
import { computed, watch } from "vue";
import { computed, toRef, watch } from "vue";

import { useJobStore } from "@/stores/jobStore";

import { useMappingJobs } from "./handlesMappingJobs";

import JobSelection from "./JobSelection.vue";
import JobMetrics from "@/components/JobMetrics/JobMetrics.vue";
import ToolLinkPopover from "@/components/Tool/ToolLinkPopover.vue";

interface JobMetricsProps {
jobId: string;
jobId?: string;
implicitCollectionJobsId?: string;
title?: string;
footer?: string;
}

const props = withDefaults(defineProps<JobMetricsProps>(), {
jobId: undefined,
implicitCollectionJobsId: undefined,
title: undefined,
footer: undefined,
});

const jobStore = useJobStore();

const toolId = computed(() => {
return jobStore.getJob(props.jobId)?.tool_id;
if (targetJobId.value) {
return jobStore.getJob(targetJobId.value)?.tool_id;
}
return undefined;
});
const toolVersion = computed(() => {
return jobStore.getJob(props.jobId)?.tool_version;
if (targetJobId.value) {
return jobStore.getJob(targetJobId.value)?.tool_version;
}
return undefined;
});
const jobIdRef = toRef(props, "jobId");
const implicitCollectionJobsIdRef = toRef(props, "implicitCollectionJobsId");

const { selectJobOptions, selectedJob, targetJobId } = useMappingJobs(jobIdRef, implicitCollectionJobsIdRef);

async function init() {
if (targetJobId.value) {
jobStore.fetchJob(targetJobId.value);
}
}

watch(
props,
targetJobId,
() => {
jobStore.fetchJob(props.jobId);
init();
},
{ immediate: true }
);
Expand All @@ -42,12 +64,19 @@ watch(
<icon ref="info" icon="info-circle" size="sm" />
<ToolLinkPopover :target="() => $refs.info" :tool-id="toolId" :tool-version="toolVersion" />
</b-card-title>
<JobMetrics
class="job-metrics"
<JobSelection
v-model="selectedJob"
:job-id="jobId"
:should-show-aws-estimate="false"
:should-show-carbon-emissions-estimates="false"
:include-title="false" />
:implicit-collection-jobs-id="implicitCollectionJobsId"
:select-job-options="selectJobOptions">
<JobMetrics
v-if="targetJobId"
class="job-metrics"
:job-id="targetJobId"
:should-show-aws-estimate="false"
:should-show-carbon-emissions-estimates="false"
:include-title="false" />
</JobSelection>
<b-card-footer v-if="footer">
{{ footer }}
</b-card-footer>
Expand Down
43 changes: 36 additions & 7 deletions client/src/components/Markdown/Elements/JobParameters.vue
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
<script setup lang="ts">
import { computed, watch } from "vue";
import { computed, toRef, watch } from "vue";

import { useJobStore } from "@/stores/jobStore";

import { useMappingJobs } from "./handlesMappingJobs";

import JobSelection from "./JobSelection.vue";
import JobParameters from "@/components/JobParameters/JobParameters.vue";
import ToolLinkPopover from "@/components/Tool/ToolLinkPopover.vue";

interface JobParametersProps {
jobId: string;
jobId?: string;
implicitCollectionJobsId?: string;
param?: string;
title?: string;
footer?: string;
}

const props = withDefaults(defineProps<JobParametersProps>(), {
jobId: undefined,
implicitCollectionJobsId: undefined,
param: undefined,
title: undefined,
footer: undefined,
Expand All @@ -22,16 +28,32 @@ const props = withDefaults(defineProps<JobParametersProps>(), {
const jobStore = useJobStore();

const toolId = computed(() => {
return jobStore.getJob(props.jobId)?.tool_id;
if (targetJobId.value) {
return jobStore.getJob(targetJobId.value)?.tool_id;
}
return undefined;
});
const toolVersion = computed(() => {
return jobStore.getJob(props.jobId)?.tool_version;
if (targetJobId.value) {
return jobStore.getJob(targetJobId.value)?.tool_version;
}
return undefined;
});
const jobIdRef = toRef(props, "jobId");
const implicitCollectionJobsIdRef = toRef(props, "implicitCollectionJobsId");

const { selectJobOptions, selectedJob, targetJobId } = useMappingJobs(jobIdRef, implicitCollectionJobsIdRef);

async function init() {
if (targetJobId.value) {
jobStore.fetchJob(targetJobId.value);
}
}

watch(
props,
targetJobId,
() => {
jobStore.fetchJob(props.jobId);
init();
},
{ immediate: true }
);
Expand All @@ -44,7 +66,14 @@ watch(
<icon ref="info" icon="info-circle" size="sm" />
<ToolLinkPopover :target="() => $refs.info" :tool-id="toolId" :tool-version="toolVersion" />
</b-card-title>
<JobParameters class="job-parameters" :job-id="jobId" :param="param" :include-title="false" />
<JobSelection
v-model="selectedJob"
:job-id="jobId"
:implicit-collection-jobs-id="implicitCollectionJobsId"
:select-job-options="selectJobOptions">
<JobParameters class="job-parameters" :job-id="targetJobId" :param="param" :include-title="false" />
{{ targetJobId }}
</JobSelection>
<b-card-footer v-if="footer">
{{ footer }}
</b-card-footer>
Expand Down
44 changes: 44 additions & 0 deletions client/src/components/Markdown/Elements/JobSelection.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<script setup lang="ts">
import { SelectOption } from "./handlesMappingJobs";

interface JobSelectionProps {
jobId?: string;
implicitCollectionJobsId?: string;
selectJobOptions: SelectOption[];
value?: String | undefined;
}

const emit = defineEmits<{
(e: "input", id: string | undefined): void;
}>();

function handleInput(value: string | undefined) {
emit("input", value);
}
defineProps<JobSelectionProps>();
</script>

<template>
<div>
<slot v-if="jobId"> </slot>
<div v-else>
<b-navbar>
<b-collapse id="nav-text-collapse" is-nav>
<b-navbar-nav>
<b-nav-text>Select Job</b-nav-text>
</b-navbar-nav>
<b-nav-form>
<b-input-group size="sm">
<b-form-select
:value="value"
class="text-right"
:options="selectJobOptions"
@input="handleInput"></b-form-select>
</b-input-group>
</b-nav-form>
</b-collapse>
</b-navbar>
<slot />
</div>
</div>
</template>