Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate configuration store to Pinia #16514

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
e3c2edb
Migrate Config Vuex store to Pinia
davelopez Aug 3, 2023
0864d65
Adapt config composable and migrate to TS
davelopez Aug 3, 2023
9b885a0
Adapt ConfigProvider (temporarily)
davelopez Aug 3, 2023
b7efd52
Adapt FormTool unit test
davelopez Aug 3, 2023
c5ac5e6
Adapt UploadModal unit test
davelopez Aug 3, 2023
3ad485d
Adapt ToolForm unit test
davelopez Aug 3, 2023
f5bb8aa
Adapt ToolCard unit test
davelopez Aug 3, 2023
399fbea
Adapt JobParameters unit test + TS
davelopez Aug 3, 2023
6ff8869
Adapt Masthead unit test
davelopez Aug 3, 2023
9423a8c
Adapt QuotaMeter component + adapt unit test
davelopez Aug 3, 2023
eb0c268
Replace ConfigProvider in ProviderAwareToolBox
davelopez Aug 3, 2023
f71e92f
Replace ConfigProvider in StsDownloadButton
davelopez Aug 3, 2023
4688cc0
Fix eslintvue/prop-name-casing
davelopez Aug 4, 2023
b27dfb0
Replace ConfigProvider in CollectionEditView
davelopez Aug 4, 2023
d3a041a
Replace ConfigProvider in DatasetDetails
davelopez Aug 4, 2023
e15990b
Replace ConfigProvider in SelectionOperations + adapt test
davelopez Aug 4, 2023
9b709a8
Replace ConfigProvider in NewUserWelcome + adapt test
davelopez Aug 4, 2023
f414e18
Replace ConfigProvider in PageDisplay
davelopez Aug 4, 2023
16ea6e7
Replace ConfigProvider in ProviderAwareToolBoxWorkflow
davelopez Aug 4, 2023
2967462
Replace ConfigProvider in Sharing component
davelopez Aug 4, 2023
a75a282
Replace ConfigProvider in ToolForm
davelopez Aug 4, 2023
75118ba
Replace ConfigProvider in RepositoryDetails + adapt test
davelopez Aug 4, 2023
0b95931
Replace ConfigProvider in UserPreferences
davelopez Aug 4, 2023
a4d24b6
Replace ConfigProvider in DiskUsageSummary + adapt test
davelopez Aug 4, 2023
0b24167
Replace ConfigProvider in InvocationReport
davelopez Aug 4, 2023
27acbf8
Replace ConfigProvider in WorkflowRunFormSimple
davelopez Aug 4, 2023
7021d1c
Drop unused MockConfigProvider
davelopez Aug 4, 2023
851cf82
Drop unused ConfigProvider
davelopez Aug 4, 2023
6405206
Avoid overlapping requests
davelopez Aug 5, 2023
6c19854
Rename composable isLoaded to isConfigLoaded
davelopez Aug 5, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions client/src/components/AboutGalaxy.vue
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import ExternalLink from "@/components/ExternalLink.vue";
import License from "@/components/License/License.vue";
import UtcDate from "@/components/UtcDate.vue";

const { config, isLoaded } = useConfig();
const { config, isConfigLoaded } = useConfig();

