Unverified Commit 3586026f authored by Björn Grüning's avatar Björn Grüning Committed by GitHub
Browse files

Merge pull request #19698 from dannon/workflow-landing-tweaks

[24.2] Backport of workflow landing sidebar toggle fix.
parents 49c0dd08 de5e3568
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ const emit = defineEmits<{
}>();

// activities from store
const { activities } = storeToRefs(activityStore);
const { activities, isSideBarOpen } = storeToRefs(activityStore);

// drag references
const dragTarget: Ref<EventTarget | null> = ref(null);
@@ -112,8 +112,6 @@ function isActiveSideBar(menuKey: string) {
    return activityStore.toggledSideBar === menuKey;
}

const isSideBarOpen = computed(() => activityStore.toggledSideBar !== "");

/**
 * Checks if an activity that has a panel should have the `is-active` prop
 */
+16 −60
Original line number Diff line number Diff line
<script setup lang="ts">
import { BAlert } from "bootstrap-vue";
import { storeToRefs } from "pinia";
import { ref, watch } from "vue";
import { useRouter } from "vue-router/composables";

import { GalaxyApi } from "@/api";
import { useUserStore } from "@/stores/userStore";
import { errorMessageAsString } from "@/utils/simple-error";
import { useActivityStore } from "@/stores/activityStore";
import { useWorkflowLandingStore } from "@/stores/workflowLandingStore";

import LoadingSpan from "@/components/LoadingSpan.vue";
import WorkflowRun from "@/components/Workflow/Run/WorkflowRun.vue";
@@ -22,75 +19,34 @@ const props = withDefaults(defineProps<Props>(), {
    public: false,
});

const workflowId = ref<string | null>(null);
const errorMessage = ref<string | null>(null);
const requestState = ref<Record<string, never> | null>(null);
const instance = ref<boolean>(false);
const userStore = useUserStore();
const router = useRouter();
const store = useWorkflowLandingStore();
const { claimWorkflow } = store;
const { claimState } = storeToRefs(store);

userStore.loadUser(false);
const { isAnonymous, currentUser } = storeToRefs(userStore);
const activityStore = useActivityStore("default");

watch(
    currentUser,
    async () => {
        if (isAnonymous.value) {
            router.push(
                `/login/start?redirect=/workflow_landings/${props.uuid}?public=${props.public}&client_secret=${props.secret}`
            );
        } else if (currentUser.value) {
            let claim;
            let claimError;
            if (props.public) {
                const { data, error } = await GalaxyApi().GET("/api/workflow_landings/{uuid}", {
                    params: {
                        path: { uuid: props.uuid },
                    },
// Start claim immediately
claimWorkflow(props.uuid, props.public, props.secret).then(() => {
    activityStore.closeSideBar();
});
                claim = data;
                claimError = error;
            } else {
                const { data, error } = await GalaxyApi().POST("/api/workflow_landings/{uuid}/claim", {
                    params: {
                        path: { uuid: props.uuid },
                    },
                    body: {
                        client_secret: props.secret,
                    },
                });
                claim = data;
                claimError = error;
            }
            if (claim) {
                workflowId.value = claim.workflow_id;
                instance.value = claim.workflow_target_type === "workflow";
                requestState.value = claim.request_state;
            } else {
                errorMessage.value = errorMessageAsString(claimError);
            }
        }
    },
    { immediate: true }
);
</script>

<template>
    <div>
        <div v-if="errorMessage">
        <div v-if="claimState.errorMessage">
            <BAlert variant="danger" show>
                {{ errorMessage }}
                {{ claimState.errorMessage }}
            </BAlert>
        </div>
        <div v-else-if="!workflowId">
        <div v-else-if="!claimState.workflowId">
            <LoadingSpan message="Loading workflow parameters" />
        </div>
        <div v-else>
            <WorkflowRun
                :workflow-id="workflowId"
                :workflow-id="claimState.workflowId"
                :prefer-simple-form="true"
                :request-state="requestState"
                :instance="instance" />
                :request-state="claimState.requestState"
                :instance="claimState.instance" />
        </div>
    </div>
</template>
+2 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ import CreateFileSourceInstance from "@/components/FileSources/Instances/CreateI
import GridHistory from "@/components/Grid/GridHistory";
import GridPage from "@/components/Grid/GridPage";
import CreateObjectStoreInstance from "@/components/ObjectStore/Instances/CreateInstance";
import { requireAuth } from "@/router/guards";
import { parseBool } from "@/utils/utils";

import { patchRouterPush } from "./router-push";
@@ -523,6 +524,7 @@ export function getRouter(Galaxy) {
                            public: route.query.public.toLowerCase() === "true",
                            secret: route.query.client_secret,
                        }),
                        beforeEnter: requireAuth,
                    },
                    {
                        path: "user",
+19 −0
Original line number Diff line number Diff line
import type { NavigationGuardNext, Route } from "vue-router";

import { useUserStore } from "@/stores/userStore";

export async function requireAuth(to: Route, from: Route, next: NavigationGuardNext) {
    const userStore = useUserStore();
    await userStore.loadUser(false);

    if (userStore.isAnonymous) {
        next({
            path: "/login/start",
            query: {
                redirect: to.fullPath,
            },
        });
        return;
    }
    next();
}
+8 −1
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ export const useActivityStore = defineScopedStore("activityStore", (scope) => {

    const customDefaultActivities = ref<Activity[] | null>(null);
    const currentDefaultActivities = computed(() => customDefaultActivities.value ?? defaultActivities);
    const isSideBarOpen = computed(() => toggledSideBar.value !== "" && toggledSideBar.value !== "closed");

    const toggledSideBar = useUserLocalStorage(`activity-store-current-side-bar-${scope}`, "tools");

@@ -67,6 +68,10 @@ export const useActivityStore = defineScopedStore("activityStore", (scope) => {
        toggledSideBar.value = toggledSideBar.value === currentOpen ? "" : currentOpen;
    }

    function closeSideBar() {
        toggledSideBar.value = "closed";
    }

    function overrideDefaultActivities(activities: Activity[]) {
        customDefaultActivities.value = activities;
        sync();
@@ -130,7 +135,7 @@ export const useActivityStore = defineScopedStore("activityStore", (scope) => {
        activities.value = newActivities;

        // if toggled side-bar does not exist, choose the first option
        if (toggledSideBar.value !== "") {
        if (isSideBarOpen.value) {
            const allSideBars = activities.value.flatMap((activity) => {
                if (activity.panel) {
                    return [activity.id];
@@ -196,6 +201,8 @@ export const useActivityStore = defineScopedStore("activityStore", (scope) => {
    return {
        toggledSideBar,
        toggleSideBar,
        closeSideBar,
        isSideBarOpen,
        activities,
        activityMeta,
        metaForId,
Loading