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 137 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
137 commits
Select commit Hold shift + click to select a range
2687ca5
Add helper to generically split markdown sections without parsing arg…
guerler Dec 1, 2024
3c9f973
Replace section parser in markdown component
guerler Dec 1, 2024
f15227a
Move argument resolution to markdown container
guerler Dec 1, 2024
b624c1b
Add markdown renderer to default container
guerler Dec 1, 2024
80d7c96
Move VegaWrapper to Common folder, use also in Markdown
guerler Dec 1, 2024
7ef59d2
Add vitessce wrapper template
guerler Dec 2, 2024
249a49b
Add plugin container
guerler Dec 2, 2024
4466132
Add Vitessce to Markdown options?
guerler Dec 2, 2024
dcc7d3e
Move visualization wrapper to visualizations
guerler Dec 2, 2024
fc577c0
Fix naming for consistency
guerler Dec 2, 2024
d25ed2e
Move markdown galaxy section components to subdirectory
guerler Dec 2, 2024
42ebe98
Convert Markdown main component to composition api
guerler Dec 2, 2024
28ef1d9
Adjust loading flag
guerler Dec 2, 2024
cddefb0
Fix code editor props
guerler Dec 3, 2024
c614dd4
Fix code editor handling
guerler Dec 3, 2024
b647131
Restore text editor
guerler Jan 14, 2025
d0ef949
Move text editor variant to separate component
guerler Jan 14, 2025
e7ecfcd
Format client
guerler Jan 14, 2025
bcccb7a
Use markdown help modal within text editor component
guerler Jan 14, 2025
41b9456
Move help modal and buttons to parent wrapper
guerler Jan 14, 2025
bc52b14
Refine markup
guerler Jan 14, 2025
1d3c099
Allow switching between editor types
guerler Jan 14, 2025
c2cbe4b
Add tooltip
guerler Jan 14, 2025
7586dfd
Reduce editor font-size from 16 to 14
guerler Jan 14, 2025
f8573fc
Resolve missing prop console warnings
guerler Jan 15, 2025
8a5a2f5
Avoid parsing empty rows, prepare for more generalized typing in pars…
guerler Jan 15, 2025
103617c
Use documented option to place popper instead of manually applying ma…
guerler Jan 15, 2025
8fab3fb
Add event handler as prep to insert cells
guerler Jan 15, 2025
165253a
Show arrow in popover
guerler Jan 15, 2025
3a135e2
Add additional insert options
guerler Jan 16, 2025
af97c5c
Consider editor layouts
guerler Jan 18, 2025
285cba4
Add ace editor
guerler Jan 19, 2025
5695509
Refine code editor config
guerler Jan 19, 2025
2ee4ac6
Align editor layout
guerler Jan 19, 2025
6117dbc
Rename default section to markdown section
guerler Jan 19, 2025
d422646
Map different modes to cell types
guerler Jan 19, 2025
ffa8a81
Add preliminary preview to markdown editor
guerler Jan 19, 2025
4908413
Add update event handler to code cell
guerler Jan 20, 2025
2a737f6
Add basic error handling to vega wrapper
guerler Jan 20, 2025
af62fb0
Add error handling to shared vega wrapper
guerler Jan 20, 2025
93e86e3
Show both, error message and previous preview
guerler Jan 20, 2025
b572e2f
Move debounce handler into code cell
guerler Jan 20, 2025
a0ab563
Add update handler to cell based markdown editor
guerler Jan 20, 2025
121c045
Start drafting additional cell wrapper options
guerler Jan 20, 2025
bb3307f
Adjust layout, switch to buttons
guerler Jan 20, 2025
bf9d5b7
Add cell wrapper
guerler Jan 20, 2025
7228ee4
Fix button alignment in cell editor guide column
guerler Jan 20, 2025
3d5f196
Unify guide column buttons for now
guerler Jan 20, 2025
60de99c
Add toggle handler for code section
guerler Jan 20, 2025
959e017
Add wrapper for guide buttons in cell editor
guerler Jan 21, 2025
669c1cd
Add hover highlighting for cell wrapper
guerler Jan 22, 2025
d8f5b3d
Do not irreversibly patch invocation markdown
guerler Jan 23, 2025
efc7eeb
Remove section mapper in workflow reports
guerler Jan 23, 2025
bbd63f9
Increase resilience of markdown provision to the front end
guerler Jan 23, 2025
b123029
Add invocation_id to list of allowed arguments
guerler Jan 23, 2025
b463114
Populate invocation identifier for inputs and ouputs containers
guerler Jan 23, 2025
4fee02e
Restore invocation markdown handler
guerler Jan 23, 2025
ceccdf6
Add invocation id to to entries containing input, output or step attr…
guerler Jan 23, 2025
2c46d39
Remove unused helper function
guerler Jan 23, 2025
3157ed2
Add Galaxy Wrapper to Cell Editor
guerler Jan 23, 2025
1b55e28
Fix typescript, remove unused vars from license component
guerler Jan 24, 2025
96f310d
Remove unused regex expression in markdown utility for now
guerler Jan 24, 2025
51b7101
Add abstract placeholder functions for consistency
guerler Jan 24, 2025
bb1ede9
Update markdown utility comment for resolve_invocation_markdown proce…
guerler Jan 24, 2025
5aea668
Implement placeholders for relocated container types
guerler Jan 24, 2025
044d49d
Remove prepopulated workflows list from markdown wrapper, use axios f…
guerler Jan 26, 2025
cacaa1e
Load invocation time without requiring pre populated invocation details
guerler Jan 26, 2025
2ba225f
Remove invocations from markdown galaxy container
guerler Jan 26, 2025
6f37ec5
Convert markdown galaxy history link component to composition api
guerler Jan 26, 2025
f3c95ca
Decouple history link from requiring prepopulated history summaries, …
guerler Jan 26, 2025
d8caec6
Remove histories from markdown galaxy container props
guerler Jan 26, 2025
5d69dc1
Fix post helper to import history from link
guerler Jan 26, 2025
d2c3c4e
Remove version major prop from markdown component, version is already…
guerler Jan 26, 2025
96edc73
Remove time from markdown props
guerler Jan 26, 2025
6487db8
Make sure to trim before applying regex to match containers
guerler Jan 26, 2025
c90d046
Avoid using prepopulated collection details to access name in collect…
guerler Jan 26, 2025
23fe4d6
Remove collections from galaxy container props
guerler Jan 26, 2025
357821b
Convert collection display component to composition api
guerler Jan 26, 2025
add4002
Improve visualization wrapper handling
guerler Jan 26, 2025
d4e39f0
Remove datasets prop from history dataset display component
guerler Jan 26, 2025
f9a94e3
Obtain dataset name and type from metadata url provider in dataset di…
guerler Jan 26, 2025
378402c
Parse props individually to history dataset image component
guerler Jan 26, 2025
a29663a
Convert history dataset details and display components to composition…
guerler Jan 26, 2025
fca2568
Handle and add invocation data for invocation id in markdown
guerler Jan 27, 2025
8cc001d
Move cell-guide to wrapper
guerler Jan 27, 2025
2dc6684
Improve handling, display parsing errors
guerler Jan 27, 2025
086b448
Use axios call for now, revisit invocation store later
guerler Jan 27, 2025
86c9ca9
Add step parser to markdown galaxy container
guerler Jan 27, 2025
fd00218
Add invocation input and output containers to markdown galaxy wrapper
guerler Jan 27, 2025
4be1ca4
Sort markdown galaxy container types alphabetically
guerler Jan 27, 2025
f97a192
Add implicit_collection_jobs_id to args if available
guerler Jan 27, 2025
14839de
Add fallback case for already assigned target entries
guerler Jan 27, 2025
d0a8ba4
Fix markdown container margins
guerler Jan 27, 2025
431fc24
Use simple caching to avoid duplicate requests on markdown page loadi…
guerler Jan 27, 2025
cbf2035
Collect plugin data from api instead of relying on static path sources
guerler Jan 27, 2025
1c07928
Improve error handling in visualization wrapper
guerler Jan 27, 2025
85d94db
Generalize visualization wrapper
guerler Jan 27, 2025
f369927
Refresh visualization on changes
guerler Jan 27, 2025
af63b32
Remove specialized visualization wrapper
guerler Jan 27, 2025
70c14a7
Adjust size, ensure that error message does not resize view
guerler Jan 27, 2025
6c590de
Specify visualization wrapper height in styles
guerler Jan 28, 2025
ca2f9bc
Add alert for invalid cell types
guerler Jan 28, 2025
8f49764
Add error handling to visualization wrapper
guerler Jan 28, 2025
0a5787a
Add error message to output
guerler Jan 28, 2025
8a8c001
Update ngl package version
guerler Jan 30, 2025
31c3e14
Update ngl version
guerler Jan 30, 2025
91a87e6
Add listener for posted messages
guerler Jan 30, 2025
a044ff5
Add event handler to listen to galaxy charts form changes
guerler Jan 30, 2025
5667ea8
Avoid redundant refresh, format json
guerler Jan 30, 2025
795fe1b
Upgrade ngl version
guerler Jan 30, 2025
33054a5
Access posted message using generic source name, parse object directly
guerler Jan 30, 2025
311c63d
Update charts package for plotly
guerler Jan 30, 2025
ca4643e
Update to consistent message handler
guerler Jan 31, 2025
4f85a56
Adjust config and title parsing
guerler Jan 31, 2025
7cca1cb
Add arrow buttons to cell guide
guerler Feb 1, 2025
52f7669
Align guide element styles
guerler Feb 1, 2025
a57cfcb
Fix popper for insert button
guerler Feb 1, 2025
18aa1bb
Add delete cell handler
guerler Feb 1, 2025
1ded4ce
Add on update handler
guerler Feb 1, 2025
5d3d9de
Allow cloning cells
guerler Feb 1, 2025
dd83d38
Add handler to move cells up and down
guerler Feb 1, 2025
5d41a47
Recreate code editor if cell type changes
guerler Feb 1, 2025
5165492
Allow expanding when clicking on guide
guerler Feb 1, 2025
c9fbcb8
Scroll to cloned or moved cell
guerler Feb 2, 2025
cd42edc
Handle toggle state in cell editor
guerler Feb 2, 2025
df92567
Disable move buttons when limits are reached
guerler Feb 2, 2025
4848c6e
Add list for cell templates
guerler Feb 2, 2025
d4f13d5
Preliminary draft of insertion popover
guerler Feb 2, 2025
22d7673
Add basic templates
guerler Feb 2, 2025
0cab97a
Fix scroll to new insert
guerler Feb 2, 2025
e47965a
Add basic template filter
guerler Feb 2, 2025
d1df72c
Move filter helper to add button, simplify templates file
guerler Feb 2, 2025
12075a9
Add error message if filtering fails, fix popup closing on background
guerler Feb 2, 2025
b9719e5
Add more draft entries to the insertion list
guerler Feb 2, 2025
960c81d
Remove unused = from template
guerler Feb 2, 2025
9a928fb
Add placeholder configuration component to attach data
guerler Feb 3, 2025
db6a414
Align styles, add separator for config dialog
guerler Feb 3, 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
1 change: 1 addition & 0 deletions client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,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">
<CellOption
v-for="(option, optionIndex) of category.templates"
:key="optionIndex"
:title="option.title"
:description="option.description"
@click="$emit('click', { ...option.cell, 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="mt-1 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>
34 changes: 34 additions & 0 deletions client/src/components/Markdown/Editor/CellConfigure.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<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"><FontAwesomeIcon :icon="faTimes" class="fa-lg" /></BButton>
</div>
<div class="mb-3">
<label class="form-label">Workflow</label>
<input type="text" class="form-control" />
</div>
<div class="mb-3">
<label class="form-label">History Dataset</label>
<input type="text" class="form-control" />
</div>
<div class="d-flex justify-content-end">
<BButton variant="outline-primary" class="mr-2">Cancel</BButton>
<BButton variant="outline-primary">OK</BButton>
</div>
</div>
</template>

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

defineProps<{}>();

defineEmits<{
(e: "click"): void;
}>();
</script>
Loading