Skip to content

Commit

Permalink
Merge branch 'refs/heads/dev' into interactivetoolssqlalchemy
Browse files Browse the repository at this point in the history
  • Loading branch information
kysrpex committed Jul 4, 2024
2 parents bf6b6ed + 723e796 commit 967b591
Show file tree
Hide file tree
Showing 183 changed files with 4,101 additions and 1,547 deletions.
5 changes: 5 additions & 0 deletions .github/workflows/lint_openapi_schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ jobs:
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- uses: actions/setup-node@v4
with:
node-version: '18.12.1'
cache: 'yarn'
cache-dependency-path: 'galaxy root/client/yarn.lock'
- name: Get full Python version
id: full-python-version
shell: bash
Expand Down
3 changes: 1 addition & 2 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ The following branches or releases receive security support:

- Development on the `dev` branch, hosted on GitHub, which will become the next release of Galaxy
- Releases within the past 12 months.
- E.g. 16.04 will receive support until 2017-04. As the month changes to 2017-05 it will become unsupported.
- There are currently no plans for Long Term Support (LTS) releases.
- E.g. 24.0 will receive support for a full year, at which point 25.0 will be available.

For unsupported branches:

Expand Down
1 change: 1 addition & 0 deletions client/src/api/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const REGISTERED_USER: User = {

const ANONYMOUS_USER: AnonymousUser = {
isAnonymous: true,
total_disk_usage: 0,
};

const SESSIONLESS_USER = null;
Expand Down
2 changes: 1 addition & 1 deletion client/src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ export interface User extends QuotaUsageResponse {
username?: string;
}

export interface AnonymousUser {
export interface AnonymousUser extends QuotaUsageResponse {
id?: string;
isAnonymous: true;
is_admin?: false;
Expand Down
2 changes: 2 additions & 0 deletions client/src/api/schema/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6155,6 +6155,8 @@ export interface components {
* @enum {string}
*/
model_class: "HistoryDatasetAssociation";
/** Purged */
purged: boolean;
/**
* State
* @description The current state of this dataset.
Expand Down
118 changes: 80 additions & 38 deletions client/src/components/AboutGalaxy.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
/* (injected by webpack) */
import { computed } from "vue";
import { RouterLink } from "vue-router";
import { useConfig } from "@/composables/config";
import { getAppRoot } from "@/onload/loadConfig";
Expand All @@ -28,47 +29,88 @@ const versionUserDocumentationUrl = computed(() => {

<template>
<div v-if="isConfigLoaded" class="about-galaxy">
<Heading h1 :icon="['gxd', 'galaxyLogo']" size="xl">About This Galaxy</Heading>
<div>
<!-- Galaxy version (detailed), with a link to the release notes -->
<Heading h2 separator size="md">Galaxy Version Information</Heading>
<p>
The Galaxy Server is running version
<Heading h1 :icon="['gxd', 'galaxyLogo']" size="lg">Help and Support</Heading>
<div class="p-2">
<Heading h2 separator size="md">Support</Heading>
<div v-if="config.wiki_url">
<ExternalLink :href="config.wiki_url">
<strong v-localize>Community Hub</strong>
</ExternalLink>
<p v-localize>Join our community and explore tutorials on using Galaxy and enhance your skills.</p>
</div>
<div v-if="config.helpsite_url">
<ExternalLink :href="config.helpsite_url">
<strong v-localize>Ask Questions & Find Answers</strong>
</ExternalLink>
<p v-localize>
Visit the Galaxy Q&A website to find answers to your questions and connect with other users.
</p>
</div>
<div v-if="config.support_url">
<ExternalLink :href="config.support_url">
<strong v-localize>Reach Out</strong>
</ExternalLink>
<p v-localize>Need help or want to teach and learn more about Galaxy? Feel free to reach out to us.</p>
</div>
<Heading v-localize h2 separator size="md">Help</Heading>
<div>
<RouterLink to="tours">
<strong v-localize>Interactive Tours</strong>
</RouterLink>
<p v-localize>Discover and learn about Galaxy with our interactive tours.</p>
</div>
<div v-if="config.screencasts_url">
<ExternalLink :href="config.screencasts_url">
<strong v-localize>Videos and Screencasts</strong>
</ExternalLink>
<p v-localize>Learn more about Galaxy by watching videos and screencasts.</p>
</div>
<div v-if="config.citation_url">
<ExternalLink :href="config.citation_url">
<strong v-localize>How to Cite Us</strong>
</ExternalLink>
<p v-localize>View details on how to properly cite Galaxy.</p>
</div>
<Heading h2 separator size="md">Technical Details</Heading>
<div>
<!-- Galaxy version (detailed), with a link to the release notes -->
<ExternalLink :href="versionUserDocumentationUrl">
<strong> {{ config.version_major }}.{{ config.version_minor }}</strong> </ExternalLink
>, and the web client was built on <UtcDate :date="clientBuildDate" mode="pretty" />.
</p>
<template v-if="config.version_extra">
<p>The server also provides the following extra version information</p>
<ul>
<li v-for="(value, name, index) in config.version_extra" :key="index">
<strong>{{ name }}</strong>
: {{ value }}
</li>
</ul>
</template>
</div>
<div>
<Heading h2 separator size="md">Galaxy API Documentation</Heading>
<!-- API documentation link -->
<p>
The Galaxy API is available, and explorable, at
<strong v-localize>Release Notes</strong>
</ExternalLink>
<p v-localize>
This Galaxy server version is <strong>{{ config.version_major }}.{{ config.version_minor }}</strong
>, and the web client was built on
<strong><UtcDate :date="clientBuildDate" mode="pretty" /></strong>.
</p>
<template v-if="config.version_extra">
<p v-localize>The server also provides the following extra version information</p>
<ul>
<li v-for="(value, name, index) in config.version_extra" :key="index">
<strong>{{ name }}</strong>
: {{ value }}
</li>
</ul>
</template>
</div>
<div>
<ExternalLink :href="apiDocsLink">
{{ apiDocsLink }}
<strong v-localize>API Documentation</strong>
</ExternalLink>
</p>
</div>
<div>
<Heading h2 separator size="md">License Information</Heading>
<p>The Galaxy Software is licensed under <License :license-id="galaxyLicense" /></p>
</div>
<div v-if="config.terms_url">
<!-- Terms, if available.-->
<Heading h2 separator size="md">Terms and Conditions</Heading>
<p>
This Galaxy Server has specified Terms and Conditions that apply to use of the service.
<ExternalLink :href="config.terms_url">Review them here.</ExternalLink>
</p>
<p v-localize>Explore the Galaxy API.</p>
</div>
<div>
<License class="font-weight-bold" :license-id="galaxyLicense" />
<p v-localize>The Galaxy Software is licensed under the MIT License.</p>
</div>
<div v-if="config.terms_url">
<!-- Terms, if available.-->
<ExternalLink :href="config.terms_url">
<strong v-localize>Terms and Conditions</strong>
</ExternalLink>
<p v-localize>
This Galaxy Server has specified Terms and Conditions that apply to use of the service.
</p>
</div>
</div>
</div>
</template>
Expand Down
12 changes: 4 additions & 8 deletions client/src/components/ActivityBar/ActivityBar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -179,11 +179,7 @@ watch(
:to="activity.to"
@click="onToggleSidebar()" />
<ActivityItem
v-else-if="
['admin', 'tools', 'visualizations', 'multiview', 'invocation'].includes(
activity.id
)
"
v-else-if="activity.id === 'admin' || activity.panel"
:id="`activity-${activity.id}`"
:key="activity.id"
:icon="activity.icon"
Expand Down Expand Up @@ -216,10 +212,10 @@ watch(
@click="onToggleSidebar('notifications')" />
<ActivityItem
id="activity-settings"
icon="cog"
icon="ellipsis-h"
:is-active="isActiveSideBar('settings')"
title="Settings"
tooltip="Edit preferences"
title="More"
tooltip="View additional activities"
@click="onToggleSidebar('settings')" />
<ActivityItem
v-if="isAdmin"
Expand Down
27 changes: 14 additions & 13 deletions client/src/components/ActivityBar/ActivitySettings.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ function testActivity(id, newOptions = {}) {
description: "activity-test-description",
icon: "activity-test-icon",
mutable: true,
optional: false,
optional: true,
title: "activity-test-title",
to: null,
tooltip: "activity-test-tooltip",
Expand Down Expand Up @@ -56,22 +56,23 @@ describe("ActivitySettings", () => {

it("availability of built-in activities", async () => {
const items = wrapper.findAll(activityItemSelector);
expect(items.length).toBe(Activities.length);
const nOptional = Activities.filter((x) => x.optional).length;
expect(items.length).toBe(nOptional);
});

it("visible but non-optional activity", async () => {
it("visible and optional activity", async () => {
activityStore.setAll([testActivity("1")]);
await wrapper.vm.$nextTick();
const items = wrapper.findAll(activityItemSelector);
expect(items.length).toBe(1);
const pinnedCheckbox = items.at(0).find("[data-icon='thumbtack']");
expect(pinnedCheckbox.exists()).toBeTruthy();
const pinnedIcon = wrapper.find("[icon='activity-test-icon'");
expect(pinnedIcon.exists()).toBeTruthy();
const checkbox = items.at(0).find("[title='Hide in Activity Bar']");
expect(checkbox.exists()).toBeTruthy();
const icon = wrapper.find("[icon='activity-test-icon'");
expect(icon.exists()).toBeTruthy();
expect(activityStore.getAll()[0].visible).toBeTruthy();
pinnedCheckbox.trigger("click");
checkbox.trigger("click");
await wrapper.vm.$nextTick();
expect(activityStore.getAll()[0].visible).toBeTruthy();
expect(activityStore.getAll()[0].visible).toBeFalsy();
});

it("non-visible but optional activity", async () => {
Expand All @@ -84,12 +85,12 @@ describe("ActivitySettings", () => {
await wrapper.vm.$nextTick();
const items = wrapper.findAll(activityItemSelector);
expect(items.length).toBe(1);
const hiddenCheckbox = items.at(0).find("[data-icon='square']");
expect(hiddenCheckbox.exists()).toBeTruthy();
const checkbox = items.at(0).find("[title='Show in Activity Bar']");
expect(checkbox.exists()).toBeTruthy();
expect(activityStore.getAll()[0].visible).toBeFalsy();
hiddenCheckbox.trigger("click");
checkbox.trigger("click");
await wrapper.vm.$nextTick();
const visibleCheckbox = items.at(0).find("[data-icon='check-square']");
const visibleCheckbox = items.at(0).find("[title='Hide in Activity Bar']");
expect(visibleCheckbox.exists()).toBeTruthy();
expect(activityStore.getAll()[0].visible).toBeTruthy();
});
Expand Down
74 changes: 42 additions & 32 deletions client/src/components/ActivityBar/ActivitySettings.vue
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
<script setup lang="ts">
import { library } from "@fortawesome/fontawesome-svg-core";
import { faSquare } from "@fortawesome/free-regular-svg-icons";
import { faCheckSquare, faThumbtack, faTrash } from "@fortawesome/free-solid-svg-icons";
import { faSquare, faStar as faStarRegular } from "@fortawesome/free-regular-svg-icons";
import { faCheckSquare, faStar, faThumbtack, faTrash } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
import { storeToRefs } from "pinia";
import { computed, type ComputedRef } from "vue";
import { useActivityAction } from "@/composables/useActivityAction";
import { type Activity, useActivityStore } from "@/stores/activityStore";
library.add({
faCheckSquare,
faSquare,
faStar,
faStarRegular,
faTrash,
faThumbtack,
});
Expand All @@ -21,6 +24,7 @@ const props = defineProps<{
const activityStore = useActivityStore();
const { activities } = storeToRefs(activityStore);
const activityAction = useActivityAction();
const filteredActivities = computed(() => {
if (props.query?.length > 0) {
Expand All @@ -44,7 +48,7 @@ const foundActivities: ComputedRef<boolean> = computed(() => {
return filteredActivities.value.length > 0;
});
function onClick(activity: Activity) {
function onFavorite(activity: Activity) {
if (activity.optional) {
activity.visible = !activity.visible;
}
Expand All @@ -59,36 +63,49 @@ function onRemove(activity: Activity) {
<div class="activity-settings rounded no-highlight">
<div v-if="foundActivities" class="activity-settings-content">
<div v-for="activity in filteredActivities" :key="activity.id">
<button class="activity-settings-item p-2 cursor-pointer" @click="onClick(activity)">
<button
v-if="activity.optional"
class="activity-settings-item p-2 cursor-pointer"
@click="activityAction.executeActivity(activity)">
<div class="d-flex justify-content-between align-items-start">
<span class="w-100">
<FontAwesomeIcon
v-if="!activity.optional"
class="icon-check mr-1"
icon="fas fa-thumbtack"
fa-fw />
<FontAwesomeIcon
v-else-if="activity.visible"
class="icon-check mr-1"
icon="fas fa-check-square"
fa-fw />
<FontAwesomeIcon v-else class="mr-1" icon="far fa-square" fa-fw />
<span class="d-flex justify-content-between w-100">
<span>
<icon class="mr-1" :icon="activity.icon" />
<span v-localize class="font-weight-bold">{{
activity.title || "No title available"
}}</span>
</span>
<div>
<BButton
v-if="activity.mutable"
v-b-tooltip.hover
data-description="delete activity"
size="sm"
title="Delete Activity"
variant="link"
@click.stop="onRemove(activity)">
<FontAwesomeIcon icon="fa-trash" fa-fw />
</BButton>
<BButton
v-if="activity.visible"
v-b-tooltip.hover
size="sm"
title="Hide in Activity Bar"
variant="link"
@click.stop="onFavorite(activity)">
<FontAwesomeIcon icon="fas fa-star" fa-fw />
</BButton>
<BButton
v-else
v-b-tooltip.hover
size="sm"
title="Show in Activity Bar"
variant="link"
@click.stop="onFavorite(activity)">
<FontAwesomeIcon icon="far fa-star" fa-fw />
</BButton>
</div>
</span>
<b-button
v-if="activity.mutable"
data-description="delete activity"
class="button-delete"
size="sm"
variant="link"
@click.stop="onRemove(activity)">
<FontAwesomeIcon icon="fa-trash" fa-fw />
</b-button>
</div>
<div v-localize class="text-muted">
{{ activity.description || "No description available" }}
Expand Down Expand Up @@ -121,13 +138,6 @@ function onRemove(activity: Activity) {
text-align: left;
transition: none;
width: 100%;
.icon-check {
color: darken($brand-success, 15%);
}
.button-delete {
background: transparent;
}
}
.activity-settings-item:hover {
background: $gray-200;
Expand Down
Loading

0 comments on commit 967b591

Please sign in to comment.