From eb7700097fe1dfddc3100bdde1b098d6efeb96a3 Mon Sep 17 00:00:00 2001
From: davelopez <46503462+davelopez@users.noreply.github.com>
Date: Wed, 10 Jul 2024 14:20:29 +0200
Subject: [PATCH 1/5] Add getObjectStoreNameById to objectStoreStore

---
 client/src/stores/objectStoreStore.ts | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/client/src/stores/objectStoreStore.ts b/client/src/stores/objectStoreStore.ts
index 8b0723edd8f0..09f9657667c9 100644
--- a/client/src/stores/objectStoreStore.ts
+++ b/client/src/stores/objectStoreStore.ts
@@ -27,6 +27,11 @@ export const useObjectStoreStore = defineStore("objectStoreStore", () => {
         }
     }
 
+    function getObjectStoreNameById(objectStoreId: string): string | null {
+        const objectStore = selectableObjectStores.value?.find((store) => store.object_store_id === objectStoreId);
+        return objectStore?.name ?? null;
+    }
+
     loadObjectStores();
 
     return {
@@ -34,5 +39,6 @@ export const useObjectStoreStore = defineStore("objectStoreStore", () => {
         isLoading,
         loadErrorMessage,
         selectableObjectStores,
+        getObjectStoreNameById,
     };
 });

From 3c88ec955aa7370033c9c891d4fa17128a2cbe40 Mon Sep 17 00:00:00 2001
From: davelopez <46503462+davelopez@users.noreply.github.com>
Date: Wed, 10 Jul 2024 14:21:16 +0200
Subject: [PATCH 2/5] Fix object store name in overview chart

---
 .../DiskUsage/Visualizations/ObjectStoresStorageOverview.vue | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue b/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue
index 03401c48b6ee..0bd23cae19b5 100644
--- a/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue
+++ b/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue
@@ -3,6 +3,7 @@ import { ref } from "vue";
 import { useRouter } from "vue-router/composables";
 
 import { fetchObjectStoreUsages } from "@/api/users";
+import { useObjectStoreStore } from "@/stores/objectStoreStore";
 import localize from "@/utils/localization";
 
 import type { DataValuePoint } from "./Charts";
@@ -21,12 +22,14 @@ const objectStoresBySizeData = ref<DataValuePoint[] | null>(null);
 
 const { isLoading, loadDataOnMount } = useDataLoading();
 
+const { getObjectStoreNameById } = useObjectStoreStore();
+
 loadDataOnMount(async () => {
     const { data } = await fetchObjectStoreUsages({ user_id: "current" });
     const objectStoresBySize = data.sort((a, b) => b.total_disk_usage - a.total_disk_usage);
     objectStoresBySizeData.value = objectStoresBySize.map((objectStore) => ({
         id: objectStore.object_store_id,
-        label: objectStore.object_store_id,
+        label: getObjectStoreNameById(objectStore.object_store_id) ?? objectStore.object_store_id,
         value: objectStore.total_disk_usage,
     }));
 });

From 8572bec2b94aa0ac6dbd467d45a90cad1a2131b1 Mon Sep 17 00:00:00 2001
From: davelopez <46503462+davelopez@users.noreply.github.com>
Date: Wed, 10 Jul 2024 15:24:49 +0200
Subject: [PATCH 3/5] Fix use object store name instead of id in selector

---
 .../src/components/Common/FilterObjectStoreLink.vue | 13 ++++++++-----
 .../Visualizations/HistoryStorageOverview.vue       |  6 +++---
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/client/src/components/Common/FilterObjectStoreLink.vue b/client/src/components/Common/FilterObjectStoreLink.vue
index 65860cd057cc..c68aeb6a8011 100644
--- a/client/src/components/Common/FilterObjectStoreLink.vue
+++ b/client/src/components/Common/FilterObjectStoreLink.vue
@@ -5,6 +5,7 @@ import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
 import { computed, ref } from "vue";
 
 import { ConcreteObjectStoreModel } from "@/api";
+import { useObjectStoreStore } from "@/stores/objectStoreStore";
 
 import ObjectStoreSelect from "./ObjectStoreSelect.vue";
 import SelectModal from "@/components/Dataset/DatasetStorage/SelectModal.vue";
