diff --git a/client/src/components/Common/Abbreviation.vue b/client/src/components/Common/Abbreviation.vue
index c1d0cc7ca0b9..75a787b73235 100644
--- a/client/src/components/Common/Abbreviation.vue
+++ b/client/src/components/Common/Abbreviation.vue
@@ -1,5 +1,9 @@
diff --git a/client/src/components/Common/ButtonSpinner.vue b/client/src/components/Common/ButtonSpinner.vue
index 3fae4906ca9c..e2b8def400c1 100644
--- a/client/src/components/Common/ButtonSpinner.vue
+++ b/client/src/components/Common/ButtonSpinner.vue
@@ -1,14 +1,37 @@
+
+
-
- {{ title }}
-
-
+ {{ title }}
+
+
- {{ title }}
-
+
+ {{ title }}
+
-
diff --git a/client/src/components/Common/DelayedInput.vue b/client/src/components/Common/DelayedInput.vue
index 641b206e7da5..490c33de45d1 100644
--- a/client/src/components/Common/DelayedInput.vue
+++ b/client/src/components/Common/DelayedInput.vue
@@ -1,6 +1,96 @@
+
+
-
-
+
-
-
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
diff --git a/client/src/components/Common/ExportForm.vue b/client/src/components/Common/ExportForm.vue
index da769f538923..df58871a369b 100644
--- a/client/src/components/Common/ExportForm.vue
+++ b/client/src/components/Common/ExportForm.vue
@@ -53,9 +53,11 @@ const doExport = () => {
:require-writable="true"
:filter-options="defaultExportFilterOptions" />
+
+
Export to new record
+
Export to existing draft record
@@ -98,6 +99,7 @@ function clearInputs() {
{{ newEntry.name }}
draft record has been created in the repository.
+
You can preview the record in the repository, further edit its metadata and decide when to
publish it at
@@ -105,7 +107,9 @@ function clearInputs() {
{{ newEntry.external_link }}
+
Please use the button below to upload the exported {{ props.what }} to the record.
+
+
+
You need to create the new record in a repository before exporting the {{ props.what }} to it.
+
+
+
@@ -57,57 +62,65 @@ function copyDownloadLink(record) {
@click="isExpanded = !isExpanded">
{{ title }}
+
{{ row.value }}
+
{{ row.item.modelStoreFormat }}
+
Expired
- {{
- row.item.expirationElapsedTime
- }}
+
+
+ {{ row.item.expirationElapsedTime }}
+
+
No
+
+
+
@@ -116,20 +129,22 @@ function copyDownloadLink(record) {
:disabled="!row.item.canDownload"
title="Download"
@click="downloadObject(row.item)">
-
+
+
-
+
+
-
+
diff --git a/client/src/components/Common/FilterMenu.test.js b/client/src/components/Common/FilterMenu.test.ts
similarity index 91%
rename from client/src/components/Common/FilterMenu.test.js
rename to client/src/components/Common/FilterMenu.test.ts
index 5f7598ece3fd..de6f90493508 100644
--- a/client/src/components/Common/FilterMenu.test.js
+++ b/client/src/components/Common/FilterMenu.test.ts
@@ -1,9 +1,10 @@
-import { mount } from "@vue/test-utils";
-import { HistoryFilters } from "components/History/HistoryFilters";
-import { getLocalVue } from "tests/jest/helpers";
-import Filtering, { compare, contains, equals, toBool, toDate } from "utils/filtering";
+import { getLocalVue } from "@tests/jest/helpers";
+import { mount, Wrapper } from "@vue/test-utils";
-import FilterMenu from "./FilterMenu";
+import { HistoryFilters } from "@/components/History/HistoryFilters";
+import Filtering, { compare, contains, equals, toBool, toDate } from "@/utils/filtering";
+
+import FilterMenu from "./FilterMenu.vue";
const localVue = getLocalVue();
const options = [
@@ -55,18 +56,19 @@ const validTestFilters = {
type: Boolean,
handler: equals("bool_is", "bool_is", toBool),
menuItem: true,
- boolType: "is",
+ boolType: "is" as const,
},
/** A valid filter, just not included in menu */
not_included: { handler: contains("not_included"), menuItem: false },
};
-const TestFilters = new Filtering(validTestFilters, false);
+
+const TestFilters = new Filtering(validTestFilters, undefined);
describe("FilterMenu", () => {
- let wrapper;
+ let wrapper: Wrapper;
- function setUpWrapper(name, placeholder, filterClass) {
- wrapper = mount(FilterMenu, {
+ function setUpWrapper(name: string, placeholder: string, filterClass: Filtering) {
+ wrapper = mount(FilterMenu as object, {
propsData: {
name: name,
placeholder: placeholder,
@@ -87,12 +89,12 @@ describe("FilterMenu", () => {
await searchButton.trigger("click");
}
- async function expectCorrectEmits(showAdvanced, filterText, filterClass) {
- const filterEmit = wrapper.emitted()["update:filter-text"].length - 1;
- const toggleEmit = wrapper.emitted()["update:show-advanced"].length - 1;
- expect(wrapper.emitted()["update:show-advanced"][toggleEmit][0]).toEqual(showAdvanced);
- await wrapper.setProps({ showAdvanced: wrapper.emitted()["update:show-advanced"][toggleEmit][0] });
- const receivedText = wrapper.emitted()["update:filter-text"][filterEmit][0];
+ async function expectCorrectEmits(showAdvanced: boolean, filterText: string, filterClass: Filtering) {
+ const filterEmit = (wrapper.emitted()["update:filter-text"]?.length ?? 0) - 1;
+ const toggleEmit = (wrapper.emitted()?.["update:show-advanced"]?.length ?? 0) - 1;
+ expect(wrapper.emitted()["update:show-advanced"]?.[toggleEmit]?.[0]).toEqual(showAdvanced);
+ await wrapper.setProps({ showAdvanced: wrapper.emitted()["update:show-advanced"]?.[toggleEmit]?.[0] });
+ const receivedText = wrapper.emitted()["update:filter-text"]?.[filterEmit]?.[0];
const receivedDict = filterClass.getQueryDict(receivedText);
const parsedDict = filterClass.getQueryDict(filterText);
expect(receivedDict).toEqual(parsedDict);
@@ -166,8 +168,8 @@ describe("FilterMenu", () => {
const radioBtnGrp = wrapper.find("[data-description='filter bool_def']").findAll(".btn-secondary");
expect(radioBtnGrp.length).toBe(options.length);
for (let i = 0; i < options.length; i++) {
- expect(radioBtnGrp.at(i).text()).toBe(options[i].text);
- expect(radioBtnGrp.at(i).props().value).toBe(options[i].value);
+ expect(radioBtnGrp.at(i).text()).toBe(options[i]?.text);
+ expect(radioBtnGrp.at(i).props().value).toBe(options[i]?.value);
expect(radioBtnGrp.at(i).props().checked).toBe(null);
}
await radioBtnGrp.at(1).find("input").setChecked(); // click "Yes"
diff --git a/client/src/components/Common/FilterMenu.vue b/client/src/components/Common/FilterMenu.vue
index b418d1ca2355..75272a7d2e5f 100644
--- a/client/src/components/Common/FilterMenu.vue
+++ b/client/src/components/Common/FilterMenu.vue
@@ -1,4 +1,8 @@
Filter by {{ props.filter.placeholder }}:
-
-
+
-
+ :options="props.filter.datalist" />
+
-
-
-
-
-
+
+
+
+
+
-
-
+
+
+
-
+
{{ props.filter.helpInfo }}
-
+
diff --git a/client/src/components/Common/FilterMenuMultiTags.vue b/client/src/components/Common/FilterMenuMultiTags.vue
index 8434837470ef..d9c157d51092 100644
--- a/client/src/components/Common/FilterMenuMultiTags.vue
+++ b/client/src/components/Common/FilterMenuMultiTags.vue
@@ -1,19 +1,26 @@
Filter by {{ props.filter.placeholder }}:
-
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
+
diff --git a/client/src/components/Common/Heading.vue b/client/src/components/Common/Heading.vue
index 3e460965f62f..815680b6dc88 100644
--- a/client/src/components/Common/Heading.vue
+++ b/client/src/components/Common/Heading.vue
@@ -2,7 +2,7 @@
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
import { computed } from "vue";
-const props = defineProps<{
+interface Props {
h1?: boolean;
h2?: boolean;
h3?: boolean;
@@ -14,7 +14,9 @@ const props = defineProps<{
inline?: boolean;
size?: "xl" | "lg" | "md" | "sm" | "text";
icon?: string | [string, string];
-}>();
+}
+
+const props = defineProps();
const sizeClass = computed(() => {
return `h-${props.size ?? "lg"}`;
diff --git a/client/src/components/Common/PublishedItem.vue b/client/src/components/Common/PublishedItem.vue
index 246cae7db0b4..7f4aa88fc250 100644
--- a/client/src/components/Common/PublishedItem.vue
+++ b/client/src/components/Common/PublishedItem.vue
@@ -1,5 +1,5 @@
+
-