diff --git a/client/src/components/ActivityBar/ActivityBar.vue b/client/src/components/ActivityBar/ActivityBar.vue index 51fa15b085e9..a1d580142005 100644 --- a/client/src/components/ActivityBar/ActivityBar.vue +++ b/client/src/components/ActivityBar/ActivityBar.vue @@ -134,7 +134,7 @@ function onToggleSidebar(toggle: string = "", to: string | null = null) { const syncActivities = () => { activityStore.sync(); - if (config.value && config.value.client_mode == "minimal_workflow") { + if (config.value && ["workflow_centric", "workflow_runner"].indexOf(config.value.client_mode) >= 0) { userStore.untoggleToolbarIfNeeded(); } }; diff --git a/client/src/components/Workflow/WorkflowActions.vue b/client/src/components/Workflow/WorkflowActions.vue index c7422119e868..bb797e4a980a 100644 --- a/client/src/components/Workflow/WorkflowActions.vue +++ b/client/src/components/Workflow/WorkflowActions.vue @@ -31,6 +31,7 @@ interface Props { menu?: boolean; published?: boolean; buttonSize?: "sm" | "md" | "lg"; + allowWorkflowManagement?: boolean; } type BaseAction = { @@ -59,6 +60,7 @@ interface BAction extends BaseAction { const props = withDefaults(defineProps(), { buttonSize: "sm", + allowWorkflowManagement: true, }); const emit = defineEmits<{ @@ -126,7 +128,7 @@ async function onDelete() { const actions: ComputedRef<(AAction | BAction)[]> = computed(() => { return [ { - condition: !props.workflow.deleted && !props.workflow.show_in_tool_panel, + condition: !props.workflow.deleted && !props.workflow.show_in_tool_panel && props.allowWorkflowManagement, class: "workflow-bookmark-button-add", component: "async", title: "Add bookmarks", diff --git a/client/src/components/Workflow/WorkflowCard.vue b/client/src/components/Workflow/WorkflowCard.vue index f0df64bcebd8..8d65fa54d8e8 100644 --- a/client/src/components/Workflow/WorkflowCard.vue +++ b/client/src/components/Workflow/WorkflowCard.vue @@ -27,11 +27,13 @@ interface Props { workflow: any; gridView?: boolean; publishedView?: boolean; + allowWorkflowManagement?: boolean; } const props = withDefaults(defineProps(), { gridView: false, publishedView: false, + allowWorkflowManagement: true, }); const emit = defineEmits<{ @@ -136,6 +138,7 @@ async function onTagClick(tag: string) { @@ -181,7 +184,7 @@ async function onTagClick(tag: string) {
[]; interface Props { activeList?: "my" | "shared_with_me" | "published"; - advancedOptions?: boolean; + clientMode?: "full" | "workflow_centric" | "workflow_runner"; initialFilterText?: string; } const props = withDefaults(defineProps(), { activeList: "my", - advancedOptions: true, + clientMode: "full", initialFilterText: "", }); @@ -89,6 +89,8 @@ const validFilters = computed(() => workflowFilters.value.getValidFilters(rawFil const invalidFilters = computed(() => workflowFilters.value.getValidFilters(rawFilters.value, true).invalidFilters); const isSurroundedByQuotes = computed(() => /^["'].*["']$/.test(filterText.value)); const hasInvalidFilters = computed(() => !isSurroundedByQuotes.value && Object.keys(invalidFilters.value).length > 0); +const allowWorkflowManagement = computed(() => props.clientMode == "full"); +const advancedOptions = computed(() => props.clientMode == "full"); function updateFilterValue(filterKey: string, newValue: any) { const currentFilterText = filterText.value; @@ -214,10 +216,10 @@ onMounted(() => {
Workflows - +
- + My workflows @@ -225,7 +227,6 @@ onMounted(() => { @@ -338,6 +339,7 @@ onMounted(() => { :published-view="published" :grid-view="view === 'grid'" :class="view === 'grid' ? 'grid-view' : 'list-view'" + :allow-workflow-management="allowWorkflowManagement" @refreshList="load" @tagClick="(tag) => updateFilterValue('tag', `'${tag}'`)" @update-filter="updateFilterValue" /> diff --git a/client/src/entry/analysis/modules/Analysis.vue b/client/src/entry/analysis/modules/Analysis.vue index 92fd0bdef3bc..bedafa2b8094 100644 --- a/client/src/entry/analysis/modules/Analysis.vue +++ b/client/src/entry/analysis/modules/Analysis.vue @@ -21,11 +21,6 @@ const showHistoryPanel = computed(() => { return showPanels.value && config.value && config.value.client_mode == "full"; }); -const showWorkflowCenter = computed(() => { - console.log(config.value && config.value.client_mode); - return config.value && config.value.client_mode == "minimal_workflow"; -}); - // methods function hideCenter() { showCenter.value = false; diff --git a/client/src/entry/analysis/modules/Home.vue b/client/src/entry/analysis/modules/Home.vue index c15829ac831a..9e5792e52f42 100644 --- a/client/src/entry/analysis/modules/Home.vue +++ b/client/src/entry/analysis/modules/Home.vue @@ -3,8 +3,8 @@
-
- +
+
@@ -35,8 +35,8 @@ export default { }, }, computed: { - isWorkflowLanding() { - return this.config.client_mode == "minimal_workflow"; + isWorkflowCentric() { + return ["workflow_centric", "workflow_runner"].indexOf(this.config.client_mode) >= 0; }, isController() { return this.query.m_c && this.query.m_a; diff --git a/client/src/entry/analysis/modules/WorkflowLanding.vue b/client/src/entry/analysis/modules/WorkflowLanding.vue index ce28f76d7a4a..9f35c669904b 100644 --- a/client/src/entry/analysis/modules/WorkflowLanding.vue +++ b/client/src/entry/analysis/modules/WorkflowLanding.vue @@ -1,13 +1,16 @@ diff --git a/client/src/stores/activitySetup.ts b/client/src/stores/activitySetup.ts index d5303fe8af18..3a2ea6a97a74 100644 --- a/client/src/stores/activitySetup.ts +++ b/client/src/stores/activitySetup.ts @@ -4,12 +4,24 @@ import { type ClientMode, type Activity, type RawActivity } from "@/stores/activityStore"; import { type EventData } from "@/stores/eventStore"; -function unlessMinimalWorkflow(clientMode: ClientMode): boolean { - return !(clientMode == "minimal_workflow"); +function isWorkflowCentric(clientMode: ClientMode) : boolean { + return ["workflow_centric", "workflow_runner"].indexOf(clientMode) >= 0; } -function ifMinimalWorkflow(clientMode: ClientMode): boolean { - return !(clientMode == "minimal_workflow"); +function unlessWorkflowCentric(clientMode: ClientMode): boolean { + if (isWorkflowCentric(clientMode)) { + return false; + } else { + return true; + } +} + +function ifWorkflowCentric(clientMode: ClientMode): boolean { + if (isWorkflowCentric(clientMode)) { + return true; + } else { + return false; + } } export const ActivitiesRaw: RawActivity[] = [ @@ -19,12 +31,12 @@ export const ActivitiesRaw: RawActivity[] = [ icon: "fa-laptop", id: "interactivetools", mutable: false, - optional: ifMinimalWorkflow, + optional: ifWorkflowCentric, panel: false, title: "Interactive Tools", tooltip: "Show active interactive tools", to: "/interactivetool_entry_points/list", - visible: unlessMinimalWorkflow, + visible: unlessWorkflowCentric, }, { anonymous: true, @@ -32,12 +44,12 @@ export const ActivitiesRaw: RawActivity[] = [ icon: "upload", id: "upload", mutable: false, - optional: ifMinimalWorkflow, + optional: ifWorkflowCentric, panel: false, title: "Upload", to: null, tooltip: "Download from URL or upload files from disk", - visible: unlessMinimalWorkflow, + visible: unlessWorkflowCentric, }, { anonymous: true, @@ -45,12 +57,12 @@ export const ActivitiesRaw: RawActivity[] = [ icon: "wrench", id: "tools", mutable: false, - optional: ifMinimalWorkflow, + optional: ifWorkflowCentric, panel: true, title: "Tools", to: "/tools", tooltip: "Search and run tools", - visible: unlessMinimalWorkflow, + visible: unlessWorkflowCentric, }, { anonymous: true, @@ -89,7 +101,7 @@ export const ActivitiesRaw: RawActivity[] = [ title: "Visualization", to: null, tooltip: "Visualize datasets", - visible: unlessMinimalWorkflow, + visible: unlessWorkflowCentric, }, { anonymous: true, @@ -102,7 +114,7 @@ export const ActivitiesRaw: RawActivity[] = [ title: "Histories", tooltip: "Show all histories", to: "/histories/list", - visible: unlessMinimalWorkflow, + visible: unlessWorkflowCentric, }, { anonymous: false, @@ -115,7 +127,7 @@ export const ActivitiesRaw: RawActivity[] = [ title: "History Multiview", tooltip: "Select histories to show in History Multiview", to: "/histories/view_multiple", - visible: unlessMinimalWorkflow, + visible: unlessWorkflowCentric, }, { anonymous: false, @@ -128,7 +140,7 @@ export const ActivitiesRaw: RawActivity[] = [ title: "Datasets", tooltip: "Show all datasets", to: "/datasets/list", - visible: unlessMinimalWorkflow, + visible: unlessWorkflowCentric, }, { anonymous: true, @@ -141,7 +153,7 @@ export const ActivitiesRaw: RawActivity[] = [ title: "Pages", tooltip: "Show all pages", to: "/pages/list", - visible: unlessMinimalWorkflow, + visible: unlessWorkflowCentric, }, ]; diff --git a/client/src/stores/activityStore.ts b/client/src/stores/activityStore.ts index 43f039aa2a7a..dbc7311c8fec 100644 --- a/client/src/stores/activityStore.ts +++ b/client/src/stores/activityStore.ts @@ -35,7 +35,7 @@ export interface Activity { visible: boolean; } -export type ClientMode = "full" | "minimal_workflow"; +export type ClientMode = "full" | "workflow_centric" | "workflow_runner"; // config materializes a RawActivity into an Activity export interface RawActivity { diff --git a/lib/galaxy/config/schemas/config_schema.yml b/lib/galaxy/config/schemas/config_schema.yml index 2251b1cdd126..38a814b1d6d3 100644 --- a/lib/galaxy/config/schemas/config_schema.yml +++ b/lib/galaxy/config/schemas/config_schema.yml @@ -3122,20 +3122,30 @@ mapping: client_mode: type: str default: 'full' - enum: ['full', 'minimal_workflow'] + enum: ['full', 'workflow_centric', 'workflow_runner'] required: false per_host: true desc: | - Set this to 'minimal_workflow' to turn on the simplified Galaxy workflow - UI. + This will change the modality and focus on the client UI. The traditional + full Galaxy with default activity bar is the default of 'full'. + 'workflow_centric' & 'workflow_runner' yield client applications + that are geared to center a collection of workflows in Galaxy and attempts + to hide the concept of histories from users. The 'workflow_centric' view + still allows the user to manage & edit a collection of their own workflows. + 'workflow_runner' is a mode that disables workflow management to even further + simplify the UI - this may be appropriate for instances that really just want + enable particular workflows as-is. - simplified_workflow_landing_initial_tags: + simplified_workflow_landing_initial_filter_text: type: str default: null required: false per_host: true desc: | - I will write this in later. + If the Galaxy client is in 'workflow_centric' or 'workflow_runner' "client mode", + this controls the initial filtering of the workflow search textbox. This can + be used to foreground workflows in the published workflow list by tar (e.g. 'tag:XXX') + or username (e.g. 'username:XXXX'). simplified_workflow_run_ui: type: str diff --git a/lib/galaxy/managers/configuration.py b/lib/galaxy/managers/configuration.py index 9def986912d7..2809994f5c62 100644 --- a/lib/galaxy/managers/configuration.py +++ b/lib/galaxy/managers/configuration.py @@ -165,7 +165,7 @@ def _config_is_truthy(item, key, **context): "enable_beta_markdown_export": _use_config, "enable_beacon_integration": _use_config, "client_mode": _use_config, - "simplified_workflow_landing_initial_tags": _use_config, + "simplified_workflow_landing_initial_filter_text": _use_config, "simplified_workflow_run_ui": _use_config, "simplified_workflow_run_ui_target_history": _use_config, "simplified_workflow_run_ui_job_cache": _use_config,