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

Revises Markdown Pages and Reports #19226

Draft
wants to merge 158 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
158 commits
Select commit Hold shift + click to select a range
4f9d5a4
Add helper to generically split markdown sections without parsing arg…
guerler Dec 1, 2024
93f8996
Replace section parser in markdown component
guerler Dec 1, 2024
aa7a463
Move argument resolution to markdown container
guerler Dec 1, 2024
70a26a3
Add markdown renderer to default container
guerler Dec 1, 2024
8394a64
Move VegaWrapper to Common folder, use also in Markdown
guerler Dec 1, 2024
014342a
Add vitessce wrapper template
guerler Dec 2, 2024
32addec
Add plugin container
guerler Dec 2, 2024
f04ae68
Add Vitessce to Markdown options?
guerler Dec 2, 2024
af4e2e5
Move visualization wrapper to visualizations
guerler Dec 2, 2024
78e1a64
Fix naming for consistency
guerler Dec 2, 2024
a669cb5
Move markdown galaxy section components to subdirectory
guerler Dec 2, 2024
628f56f
Convert Markdown main component to composition api
guerler Dec 2, 2024
eaf33d5
Adjust loading flag
guerler Dec 2, 2024
20d7d94
Fix code editor props
guerler Dec 3, 2024
c8cc805
Fix code editor handling
guerler Dec 3, 2024
dfae9cb
Restore text editor
guerler Jan 14, 2025
5bba670
Move text editor variant to separate component
guerler Jan 14, 2025
0364dd8
Format client
guerler Jan 14, 2025
1c97088
Use markdown help modal within text editor component
guerler Jan 14, 2025
0bc2991
Move help modal and buttons to parent wrapper
guerler Jan 14, 2025
1445c5c
Refine markup
guerler Jan 14, 2025
1d5d036
Allow switching between editor types
guerler Jan 14, 2025
f68720b
Add tooltip
guerler Jan 14, 2025
afc6ff5
Reduce editor font-size from 16 to 14
guerler Jan 14, 2025
7398efe
Resolve missing prop console warnings
guerler Jan 15, 2025
79497ef
Avoid parsing empty rows, prepare for more generalized typing in pars…
guerler Jan 15, 2025
a9433a2
Use documented option to place popper instead of manually applying ma…
guerler Jan 15, 2025
0e83ac7
Add event handler as prep to insert cells
guerler Jan 15, 2025
ff97e5c
Show arrow in popover
guerler Jan 15, 2025
ddd4fe6
Add additional insert options
guerler Jan 16, 2025
f3d3816
Consider editor layouts
guerler Jan 18, 2025
59026dd
Add ace editor
guerler Jan 19, 2025
6572321
Refine code editor config
guerler Jan 19, 2025
c51ba80
Align editor layout
guerler Jan 19, 2025
0f08aee
Rename default section to markdown section
guerler Jan 19, 2025
0d22ceb
Map different modes to cell types
guerler Jan 19, 2025
4c9b16f
Add preliminary preview to markdown editor
guerler Jan 19, 2025
aaafa3e
Add update event handler to code cell
guerler Jan 20, 2025
7c31630
Add basic error handling to vega wrapper
guerler Jan 20, 2025
95dd7cc
Add error handling to shared vega wrapper
guerler Jan 20, 2025
14a76b6
Show both, error message and previous preview
guerler Jan 20, 2025
0c49494
Move debounce handler into code cell
guerler Jan 20, 2025
71560cc
Add update handler to cell based markdown editor
guerler Jan 20, 2025
4355f38
Start drafting additional cell wrapper options
guerler Jan 20, 2025
3a3b78b
Adjust layout, switch to buttons
guerler Jan 20, 2025
f75d49e
Add cell wrapper
guerler Jan 20, 2025
9ad9ed5
Fix button alignment in cell editor guide column
guerler Jan 20, 2025
c13068a
Unify guide column buttons for now
guerler Jan 20, 2025
01e682f
Add toggle handler for code section
guerler Jan 20, 2025
165a798
Add wrapper for guide buttons in cell editor
guerler Jan 21, 2025
9b18f33
Add hover highlighting for cell wrapper
guerler Jan 22, 2025
79617a6
Do not irreversibly patch invocation markdown
guerler Jan 23, 2025
6827502
Remove section mapper in workflow reports
guerler Jan 23, 2025
617cc92
Increase resilience of markdown provision to the front end
guerler Jan 23, 2025
e3c80fd
Add invocation_id to list of allowed arguments
guerler Jan 23, 2025
0ca6540
Populate invocation identifier for inputs and ouputs containers
guerler Jan 23, 2025
002ecac
Restore invocation markdown handler
guerler Jan 23, 2025
39505bb
Add invocation id to to entries containing input, output or step attr…
guerler Jan 23, 2025
0348e1b
Remove unused helper function
guerler Jan 23, 2025
1ce2bdc
Add Galaxy Wrapper to Cell Editor
guerler Jan 23, 2025
6a62ed0
Fix typescript, remove unused vars from license component
guerler Jan 24, 2025
237aad2
Remove unused regex expression in markdown utility for now
guerler Jan 24, 2025
28d9cb8
Add abstract placeholder functions for consistency
guerler Jan 24, 2025
992b431
Update markdown utility comment for resolve_invocation_markdown proce…
guerler Jan 24, 2025
7e34748
Implement placeholders for relocated container types
guerler Jan 24, 2025
566e2e0
Remove prepopulated workflows list from markdown wrapper, use axios f…
guerler Jan 26, 2025
b1b0072
Load invocation time without requiring pre populated invocation details
guerler Jan 26, 2025
051b3b4
Remove invocations from markdown galaxy container
guerler Jan 26, 2025
e1a856e
Convert markdown galaxy history link component to composition api
guerler Jan 26, 2025
3520919
Decouple history link from requiring prepopulated history summaries, …
guerler Jan 26, 2025
1022079
Remove histories from markdown galaxy container props
guerler Jan 26, 2025
d206072
Fix post helper to import history from link
guerler Jan 26, 2025
75825ad
Remove version major prop from markdown component, version is already…
guerler Jan 26, 2025
fd06bbc
Remove time from markdown props
guerler Jan 26, 2025
77f799f
Make sure to trim before applying regex to match containers
guerler Jan 26, 2025
a46cd22
Avoid using prepopulated collection details to access name in collect…
guerler Jan 26, 2025
b2c3ed0
Remove collections from galaxy container props
guerler Jan 26, 2025
bc0ea0c
Convert collection display component to composition api
guerler Jan 26, 2025
82e80a0
Improve visualization wrapper handling
guerler Jan 26, 2025
dab569a
Remove datasets prop from history dataset display component
guerler Jan 26, 2025
3d6a7ce
Obtain dataset name and type from metadata url provider in dataset di…
guerler Jan 26, 2025
16742a7
Parse props individually to history dataset image component
guerler Jan 26, 2025
7a8aecc
Convert history dataset details and display components to composition…
guerler Jan 26, 2025
5ecd8ba
Handle and add invocation data for invocation id in markdown
guerler Jan 27, 2025
319d96b
Move cell-guide to wrapper
guerler Jan 27, 2025
77a404e
Improve handling, display parsing errors
guerler Jan 27, 2025
4ea4108
Use axios call for now, revisit invocation store later
guerler Jan 27, 2025
5411fd6
Add step parser to markdown galaxy container
guerler Jan 27, 2025
a61752f
Add invocation input and output containers to markdown galaxy wrapper
guerler Jan 27, 2025
3ab03fd
Sort markdown galaxy container types alphabetically
guerler Jan 27, 2025
8e35500
Add implicit_collection_jobs_id to args if available
guerler Jan 27, 2025
d545aab
Add fallback case for already assigned target entries
guerler Jan 27, 2025
8dcb7f3
Fix markdown container margins
guerler Jan 27, 2025
dfb424a
Use simple caching to avoid duplicate requests on markdown page loadi…
guerler Jan 27, 2025
264c957
Collect plugin data from api instead of relying on static path sources
guerler Jan 27, 2025
ae429cb
Improve error handling in visualization wrapper
guerler Jan 27, 2025
57ff1e1
Generalize visualization wrapper
guerler Jan 27, 2025
4242704
Refresh visualization on changes
guerler Jan 27, 2025
8b95022
Remove specialized visualization wrapper
guerler Jan 27, 2025
0e89083
Adjust size, ensure that error message does not resize view
guerler Jan 27, 2025
7ac4a5c
Specify visualization wrapper height in styles
guerler Jan 28, 2025
c368044
Add alert for invalid cell types
guerler Jan 28, 2025
e77acc3
Add error handling to visualization wrapper
guerler Jan 28, 2025
1f6136c
Add error message to output
guerler Jan 28, 2025
3ac316e
Update ngl package version
guerler Jan 30, 2025
dd4acff
Update ngl version
guerler Jan 30, 2025
54d22c5
Add listener for posted messages
guerler Jan 30, 2025
fb627c1
Add event handler to listen to galaxy charts form changes
guerler Jan 30, 2025
b124d2f
Avoid redundant refresh, format json
guerler Jan 30, 2025
a805ee1
Upgrade ngl version
guerler Jan 30, 2025
28e7a37
Access posted message using generic source name, parse object directly
guerler Jan 30, 2025
4935df7
Update charts package for plotly
guerler Jan 30, 2025
96d9bcd
Update to consistent message handler
guerler Jan 31, 2025
2da4d1c
Adjust config and title parsing
guerler Jan 31, 2025
8ba5ffb
Add arrow buttons to cell guide
guerler Feb 1, 2025
af8501c
Align guide element styles
guerler Feb 1, 2025
a683440
Fix popper for insert button
guerler Feb 1, 2025
5dfc018
Add delete cell handler
guerler Feb 1, 2025
8e18036
Add on update handler
guerler Feb 1, 2025
b87eab2
Allow cloning cells
guerler Feb 1, 2025
00b47f4
Add handler to move cells up and down
guerler Feb 1, 2025
755ed43
Recreate code editor if cell type changes
guerler Feb 1, 2025
933d53b
Allow expanding when clicking on guide
guerler Feb 1, 2025
398bccc
Scroll to cloned or moved cell
guerler Feb 2, 2025
9f7aec6
Handle toggle state in cell editor
guerler Feb 2, 2025
90a3805
Disable move buttons when limits are reached
guerler Feb 2, 2025
7268f13
Add list for cell templates
guerler Feb 2, 2025
20234aa
Preliminary draft of insertion popover
guerler Feb 2, 2025
dce2aba
Add basic templates
guerler Feb 2, 2025
8380420
Fix scroll to new insert
guerler Feb 2, 2025
5ca4a67
Add basic template filter
guerler Feb 2, 2025
834575f
Move filter helper to add button, simplify templates file
guerler Feb 2, 2025
1bff866
Add error message if filtering fails, fix popup closing on background
guerler Feb 2, 2025
f36f95a
Add more draft entries to the insertion list
guerler Feb 2, 2025
3462767
Remove unused = from template
guerler Feb 2, 2025
cbe0208
Add placeholder configuration component to attach data
guerler Feb 3, 2025
3f3cced
Align styles, add separator for config dialog
guerler Feb 3, 2025
a317698
Add close event handlers for data attachment view, hide option for ma…
guerler Feb 3, 2025
df0c357
Move to subcomponent for data attachment
guerler Feb 5, 2025
2e760cd
Update ngl and plotly packages with latest charts module
guerler Feb 7, 2025
2554905
Close popover on escape
guerler Feb 7, 2025
8df8690
Add additional option to close when clicking on particular elements i…
guerler Feb 7, 2025
57a2a10
Use actual triangle for popper arrow
guerler Feb 7, 2025
b592ab4
Update ngl and plotly package version
guerler Feb 7, 2025
3acac81
Update charts package with fixed tooltip attachment, add warning to d…
guerler Feb 8, 2025
8b9e9ba
Draft data attachment select field
guerler Feb 8, 2025
abd4a7c
Improve error handling when selecting datasets, preserve dataset name
guerler Feb 8, 2025
9b64694
Remove unused import
guerler Feb 8, 2025
638f86d
Add ace code editor package
guerler Feb 8, 2025
c4112b5
Adjust directive handler
guerler Feb 9, 2025
48d8db4
Fix linting
guerler Feb 9, 2025
1e5fb0c
Fix parse client test
guerler Feb 9, 2025
fff04e0
Allow invocation identifier in custom report
guerler Feb 9, 2025
21c8922
Transition changes made in #19470 by @ahmedhamidawan
guerler Feb 9, 2025
68a79a4
Fix unit tests
guerler Feb 10, 2025
9728a86
Fix invocation output unit test
guerler Feb 10, 2025
e248d5c
Modularize data attachment selectors
guerler Feb 13, 2025
3643b06
Add handler for Galaxy cells
guerler Feb 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
"@types/jest": "^29.5.12",
"@vueuse/core": "^10.5.0",
"@vueuse/math": "^10.9.0",
"ace-builds": "^1.37.5",
"assert": "^2.1.0",
"axios": "^1.6.2",
"babel-runtime": "^6.26.0",
Expand Down Expand Up @@ -87,6 +88,7 @@
"pinia": "^2.1.7",
"popper.js": "^1.16.1",
"pretty-bytes": "^6.1.1",
"prismjs": "^1.29.0",
"pyre-to-regexp": "^0.0.6",
"querystring-es3": "^0.2.1",
"regenerator-runtime": "^0.14.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
<template>
<div ref="chartContainer" :style="style"></div>
<div>
<b-alert v-if="errorMessage" class="p-2" variant="danger" show>
{{ errorMessage }}
</b-alert>
<div ref="chartContainer" :style="style" />
</div>
</template>