const clientBuildDate = __buildTimestamp__ || new Date().toISOString();
const apiDocsLink = `${getAppRoot()}api/docs`;
Expand All @@ -27,7 +27,7 @@ const versionUserDocumentationUrl = computed(() => {
</script>

<template>
<div v-if="isLoaded" class="about-galaxy">
<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 -->
Expand Down
2 changes: 1 addition & 1 deletion client/src/components/ActivityBar/ActivityBar.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import mountTarget from "./ActivityBar.vue";
jest.mock("composables/config");
useConfig.mockReturnValue({
config: {},
isLoaded: true,
isConfigLoaded: true,
});

jest.mock("vue-router/composables", () => ({
Expand Down
57 changes: 29 additions & 28 deletions client/src/components/Collections/common/CollectionEditView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
</div>
</DbKeyProvider>
</b-tab>
<SuitableConvertersProvider :id="collection_id" v-slot="{ item }">
<SuitableConvertersProvider :id="collectionId" v-slot="{ item }">
<b-tab
v-if="item && item.length"
title-link-class="collection-edit-convert-datatype-nav"
Expand All @@ -34,24 +34,22 @@
<SuitableConvertersTab :suitable-converters="item" @clicked-convert="clickedConvert" />
</b-tab>
</SuitableConvertersProvider>
<ConfigProvider v-slot="{ config }">
<b-tab
v-if="config.enable_celery_tasks"
title-link-class="collection-edit-change-datatype-nav"
@click="updateInfoMessage(expectWaitTimeMessage)">
<template v-slot:title> <FontAwesomeIcon icon="database" /> &nbsp; {{ l("Datatypes") }} </template>
<DatatypesProvider v-slot="{ item, loading }">
<div v-if="loading"><LoadingSpan :message="loadingString" /></div>
<div v-else>
<ChangeDatatypeTab
v-if="item && datatypeFromElements"
:datatype-from-elements="datatypeFromElements"
:datatypes="item"
@clicked-save="clickedDatatypeChange" />
</div>
</DatatypesProvider>
</b-tab>
</ConfigProvider>
<b-tab
v-if="isConfigLoaded && config.enable_celery_tasks"
title-link-class="collection-edit-change-datatype-nav"
@click="updateInfoMessage(expectWaitTimeMessage)">
<template v-slot:title> <FontAwesomeIcon icon="database" /> &nbsp; {{ l("Datatypes") }} </template>
<DatatypesProvider v-slot="{ item, loading }">
<div v-if="loading"><LoadingSpan :message="loadingString" /></div>
<div v-else>
<ChangeDatatypeTab
v-if="item && datatypeFromElements"
:datatype-from-elements="datatypeFromElements"
:datatypes="item"
@clicked-save="clickedDatatypeChange" />
</div>
</DatatypesProvider>
</b-tab>
</b-tabs>
</div>
</template>
Expand All @@ -62,12 +60,12 @@ import { faBars, faCog, faDatabase, faTable, faUser } from "@fortawesome/free-so
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
import axios from "axios";
import BootstrapVue from "bootstrap-vue";
import ConfigProvider from "components/providers/ConfigProvider";
import { mapState } from "pinia";
import { prependPath } from "utils/redirect";
import { errorMessageAsString } from "utils/simple-error";
import Vue from "vue";

import { useConfig } from "@/composables/config";
import { useHistoryStore } from "@/stores/historyStore";

import { DatatypesProvider, DbKeyProvider, SuitableConvertersProvider } from "../../providers";
Expand All @@ -87,17 +85,20 @@ export default {
FontAwesomeIcon,
DbKeyProvider,
SuitableConvertersProvider,
ConfigProvider,
ChangeDatatypeTab,
DatatypesProvider,
LoadingSpan,
},
props: {
collection_id: {
collectionId: {
type: String,
required: true,
},
},
setup() {
const { config, isConfigLoaded } = useConfig(true);
return { config, isConfigLoaded };
},
data: function () {
return {
attributesData: {},
Expand Down Expand Up @@ -128,15 +129,15 @@ export default {
this.infoMessage = strMessage;
},
getCollectionDataAndAttributes: async function () {
let attributesGet = this.$store.getters.getCollectionAttributes(this.collection_id);
let attributesGet = this.$store.getters.getCollectionAttributes(this.collectionId);
if (attributesGet == null) {
await this.$store.dispatch("fetchCollectionAttributes", this.collection_id);
attributesGet = this.$store.getters.getCollectionAttributes(this.collection_id);
await this.$store.dispatch("fetchCollectionAttributes", this.collectionId);
attributesGet = this.$store.getters.getCollectionAttributes(this.collectionId);
}
this.attributesData = attributesGet;
},
clickedSave: function (attribute, newValue) {
const url = prependPath(`/api/dataset_collections/${this.collection_id}/copy`);
const url = prependPath(`/api/dataset_collections/${this.collectionId}/copy`);
const data = {};
if (attribute == "dbkey") {
data["dbkey"] = newValue.id;
Expand All @@ -151,7 +152,7 @@ export default {
const url = prependPath(`/api/tools/${selectedConverter.tool_id}/convert`);
const data = {
src: "hdca",
id: this.collection_id,
id: this.collectionId,
source_type: selectedConverter.original_type,
target_type: selectedConverter.target_type,
};
Expand All @@ -164,7 +165,7 @@ export default {
items: [
{
history_content_type: "dataset_collection",
id: this.collection_id,
id: this.collectionId,
},
],
params: {
Expand Down
95 changes: 48 additions & 47 deletions client/src/components/DatasetInformation/DatasetDetails.vue
Original file line number Diff line number Diff line change
@@ -1,55 +1,53 @@
<template>
<ConfigProvider v-slot="{ config }">
<DatasetProvider
:id="datasetId"
v-slot="{ result: dataset, loading: isDatasetLoading, error: datasetLoadingError }">
<div aria-labelledby="dataset-details-heading">
<h1 id="dataset-details-heading" class="sr-only">Dataset Details</h1>
<LoadingSpan v-if="isDatasetLoading" />
<Alert v-else-if="datasetLoadingError" :message="datasetLoadingError" variant="error" />
<div v-else>
<JobDetailsProvider
v-if="!isDatasetLoading && dataset.creating_job !== null"
v-slot="{ result: job, loading: isJobLoading }"
:job-id="dataset.creating_job"
auto-refresh>
<div v-if="!isJobLoading" class="details">
<DatasetInformation :hda_id="datasetId" />
<JobParameters dataset_type="hda" :dataset-id="datasetId" />
<JobInformation :job_id="dataset.creating_job" />
<DatasetStorage :dataset-id="datasetId" />
<InheritanceChain :dataset-id="datasetId" :dataset-name="dataset.name" />
<JobMetrics
v-if="config"
:dataset-id="datasetId"
:carbon-intensity="config.carbon_intensity"
:geographical-server-location-name="config.geographical_server_location_name"
:power-usage-effectiveness="config.power_usage_effectiveness"
:should-show-aws-estimate="config.aws_estimate"
:should-show-carbon-emissions-estimates="config.carbon_emissions_estimates" />
<JobDestinationParams v-if="currentUser.is_admin" :job-id="dataset.creating_job" />
<JobDependencies :dependencies="job.dependencies"></JobDependencies>
<div v-if="dataset.peek">
<h2 class="h-md">Dataset Peek</h2>
<div v-html="dataset.peek" />
</div>
</div>
</JobDetailsProvider>
<div v-else-if="!isDatasetLoading" class="details">
<DatasetProvider
:id="datasetId"
v-slot="{ result: dataset, loading: isDatasetLoading, error: datasetLoadingError }">
<div aria-labelledby="dataset-details-heading">
<h1 id="dataset-details-heading" class="sr-only">Dataset Details</h1>
<LoadingSpan v-if="isDatasetLoading" />
<Alert v-else-if="datasetLoadingError" :message="datasetLoadingError" variant="error" />
<div v-else>
<JobDetailsProvider
v-if="!isDatasetLoading && dataset.creating_job !== null"
v-slot="{ result: job, loading: isJobLoading }"
:job-id="dataset.creating_job"
auto-refresh>
<div v-if="!isJobLoading" class="details">
<DatasetInformation :hda_id="datasetId" />
<JobParameters dataset_type="hda" :dataset-id="datasetId" />
<JobInformation :job_id="dataset.creating_job" />
<DatasetStorage :dataset-id="datasetId" />
<div>
<h2 class="h-md">Job Not Found</h2>
<p>
No job associated with this dataset is recorded in Galaxy. Galaxy cannot determine full
dataset provenance and history for this dataset.
</p>
<InheritanceChain :dataset-id="datasetId" :dataset-name="dataset.name" />
<JobMetrics
v-if="isConfigLoaded"
:dataset-id="datasetId"
:carbon-intensity="config.carbon_intensity"
:geographical-server-location-name="config.geographical_server_location_name"
:power-usage-effectiveness="config.power_usage_effectiveness"
:should-show-aws-estimate="config.aws_estimate"
:should-show-carbon-emissions-estimates="config.carbon_emissions_estimates" />
<JobDestinationParams v-if="currentUser.is_admin" :job-id="dataset.creating_job" />
<JobDependencies :dependencies="job.dependencies"></JobDependencies>
<div v-if="dataset.peek">
<h2 class="h-md">Dataset Peek</h2>
<div v-html="dataset.peek" />
</div>
</div>
</JobDetailsProvider>
<div v-else-if="!isDatasetLoading" class="details">
<DatasetInformation :hda_id="datasetId" />
<DatasetStorage :dataset-id="datasetId" />
<div>
<h2 class="h-md">Job Not Found</h2>
<p>
No job associated with this dataset is recorded in Galaxy. Galaxy cannot determine full
dataset provenance and history for this dataset.
</p>
</div>
</div>
</div>
</DatasetProvider>
</ConfigProvider>
</div>
</DatasetProvider>
</template>

<script>
Expand All @@ -65,8 +63,8 @@ import JobMetrics from "@/components/JobMetrics/JobMetrics";
import JobParameters from "@/components/JobParameters/JobParameters";
import LoadingSpan from "@/components/LoadingSpan";
import { DatasetProvider } from "@/components/providers";
import ConfigProvider from "@/components/providers/ConfigProvider";
import { JobDetailsProvider } from "@/components/providers/JobProvider";
import { useConfig } from "@/composables/config";
import { useUserStore } from "@/stores/userStore";

import InheritanceChain from "../InheritanceChain/InheritanceChain";
Expand All @@ -85,14 +83,17 @@ export default {
JobDestinationParams,
DatasetProvider,
JobDetailsProvider,
ConfigProvider,
},
props: {
datasetId: {
type: String,
required: true,
},
},
setup() {
const { config, isConfigLoaded } = useConfig(true);
return { config, isConfigLoaded };
},
computed: {
...mapState(useUserStore, ["currentUser"]),
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import { shallowMount } from "@vue/test-utils";
import axios from "axios";
import MockAdapter from "axios-mock-adapter";
import MockConfigProvider from "components/providers/MockConfigProvider";
import flushPromises from "flush-promises";
import { createPinia } from "pinia";
import { getLocalVue } from "tests/jest/helpers";

import { mockFetcher } from "@/schema/__mocks__";

import SelectionOperations from "./SelectionOperations.vue";

jest.mock("@/schema");

const localVue = getLocalVue();

const FAKE_HISTORY_ID = "fake_history_id";
Expand All @@ -29,23 +33,20 @@ const getPurgedContentSelection = () => new Map([["FAKE_ID", { purged: true }]])
const getNonPurgedContentSelection = () => new Map([["FAKE_ID", { purged: false }]]);

async function mountSelectionOperationsWrapper(config) {
const wrapper = shallowMount(
SelectionOperations,
{
propsData: {
history: FAKE_HISTORY,
filterText: "",
contentSelection: new Map(),
selectionSize: 1,
isQuerySelection: false,
totalItemsInQuery: 5,
},
stubs: {
ConfigProvider: MockConfigProvider(config),
},
mockFetcher.path("/api/configuration").method("get").mock({ data: config });
const pinia = createPinia();
const wrapper = shallowMount(SelectionOperations, {
propsData: {
history: FAKE_HISTORY,
filterText: "",
contentSelection: new Map(),
selectionSize: 1,
isQuerySelection: false,
totalItemsInQuery: 5,
},
localVue
);
localVue,
pinia,
});
await flushPromises();
return wrapper;
}
Expand Down