@@ -12,26 +13,28 @@ import SelectModal from "@/components/Dataset/DatasetStorage/SelectModal.vue";
 library.add(faTimes);
 
 interface FilterObjectStoreLinkProps {
-    value: String | null;
+    value?: string;
     objectStores: ConcreteObjectStoreModel[];
 }
 
 const props = defineProps<FilterObjectStoreLinkProps>();
 
+const { getObjectStoreNameById } = useObjectStoreStore();
+
 const showModal = ref(false);
 
 const emit = defineEmits<{
-    (e: "change", objectStoreId: string | null): void;
+    (e: "change", objectStoreId?: string): void;
 }>();
 
-function onSelect(objectStoreId: string | null) {
+function onSelect(objectStoreId?: string) {
     emit("change", objectStoreId);
     showModal.value = false;
 }
 
 const selectionText = computed(() => {
     if (props.value) {
-        return props.value;
+        return getObjectStoreNameById(props.value);
     } else {
         return "(any)";
     }
@@ -45,7 +48,7 @@ const selectionText = computed(() => {
         </SelectModal>
         <b-link href="#" @click="showModal = true">{{ selectionText }}</b-link>
         <span v-if="value" v-b-tooltip.hover title="Remove Filter">
-            <FontAwesomeIcon icon="times" @click="onSelect(null)" />
+            <FontAwesomeIcon icon="times" @click="onSelect(undefined)" />
         </span>
     </span>
 </template>
diff --git a/client/src/components/User/DiskUsage/Visualizations/HistoryStorageOverview.vue b/client/src/components/User/DiskUsage/Visualizations/HistoryStorageOverview.vue
index d3ca05932077..ca8b718f4560 100644
--- a/client/src/components/User/DiskUsage/Visualizations/HistoryStorageOverview.vue
+++ b/client/src/components/User/DiskUsage/Visualizations/HistoryStorageOverview.vue
@@ -51,14 +51,14 @@ const { isLoading, loadDataOnMount } = useDataLoading();
 const { isAdvanced, toggleAdvanced, inputGroupClasses, faAngleDoubleDown, faAngleDoubleUp } = useAdvancedFiltering();
 const { selectableObjectStores, hasSelectableObjectStores } = useSelectableObjectStores();
 
-const objectStore = ref<string | null>(null);
+const objectStore = ref<string>();
 
 const canEditHistory = computed(() => {
     const history = getHistoryById(props.historyId);
     return (history && !history.purged && !history.archived) ?? false;
 });
 
-function onChangeObjectStore(value: string | null) {
+function onChangeObjectStore(value?: string) {
     objectStore.value = value;
     reloadDataFromServer();
 }
@@ -190,7 +190,7 @@ function onUndelete(datasetId: string) {
                                 </BFormSelect>
                             </BFormGroup>
                             <BFormGroup
-                                v-if="hasSelectableObjectStores"
+                                v-if="selectableObjectStores && hasSelectableObjectStores"
                                 id="input-group-object-store"
                                 label="Storage location:"
                                 label-for="input-object-store"

From 435762ff22ea109f6f5cf64d2b3badf6f554b6bd Mon Sep 17 00:00:00 2001
From: davelopez <46503462+davelopez@users.noreply.github.com>
Date: Wed, 10 Jul 2024 15:25:56 +0200
Subject: [PATCH 4/5] Revise user-facing language for object stores

Similar to #17763
---
 .../components/FileSources/FileSourceTypeSpan.vue   |  2 +-
 .../ObjectStore/Instances/ManageIndex.vue           |  4 ++--
 .../components/ObjectStore/ObjectStoreTypeSpan.vue  | 10 +++++-----
 .../components/User/DiskUsage/StorageDashboard.vue  |  4 ++--
 .../Visualizations/HistoryStorageOverview.vue       |  2 +-
 .../DiskUsage/Visualizations/ObjectStoreActions.vue |  2 +-
 .../Visualizations/ObjectStoreStorageOverview.vue   | 13 +++++++++----
 .../Visualizations/ObjectStoresStorageOverview.vue  | 10 +++++-----
 .../DiskUsage/Visualizations/ShowObjectStore.vue    |  6 +++---
 9 files changed, 29 insertions(+), 24 deletions(-)

diff --git a/client/src/components/FileSources/FileSourceTypeSpan.vue b/client/src/components/FileSources/FileSourceTypeSpan.vue
index 538b635c4a42..95129c85a085 100644
--- a/client/src/components/FileSources/FileSourceTypeSpan.vue
+++ b/client/src/components/FileSources/FileSourceTypeSpan.vue
@@ -2,7 +2,7 @@
 import { computed } from "vue";
 
 const MESSAGES = {
-    posix: "This is a simple path based object store that assumes the all the relevant paths are already mounted on the Galaxy server and target worker nodes.",
+    posix: "This is a simple path based storage location that assumes the all the relevant paths are already mounted on the Galaxy server and target worker nodes.",
     s3fs: "This is an remote file source plugin based on the Amazon Simple Storage Service (S3) interface. The AWS interface has become an industry standard and many storage vendors support it and use it to expose 'object' based storage.",
 };
 
diff --git a/client/src/components/ObjectStore/Instances/ManageIndex.vue b/client/src/components/ObjectStore/Instances/ManageIndex.vue
index 7f45d1907211..c30d1def5210 100644
--- a/client/src/components/ObjectStore/Instances/ManageIndex.vue
+++ b/client/src/components/ObjectStore/Instances/ManageIndex.vue
@@ -59,9 +59,9 @@ function reload() {
             :fixed="true"
             :show-empty="true">
             <template v-slot:empty>
-                <LoadingSpan v-if="loading" message="Loading object store instances" />
+                <LoadingSpan v-if="loading" message="Loading storage location instances" />
                 <b-alert v-else id="no-object-store-instances" variant="info" show>
-                    <div>No object store instances found, click the create button to configure a new one.</div>
+                    <div>No storage location instances found, click the create button to configure a new one.</div>
                 </b-alert>
             </template>
             <template v-slot:cell(badges)="row">
diff --git a/client/src/components/ObjectStore/ObjectStoreTypeSpan.vue b/client/src/components/ObjectStore/ObjectStoreTypeSpan.vue
index c17682b0cbbe..6e4113e820b8 100644
--- a/client/src/components/ObjectStore/ObjectStoreTypeSpan.vue
+++ b/client/src/components/ObjectStore/ObjectStoreTypeSpan.vue
@@ -4,13 +4,13 @@ import { computed } from "vue";
 import { ObjectStoreTemplateType } from "@/api/objectStores";
 
 const MESSAGES = {
-    aws_s3: "This is an object store based on the Amazon Simple Storage Service (S3). Data here is hosted by Amazon.",
+    aws_s3: "This is a storage location based on the Amazon Simple Storage Service (S3). Data here is hosted by Amazon.",
     azure_blob:
-        "This is a Microsoft Azure Blob based object store. More information on Microsoft's Azure Blob Storage can be found at https://azure.microsoft.com/en-us/products/storage/blobs/.",
-    disk: "This is a simple path based object store that assumes the all the relevant paths are already mounted on the Galaxy server and target worker nodes.",
-    boto3: "This is an object store based on the Amazon Simple Storage Service (S3) interface, but likely not stored by Amazon. The AWS interface has become an industry standard and many storage vendors support it and use it to expose object based storage.",
+        "This is a Microsoft Azure Blob based storage location. More information on Microsoft's Azure Blob Storage can be found at https://azure.microsoft.com/en-us/products/storage/blobs/.",
+    disk: "This is a simple path based storage location that assumes the all the relevant paths are already mounted on the Galaxy server and target worker nodes.",
+    boto3: "This is a storage location based on the Amazon Simple Storage Service (S3) interface, but likely not stored by Amazon. The AWS interface has become an industry standard and many storage vendors support it and use it to expose object based storage.",
     generic_s3:
-        "This is an object store based on the Amazon Simple Storage Service (S3) interface, but likely not stored by Amazon. The AWS interface has become an industry standard and many storage vendors support it and use it to expose object based storage.",
+        "This is a storage location based on the Amazon Simple Storage Service (S3) interface, but likely not stored by Amazon. The AWS interface has become an industry standard and many storage vendors support it and use it to expose object based storage.",
 };
 
 interface Props {
diff --git a/client/src/components/User/DiskUsage/StorageDashboard.vue b/client/src/components/User/DiskUsage/StorageDashboard.vue
index 70628d155ab7..9cd672a8550e 100644
--- a/client/src/components/User/DiskUsage/StorageDashboard.vue
+++ b/client/src/components/User/DiskUsage/StorageDashboard.vue
@@ -29,9 +29,9 @@ const texts = reactive({
         buttonText: localize("Explore now"),
     },
     explore_by_objectstore: {
-        title: localize("Visually explore your disk usage by object store"),
+        title: localize("Visually explore your disk usage by storage location"),
         description: localize(
-            "Want to know how the space in your account is being distributed by object store? Here you can explore your disk usage in a visual way by object store."
+            "Want to know how the space in your account is being distributed across storage locations? Here you can explore your disk usage in a visual way by where it is physically stored."
         ),
         icon: "fas fa-hdd fa-6x",
         buttonText: localize("Explore now"),
diff --git a/client/src/components/User/DiskUsage/Visualizations/HistoryStorageOverview.vue b/client/src/components/User/DiskUsage/Visualizations/HistoryStorageOverview.vue
index ca8b718f4560..134b2a060c80 100644
--- a/client/src/components/User/DiskUsage/Visualizations/HistoryStorageOverview.vue
+++ b/client/src/components/User/DiskUsage/Visualizations/HistoryStorageOverview.vue
@@ -194,7 +194,7 @@ function onUndelete(datasetId: string) {
                                 id="input-group-object-store"
                                 label="Storage location:"
                                 label-for="input-object-store"
-                                description="This will constrain history size calculations to a particular object store.">
+                                description="This will constrain history size calculations to a particular storage location.">
                                 <FilterObjectStoreLink
                                     :object-stores="selectableObjectStores"
                                     :value="objectStore"
diff --git a/client/src/components/User/DiskUsage/Visualizations/ObjectStoreActions.vue b/client/src/components/User/DiskUsage/Visualizations/ObjectStoreActions.vue
index e8753eb2c197..2f28f1fcba8b 100644
--- a/client/src/components/User/DiskUsage/Visualizations/ObjectStoreActions.vue
+++ b/client/src/components/User/DiskUsage/Visualizations/ObjectStoreActions.vue
@@ -39,7 +39,7 @@ function onViewItem() {
                 variant="outline-primary"
                 size="sm"
                 class="mx-2"
-                :title="localize(`Go to the details of this object store`)"
+                :title="localize(`Go to the details of this storage location`)"
                 @click="onViewItem">
                 <FontAwesomeIcon :icon="viewDetailsIcon" />
             </BButton>
diff --git a/client/src/components/User/DiskUsage/Visualizations/ObjectStoreStorageOverview.vue b/client/src/components/User/DiskUsage/Visualizations/ObjectStoreStorageOverview.vue
index 06237e694f62..a74c984fa971 100644
--- a/client/src/components/User/DiskUsage/Visualizations/ObjectStoreStorageOverview.vue
+++ b/client/src/components/User/DiskUsage/Visualizations/ObjectStoreStorageOverview.vue
@@ -1,6 +1,9 @@
 <script setup lang="ts">
 import { useRouter } from "vue-router/composables";
 
+import { useObjectStoreStore } from "@/stores/objectStoreStore";
+import localize from "@/utils/localization";
+
 import { fetchObjectStoreContentsSizeSummary } from "./service";
 import { buildTopNDatasetsBySizeData, byteFormattingForChart, useDataLoading, useDatasetsToDisplay } from "./util";
 
@@ -19,6 +22,8 @@ const props = defineProps<Props>();
 
 const router = useRouter();
 
+const { getObjectStoreNameById } = useObjectStoreStore();
+
 const {
     numberOfDatasetsToDisplayOptions,
     numberOfDatasetsToDisplay,
@@ -69,11 +74,11 @@ function onUndelete(datasetId: string) {
 </script>
 
 <template>
-    <OverviewPage title="Object Store Storage Overview">
+    <OverviewPage title="Storage overview by location">
         <p class="text-justify">
-            Here you will find some Graphs displaying the storage taken by datasets in the object store:
-            <b>{{ objectStoreId }}</b
-            >. You can use these graphs to identify the datasets that take the most space in this object store.
+            Here you will find some Graphs displaying the storage taken by datasets in the storage location:
+            <b>{{ getObjectStoreNameById(objectStoreId) }}</b
+            >. You can use these graphs to identify the datasets that take the most space in this storage location.
         </p>
         <WarnDeletedDatasets />
         <div v-if="isLoading" class="text-center">
diff --git a/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue b/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue
index 0bd23cae19b5..e6e21c927bae 100644
--- a/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue
+++ b/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue
@@ -39,10 +39,10 @@ function onViewObjectStore(objectStoreId: string) {
 }
 </script>
 <template>
-    <OverviewPage title="Object Stores Storage Overview">
+    <OverviewPage title="Storage overview by location">
         <p class="text-justify">
-            Here you can find various graphs displaying the storage size taken by all your histories grouped by object
-            store.
+            Here you can find various graphs displaying the storage size taken by all your histories grouped by where
+            they are physically stored.
         </p>
         <WarnDeletedHistories />
         <div v-if="isLoading" class="text-center">
@@ -53,14 +53,14 @@ function onViewObjectStore(objectStoreId: string) {
                 v-if="objectStoresBySizeData"
                 :description="
                     localize(
-                        `This graph displays how your Galaxy data is stored sorted into the object store is stored in. Click on a bar to see more information about the object store.`
+                        `This graph displays how your Galaxy data is stored sorted into the location is stored in. Click on a bar to see more information about the storage location.`
                     )
                 "
                 :data="objectStoresBySizeData"
                 :enable-selection="true"
                 v-bind="byteFormattingForChart">
                 <template v-slot:title>
-                    <b>{{ localize(`Object Stores by Usage`) }}</b>
+                    <b>{{ localize(`Storage locations by Usage`) }}</b>
                 </template>
                 <template v-slot:tooltip="{ data }">
                     <ShowObjectStore v-if="data" :object-store-id="data.id" />
diff --git a/client/src/components/User/DiskUsage/Visualizations/ShowObjectStore.vue b/client/src/components/User/DiskUsage/Visualizations/ShowObjectStore.vue
index 313f2f6c0142..35684455d658 100644
--- a/client/src/components/User/DiskUsage/Visualizations/ShowObjectStore.vue
+++ b/client/src/components/User/DiskUsage/Visualizations/ShowObjectStore.vue
@@ -36,13 +36,13 @@ watch(
     }
 );
 fetch();
-const loadingMessage = "Loading object store details";
-const forWhat = "This object store is";
+const loadingMessage = "Loading storage location details";
+const forWhat = "This storage location is";
 </script>
 
 <template>
     <div style="width: 300px">
-        <LoadingSpan v-if="loading" :message="loadingMessage | localize" />
+        <LoadingSpan v-if="loading" v-localize :message="loadingMessage" />
         <DescribeObjectStore v-else-if="objectStore != null" :what="forWhat" :storage-info="objectStore">
         </DescribeObjectStore>
         <b-alert v-else-if="error" show variant="danger">{{ error }}</b-alert>

From 0404a176f68e635aeb223c55f7e89a4dbf15b596 Mon Sep 17 00:00:00 2001
From: davelopez <46503462+davelopez@users.noreply.github.com>
Date: Wed, 10 Jul 2024 16:24:38 +0200
Subject: [PATCH 5/5] Ensure object stores are loaded first

---
 .../DiskUsage/Visualizations/ObjectStoresStorageOverview.vue  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue b/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue
index e6e21c927bae..aa6efe55a2fb 100644
--- a/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue
+++ b/client/src/components/User/DiskUsage/Visualizations/ObjectStoresStorageOverview.vue
@@ -20,10 +20,10 @@ const router = useRouter();
 
 const objectStoresBySizeData = ref<DataValuePoint[] | null>(null);
 
-const { isLoading, loadDataOnMount } = useDataLoading();
-
 const { getObjectStoreNameById } = useObjectStoreStore();
 
+const { isLoading, loadDataOnMount } = useDataLoading();
+
 loadDataOnMount(async () => {
     const { data } = await fetchObjectStoreUsages({ user_id: "current" });
     const objectStoresBySize = data.sort((a, b) => b.total_disk_usage - a.total_disk_usage);