<script setup lang="ts">
Expand All @@ -24,21 +29,28 @@ const style = computed(() => {
});

const chartContainer = ref<HTMLDivElement | null>(null);
const errorMessage = ref<string>("");

let vegaView: any;

async function embedChart() {
if (vegaView) {
vegaView.finalize();
}
if (chartContainer.value !== null) {
const result = await embed(chartContainer.value, props.spec, { renderer: "svg" });
vegaView = result.view;
try {
if (vegaView) {
vegaView.finalize();
}
if (chartContainer.value !== null) {
const result = await embed(chartContainer.value, props.spec, { renderer: "svg" });
vegaView = result.view;
}
errorMessage.value = "";
} catch (e: any) {
errorMessage.value = String(e);
}
}

onMounted(embedChart);

watch(props, embedChart, { immediate: true, deep: true });
watch(props, embedChart, { deep: true });
useResizeObserver(chartContainer, () => {
if (vegaView) {
vegaView.resize();
Expand Down
77 changes: 77 additions & 0 deletions client/src/components/Markdown/Editor/CellAdd.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<template>
<div class="cell-guide d-flex flex-column justify-content-between">
<CellButton ref="buttonRef" title="Insert Cell">
<FontAwesomeIcon :icon="faPlus" />
</CellButton>
<Popper v-if="buttonRef" :reference-el="buttonRef.$el" trigger="click" placement="right" mode="light">
<DelayedInput class="p-1" :delay="100" placeholder="Search" @change="query = $event" />
<div class="cell-add-categories overflow-auto">
<div v-if="filteredTemplates.length > 0">
<div v-for="(category, categoryIndex) of filteredTemplates" :key="categoryIndex">
<hr class="solid m-0" />
<span class="d-flex justify-content-between">
<small class="my-1 mx-3 text-info">{{ category.name }}</small>
</span>
<div v-if="category.templates.length > 0" class="cell-add-options popper-close">
<CellOption
v-for="(option, optionIndex) of category.templates"
:key="optionIndex"
:title="option.title"
:description="option.description"
@click="$emit('click', { ...option.cell, configure: false, toggle: true })" />
</div>
</div>
</div>
<b-alert v-else class="m-1 p-1" variant="info" show> No results found for "{{ query }}". </b-alert>
</div>
</Popper>
</div>
</template>

<script setup lang="ts">
import { faPlus } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
import { computed, ref } from "vue";

import { cellTemplates } from "./templates";
import type { CellType, TemplateCategory } from "./types";

import CellButton from "./CellButton.vue";
import CellOption from "./CellOption.vue";
import DelayedInput from "@/components/Common/DelayedInput.vue";
import Popper from "@/components/Popper/Popper.vue";

defineEmits<{
(e: "click", cell: CellType): void;
}>();

const buttonRef = ref();
const query = ref("");

const filteredTemplates = computed(() => {
const filteredCategories: Array<TemplateCategory> = [];
cellTemplates.forEach((category) => {
const matchedTemplates = category.templates.filter(
(template) =>
category.name.toLowerCase().includes(query.value.toLowerCase()) ||
template.title.toLowerCase().includes(query.value.toLowerCase()) ||
template.description.toLowerCase().includes(query.value.toLowerCase())
);
if (matchedTemplates.length > 0) {
filteredCategories.push({
name: category.name,
templates: matchedTemplates,
});
}
});
return filteredCategories;
});
</script>

<style>
.cell-add-categories {
max-height: 20rem;
max-width: 15rem;
min-width: 15rem;
}
</style>
32 changes: 32 additions & 0 deletions client/src/components/Markdown/Editor/CellButton.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<template>
<BButton
v-b-tooltip.right
class="border-0 m-1 px-1 py-0"
:title="title"
variant="outline-primary"
@click="onClick()"
@mouseleave="onMouseLeave($event)">
<slot />
</BButton>
</template>

<script setup lang="ts">
import { BButton } from "bootstrap-vue";

defineProps<{
title: string;
}>();

const emit = defineEmits<{
(e: "click"): void;
}>();

function onMouseLeave(event: Event) {
const target = event.target as HTMLElement;
target.blur();
}

function onClick() {
emit("click");
}
</script>
98 changes: 98 additions & 0 deletions client/src/components/Markdown/Editor/CellCode.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
<template>
<div ref="editor" class="w-100" />
</template>

<script setup>
import ace from "ace-builds";
import { debounce } from "lodash";
import { onBeforeUnmount, onMounted, ref, watch } from "vue";

const DELAY = 300;

const props = defineProps({
theme: {
type: String,
default: "github_light_default",
},
mode: {
type: String,
default: "json",
},
value: {
type: String,
required: true,
},
});

const emit = defineEmits(["change"]);

const editor = ref(null);

let aceEditor = null;

const emitChange = debounce((newValue) => {
emit("change", newValue);
}, DELAY);

async function buildEditor() {
const modePath = `ace/mode/${props.mode}`;
const themePath = `ace/theme/${props.theme}`;
const modeUrl = await import(`ace-builds/src-noconflict/mode-${props.mode}?url`);
const themeUrl = await import(`ace-builds/src-noconflict/theme-${props.theme}?url`);
ace.config.setModuleUrl(modePath, modeUrl);
ace.config.setModuleUrl(themePath, themeUrl);
aceEditor = ace.edit(editor.value, {
highlightActiveLine: false,
highlightGutterLine: false,
maxLines: 30,
minLines: 1,
mode: modePath,
showPrintMargin: false,
theme: themePath,
useWorker: false,
value: props.value,
wrap: true,
});

aceEditor.on("blur", () => {
aceEditor.setOption("highlightActiveLine", false);
aceEditor.setOption("highlightGutterLine", false);
editor.value.classList.remove("cell-code-focus");
});

aceEditor.on("change", () => {
const newValue = aceEditor.getValue();
emitChange(newValue);
});

aceEditor.on("focus", () => {
aceEditor.setOption("highlightActiveLine", true);
aceEditor.setOption("highlightGutterLine", true);
editor.value.classList.add("cell-code-focus");
});
}

onBeforeUnmount(() => {
emitChange.cancel();
});

onMounted(() => {
buildEditor();
});

watch(
() => props.value,
(newValue) => {
if (aceEditor && newValue !== aceEditor.getValue()) {
aceEditor.setValue(newValue, -1);
}
}
);
</script>

<style lang="scss">
@import "theme/blue.scss";
.cell-code-focus {
background-color: $gray-100;
}
</style>
37 changes: 37 additions & 0 deletions client/src/components/Markdown/Editor/CellConfigure.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<template>
<div class="p-4 bg-white mb-2">
<div class="d-flex justify-content-between align-items-center mb-3">
<div>
<div class="h2">Attach Data</div>
<div class="small">Fill in the fields below to map required inputs to this cell.</div>
</div>
<BButton variant="link" class="align-self-start" @click="$emit('cancel')">
<FontAwesomeIcon :icon="faTimes" class="fa-lg" />
</BButton>
</div>
<ConfigureGalaxy v-if="name === 'galaxy'" :content="content" @change="$emit('change', $event)" />
<ConfigureVisualization
v-else-if="name === 'visualization'"
:content="content"
@change="$emit('change', $event)" />
<b-alert v-else variant="warning" show> Data cannot be linked to this cell type. </b-alert>
</div>
</template>

<script setup lang="ts">
import { faTimes } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";

import ConfigureGalaxy from "./Configurations/ConfigureGalaxy.vue";
import ConfigureVisualization from "./Configurations/ConfigureVisualization.vue";

defineProps<{
name: string;
content: string;
}>();

defineEmits<{
(e: "cancel"): void;
(e: "change", content: string): void;
}>();
</script>
Loading
Loading