Skip to content

Commit

Permalink
Merge branch 'release_24.0' into dev
Browse files Browse the repository at this point in the history
  • Loading branch information
mvdbeek committed Apr 6, 2024
2 parents 9a28c6a + 249681d commit 9ff846a
Show file tree
Hide file tree
Showing 9 changed files with 199 additions and 53 deletions.
25 changes: 18 additions & 7 deletions client/src/components/Workflow/Editor/Index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
@onRefactor="onRefactor"
@onShow="hideModal" />
<MessagesModal :title="messageTitle" :message="messageBody" :error="messageIsError" @onHidden="resetMessage" />
<SaveChangesModal :nav-url.sync="navUrl" :show-modal.sync="showSaveChangesModal" @on-proceed="onNavigate" />
<b-modal
v-model="showSaveAsModal"
title="Save As a New Workflow"
Expand Down Expand Up @@ -147,7 +148,7 @@
<MarkdownEditor
v-else
:markdown-text="markdownText"
:markdown-config="markdownConfig"
:markdown-config="report"
mode="report"
:title="'Workflow Report: ' + name"
:steps="steps"
Expand All @@ -169,7 +170,7 @@
<script>
import { Toast } from "composables/toast";
import { storeToRefs } from "pinia";
import Vue, { computed, onUnmounted, ref, unref } from "vue";
import Vue, { computed, nextTick, onUnmounted, ref, unref } from "vue";
import { replaceLabel } from "@/components/Markdown/parse";
import { getUntypedWorkflowParameters } from "@/components/Workflow/Editor/modules/parameters";
Expand All @@ -195,6 +196,7 @@ import WorkflowLint from "./Lint.vue";
import MessagesModal from "./MessagesModal.vue";
import WorkflowOptions from "./Options.vue";
import RefactorConfirmationModal from "./RefactorConfirmationModal.vue";
import SaveChangesModal from "./SaveChangesModal.vue";
import StateUpgradeModal from "./StateUpgradeModal.vue";
import WorkflowGraph from "./WorkflowGraph.vue";
import MarkdownEditor from "@/components/Markdown/MarkdownEditor.vue";
Expand All @@ -207,6 +209,7 @@ export default {
components: {
MarkdownEditor,
FlexPanel,
SaveChangesModal,
StateUpgradeModal,
ToolPanel,
FormDefault,
Expand Down Expand Up @@ -313,7 +316,6 @@ export default {
data() {
return {
isCanvas: true,
markdownConfig: null,
markdownText: null,
versions: [],
parameters: null,
Expand Down Expand Up @@ -341,6 +343,8 @@ export default {
transform: { x: 0, y: 0, k: 1 },
graphOffset: { left: 0, top: 0, width: 0, height: 0 },
debounceTimer: null,
showSaveChangesModal: false,
navUrl: "",
};
},
computed: {
Expand Down Expand Up @@ -702,14 +706,21 @@ export default {
const runUrl = `/workflows/run?id=${this.id}`;
this.onNavigate(runUrl);
},
async onNavigate(url) {
async onNavigate(url, forceSave = false, ignoreChanges = false) {
if (this.isNewTempWorkflow) {
await this.onCreate();
} else {
await this.onSave(true);
} else if (this.hasChanges && !forceSave && !ignoreChanges) {
// if there are changes, prompt user to save or discard or cancel
this.navUrl = url;
this.showSaveChangesModal = true;
return;
} else if (forceSave) {
// when forceSave is true, save the workflow before navigating
await this.onSave();
}
this.hasChanges = false;
await nextTick();
this.$router.push(url);
},
onSave(hideProgress = false) {
Expand Down Expand Up @@ -787,8 +798,8 @@ export default {
const report = data.report || {};
const markdown = report.markdown || reportDefault;
this.report = report;
this.markdownText = markdown;
this.markdownConfig = report;
this.hideModal();
this.stateMessages = getStateUpgradeMessages(data);
const has_changes = this.stateMessages.length > 0;
Expand Down
97 changes: 97 additions & 0 deletions client/src/components/Workflow/Editor/SaveChangesModal.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
<script setup lang="ts">
import { library } from "@fortawesome/fontawesome-svg-core";
import { faSave, faTimes, faTrash } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
import { BButton, BModal } from "bootstrap-vue";
import { ref } from "vue";
import localize from "@/utils/localization";
library.add(faSave, faTimes, faTrash);
interface Props {
/** Show the save changes modal */
showModal: boolean;
/** The URL to navigate to before saving/ignoring changes */
navUrl: string;
}
const props = withDefaults(defineProps<Props>(), {
showModal: false,
});
const busy = ref(false);
const emit = defineEmits<{
/** Proceed with or without saving the changes */
(e: "on-proceed", url: string, forceSave: boolean, ignoreChanges: boolean): void;
/** Update the nav URL prop */
(e: "update:nav-url", url: string): void;
/** Update the show modal boolean prop */
(e: "update:show-modal", showModal: boolean): void;
}>();
const title = localize("You have unsaved changes. Do you want to save them before proceeding?");
const body = localize(
"Click 'Save' to save your changes and proceed, 'Don't Save' to discard them and proceed, or 'Cancel' to return to the editor."
);
const buttonTitles = {
cancel: localize("Do not run proceed and return to editor"),
dontSave: localize("Discard changes and proceed"),
save: localize("Save changes and proceed"),
};
function closeModal() {
emit("update:show-modal", false);
emit("update:nav-url", "");
}
function dontSave() {
busy.value = true;
emit("on-proceed", props.navUrl, false, true);
}
function saveChanges() {
busy.value = true;
closeModal();
emit("on-proceed", props.navUrl, true, false);
}
</script>

<template>
<BModal :title="title" :visible="props.showModal" @close="closeModal" @hide="closeModal">
<div>
{{ body }}
</div>
<template v-slot:modal-footer>
<BButton
v-b-tooltip.noninteractive.hover
:title="buttonTitles['cancel']"
variant="secondary"
:disabled="busy"
@click="closeModal">
<FontAwesomeIcon :icon="faTimes" />
{{ localize("Cancel") }}
</BButton>
<BButton
v-b-tooltip.noninteractive.hover
:title="buttonTitles['dontSave']"
variant="danger"
:disabled="busy"
@click="dontSave">
<FontAwesomeIcon :icon="faTrash" />
{{ localize("Don't Save") }}
</BButton>
<BButton
v-b-tooltip.noninteractive.hover
:title="buttonTitles['save']"
variant="primary"
:disabled="busy"
@click="saveChanges">
<FontAwesomeIcon :icon="faSave" />
{{ localize("Save") }}
</BButton>
</template>
</BModal>
</template>
1 change: 1 addition & 0 deletions client/src/stores/workflowStepStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,7 @@ export const useWorkflowStepStore = defineScopedStore("workflowStepStore", (work

del(steps.value, stepId.toString());
del(stepExtraInputs.value, stepId);
del(stepMapOver.value, stepId.toString());
}

return {
Expand Down
41 changes: 35 additions & 6 deletions doc/source/admin/galaxy_options.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1453,7 +1453,7 @@
This option has no effect if the file specified by
object_store_config_file exists. Otherwise, if this option is set,
it overrides any other objectstore settings.
The syntax, available instrumenters, and documentation of their
The syntax, available storage plugins, and documentation of their
options is explained in detail in the object store sample
configuration file, `object_store_conf.sample.yml`
:Default: ``None``
Expand Down Expand Up @@ -2606,8 +2606,20 @@

:Description:
The upload store is a temporary directory in which files uploaded
by the tus middleware or server will be placed. Defaults to
new_file_path if not set.
by the tus middleware or server for user uploads will be placed.
Defaults to new_file_path if not set.
:Default: ``None``
:Type: str


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
``tus_upload_store_job_files``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:Description:
The upload store is a temporary directory in which files uploaded
by the tus middleware or server for remote job files (Pulsar) will
be placed. Defaults to tus_upload_store if not set.
:Default: ``None``
:Type: str

Expand Down Expand Up @@ -4030,6 +4042,23 @@
:Type: str


~~~~~~~~~~~~~~~~~~~~~
``oidc_scope_prefix``
~~~~~~~~~~~~~~~~~~~~~

:Description:
Sets the prefix for OIDC scopes specific to this Galaxy instance.
If an API call is made against this Galaxy instance using an OIDC
bearer token, any scopes must be prefixed with this value e.g.
https://galaxyproject.org/api. More concretely, to request all
permissions that the user has, the scope would have to be
specified as "<prefix>:*". e.g "https://galaxyproject.org/api:*".
Currently, only * is recognised as a valid scope, and future
iterations may provide more fine-grained scopes.
:Default: ``https://galaxyproject.org/api``
:Type: str


~~~~~~~~~~~~~~~~~~~~
``auth_config_file``
~~~~~~~~~~~~~~~~~~~~
Expand Down Expand Up @@ -5439,9 +5468,9 @@
:Type: str


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
``help_forum_tool_panel_integration_enabled``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
``enable_help_forum_tool_panel_integration``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:Description:
Enable the integration of the Galaxy Help Forum in the tool panel.
Expand Down
2 changes: 1 addition & 1 deletion doc/source/releases/24.0_announce.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Highlights

**image_diff.** For tool developers, image_diff, a new comparison method for test output verification using images has been added. Unlike previously used comparison methods, image_diff is specifically tailored for single-channel and multi-channel image data (e.g. RGB). The difference of a pair of images is quantified as the pixel-wise distance between the images, for which different metrics can be used. A pair of images is considered to be equal in terms of the specified metric, if the distance between the images computed with respect to the metric is not above a given threshold. For more details, see `the original pull request <https://github.com/galaxyproject/galaxy/pull/17556>`__).

Other notable improvements include consolidating resource grids for histories, visualizations and pages into tab views; the addition of a new UI feature for "relocating" a dataset to a new object store; and, for tool developers, a new comparison method for test output verification using images. Check out the `24.0 user release notes <24.0_announce_user.html>`__ for all the details.
Other notable improvements include consolidating resource grids for histories, visualizations and pages into tab views; the addition of a new UI feature for "relocating" a dataset to a different storage location; and, for tool developers, a new comparison method for test output verification using images. Check out the `24.0 user release notes <24.0_announce_user.html>`__ for all the details.

Are you an admin? See the Administration Notes below, and check out `some admin relevant PRs <https://github.com/galaxyproject/galaxy/pulls?q=label%3Ahighlight%2Fadmin+milestone%3A24.0+is%3Aclosed+is%3Apr>`__.

Expand Down
8 changes: 4 additions & 4 deletions doc/source/releases/24.0_announce_user.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ My workflows: list view
New select component for selecting a large amount of options
-----------------------------------------------------------

This new component addresses the need of selecting a very large number of options at once. The component features a list based layout which can be filtered using plain-text or a regular expression. Options can be added individually, in bulk via the filter value, or by first highlighting a range.
This new component addresses the need of selecting a very large number of options at once. The component features a list based layout which can be filtered using plain-text or a regular expression. Options can be added individually, in bulk via the filter value, or by first highlighting a range.

The component is fully keyboard accessible. All methods of selection and highlighting work via keyboard. The options are not selectable individually with tab, but can be scrolled through using the arrow-keys. The hover hint adapts when a keyboard is used.
The component is fully keyboard accessible. All methods of selection and highlighting work via keyboard. The options are not selectable individually with tab, but can be scrolled through using the arrow-keys. The hover hint adapts when a keyboard is used.

The size of the table can be increased to allow for seeing more options at once.The options in the list are limited to 1000 for performance reasons, but this can be temporarily increased in steps of 500, when reaching the end of a list.

Expand All @@ -47,7 +47,7 @@ The component can be chosen when multiple options are available; a local prefere
Multiple item drag and drop and keyboard navigation
-----------------------------------------------------------

This new feature allows users to select multiple history items and drag and drop them into other histories or even tool forms! Users can also navigate their history using the arrow keys; multiple history items can be selected with the <kbd>Shift + ArrowUp/ArrowDown</kbd> key combination.
This new feature allows users to select multiple history items and drag and drop them into other histories or even tool forms! Users can also navigate their history using the arrow keys; multiple history items can be selected with the <kbd>Shift + ArrowUp/ArrowDown</kbd> key combination.

Drag and drop:

Expand All @@ -73,7 +73,7 @@ Your histories, visualisations, and pages are now consolidated into an easier to
Move datasets between storage locations
-----------------------------------------------------------

Relocate a dataset to a new object store with ease using this new UI feature! The example below uses an instance with four object stores defined, but only three of them declaring the same "device" ID. Clicking on the dataset information and scrolling to storage details has a "Relocate" option if the dataset is "safe" to relocate and there are valid targets to relocate it to. The UI utilizes the same visual language used for describing attributes of the storage and exposing admin provided details. This example also shows what the buttons look like with quota enabled object stores and object stores without quota enabled.
Relocate a dataset to a different storage location with ease using this new UI feature! The example below uses an instance with four storage locations defined, but only three of them declaring the same "device" ID (set by the administrator). Clicking on the dataset information and scrolling to storage details has a "Relocate" option if the dataset is "safe" to relocate and there are valid targets to relocate it to. The UI utilizes the same visual language used for describing attributes of the storage and exposing admin provided details. This example also shows what the buttons look like for storage locations with and without quota enabled.

.. raw:: html

Expand Down
Loading

0 comments on commit 9ff846a

Please sign in to comment.