Loading client/src/components/ActivityBar/ActivityBar.vue +1 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 */ Loading client/src/components/Landing/WorkflowLanding.vue +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"; Loading @@ -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> client/src/entry/analysis/router.js +2 −0 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -523,6 +524,7 @@ export function getRouter(Galaxy) { public: route.query.public.toLowerCase() === "true", secret: route.query.client_secret, }), beforeEnter: requireAuth, }, { path: "user", Loading client/src/router/guards.ts 0 → 100644 +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(); } client/src/stores/activityStore.ts +8 −1 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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(); Loading Loading @@ -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]; Loading Loading @@ -196,6 +201,8 @@ export const useActivityStore = defineScopedStore("activityStore", (scope) => { return { toggledSideBar, toggleSideBar, closeSideBar, isSideBarOpen, activities, activityMeta, metaForId, Loading Loading
client/src/components/ActivityBar/ActivityBar.vue +1 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 */ Loading
client/src/components/Landing/WorkflowLanding.vue +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"; Loading @@ -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>
client/src/entry/analysis/router.js +2 −0 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -523,6 +524,7 @@ export function getRouter(Galaxy) { public: route.query.public.toLowerCase() === "true", secret: route.query.client_secret, }), beforeEnter: requireAuth, }, { path: "user", Loading
client/src/router/guards.ts 0 → 100644 +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(); }
client/src/stores/activityStore.ts +8 −1 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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(); Loading Loading @@ -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]; Loading Loading @@ -196,6 +201,8 @@ export const useActivityStore = defineScopedStore("activityStore", (scope) => { return { toggledSideBar, toggleSideBar, closeSideBar, isSideBarOpen, activities, activityMeta, metaForId, Loading