<template>
- <div class="d-flex width-90">
- <TooltipComponent :tool-tip-text="toolTipText" />
- <AutoCompleteComponent
- v-model="model"
- :item-value="itemValue"
- :item-list="getSearchCountries"
- :loading="getLoadingStatus"
- @input="selectedValue"
- @fetchData="getResults"
- />
- </div>
+ <AutoCompleteComponent
+ v-model="model"
+ :item-list="getSearchCountries"
+ :item-value="itemValue"
+ :loading="getLoadingStatus"
+ :tool-tip-text="toolTipText"
+ @input="selectedValue"
+ @fetch-data="getResults"
+ />
</template>
<script>
import { mapActions, mapGetters } from "vuex";
@@ -110,17 +108,17 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
import countriesSearch from "@/store";
import AutoCompleteComponent from "../UtilComponents/AutoCompleteComponent.vue";
-import TooltipComponent from "../UtilComponents/TooltipComponent.vue";
export default {
name: "Countries",
- components: { TooltipComponent, AutoCompleteComponent },
+ components: { AutoCompleteComponent },
props: {
value: {
type: Array,
default: () => [],
},
},
+ emits: ["input"],
data: () => {
return {
itemSelected: [],
@@ -131,7 +129,10 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
},
computed: {
- ...mapGetters("countriesSearch", ["getSearchCountries", "getLoadingStatus"]),
+ ...mapGetters("countriesSearch", [
+ "getSearchCountries",
+ "getLoadingStatus",
+ ]),
...mapGetters("advancedSearch", ["getEditDialogStatus"]),
model: {
@@ -157,7 +158,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
if (this.value && this.value.length) {
countriesSearch.commit(
"countriesSearch/setSearchCountries",
- this.value
+ this.value,
);
}
}
@@ -226,7 +227,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Domains.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Domains.vue.html
index 093048efbc..06c4cc5d72 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Domains.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Domains.vue.html
@@ -92,17 +92,15 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
<template>
- <div class="d-flex width-90">
- <TooltipComponent :tool-tip-text="toolTipText" />
- <AutoCompleteComponent
- v-model="model"
- :item-value="itemValue"
- :item-list="getSearchDomains"
- :loading="getLoadingStatus"
- @input="selectedValue"
- @fetchData="getResults"
- />
- </div>
+ <AutoCompleteComponent
+ v-model="model"
+ :item-list="getSearchDomains"
+ :item-value="itemValue"
+ :loading="getLoadingStatus"
+ :tool-tip-text="toolTipText"
+ @input="selectedValue"
+ @fetch-data="getResults"
+ />
</template>
<script>
import { mapActions, mapGetters } from "vuex";
@@ -110,17 +108,17 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
import domainsSearch from "@/store";
import AutoCompleteComponent from "../UtilComponents/AutoCompleteComponent.vue";
-import TooltipComponent from "../UtilComponents/TooltipComponent.vue";
export default {
name: "Domains",
- components: { TooltipComponent, AutoCompleteComponent },
+ components: { AutoCompleteComponent },
props: {
value: {
type: Array,
default: () => [],
},
},
+ emits: ["input"],
data: () => {
return {
itemSelected: [],
@@ -223,7 +221,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Licences.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Licences.vue.html
index a6b26f6cce..f3e88e4077 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Licences.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Licences.vue.html
@@ -92,17 +92,15 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
<template>
- <div class="d-flex width-90">
- <TooltipComponent :tool-tip-text="toolTipText" />
- <AutoCompleteComponent
- v-model="model"
- :item-value="itemValue"
- :item-list="getSearchLicences"
- :loading="getLoadingStatus"
- @input="selectedValue"
- @fetchData="getResults"
- />
- </div>
+ <AutoCompleteComponent
+ v-model="model"
+ :item-list="getSearchLicences"
+ :item-value="itemValue"
+ :loading="getLoadingStatus"
+ :tool-tip-text="toolTipText"
+ @input="selectedValue"
+ @fetch-data="getResults"
+ />
</template>
<script>
import { mapActions, mapGetters } from "vuex";
@@ -110,17 +108,17 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
import licencesSearch from "@/store";
import AutoCompleteComponent from "../UtilComponents/AutoCompleteComponent.vue";
-import TooltipComponent from "../UtilComponents/TooltipComponent.vue";
export default {
name: "Licences",
- components: { TooltipComponent, AutoCompleteComponent },
+ components: { AutoCompleteComponent },
props: {
value: {
type: Array,
default: () => [],
},
},
+ emits: ["input"],
data: () => {
return {
itemSelected: [],
@@ -157,7 +155,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
if (this.value && this.value.length) {
licencesSearch.commit(
"licencesSearch/setSearchLicences",
- this.value
+ this.value,
);
}
}
@@ -226,7 +224,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_ObjectTypes.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_ObjectTypes.vue.html
index b7f1895956..735bb6e77a 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_ObjectTypes.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_ObjectTypes.vue.html
@@ -92,17 +92,15 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
<template>
- <div class="d-flex width-90">
- <TooltipComponent :tool-tip-text="toolTipText" />
- <AutoCompleteComponent
- v-model="model"
- :item-value="itemValue"
- :item-list="typeList()"
- :loading="getLoadingData"
- @input="selectedValue"
- @fetchData="getResults"
- />
- </div>
+ <AutoCompleteComponent
+ v-model="model"
+ :item-list="getObjectTypes"
+ :item-value="itemValue"
+ :loading="getLoadingData"
+ :tool-tip-text="toolTipText"
+ @input="selectedValue"
+ @fetch-data="getResults"
+ />
</template>
<script>
import { mapActions, mapGetters } from "vuex";
@@ -110,17 +108,17 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
import objectTypes from "@/store";
import AutoCompleteComponent from "../UtilComponents/AutoCompleteComponent.vue";
-import TooltipComponent from "../UtilComponents/TooltipComponent.vue";
export default {
name: "ObjectTypes",
- components: { TooltipComponent, AutoCompleteComponent },
+ components: { AutoCompleteComponent },
props: {
value: {
type: Array,
default: () => [],
},
},
+ emits: ["input"],
data: () => {
return {
itemSelected: [],
@@ -155,10 +153,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
handler(open) {
if (open) {
if (this.value && this.value.length) {
- objectTypes.commit(
- "objectTypes/setObjectTypes",
- this.value
- );
+ objectTypes.commit("objectTypes/setObjectTypes", this.value);
}
}
},
@@ -178,13 +173,6 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
getResults(queryParams) {
if (queryParams) this.fetchObjectTypes(queryParams);
},
- typeList() {
- let items = [];
- this.getObjectTypes.forEach((item) => {
- items.push(item.label);
- })
- return items;
- }
},
};
</script>
@@ -233,7 +221,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Organisations.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Organisations.vue.html
index 725922e04d..73b84e7d57 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Organisations.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Organisations.vue.html
@@ -92,17 +92,15 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
<template>
- <div class="d-flex width-90">
- <TooltipComponent :tool-tip-text="toolTipText" />
- <AutoCompleteComponent
- v-model="model"
- :item-value="itemValue"
- :item-list="orgNames"
- :loading="getLoadingStatus"
- @input="selectedValue"
- @fetchData="getResults"
- />
- </div>
+ <AutoCompleteComponent
+ v-model="model"
+ :item-list="orgNames"
+ :item-value="itemValue"
+ :loading="getLoadingStatus"
+ :tool-tip-text="toolTipText"
+ @input="selectedValue"
+ @fetch-data="getResults"
+ />
</template>
<script>
import { mapActions, mapGetters } from "vuex";
@@ -110,17 +108,17 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
import organisationSearch from "@/store";
import AutoCompleteComponent from "../UtilComponents/AutoCompleteComponent.vue";
-import TooltipComponent from "../UtilComponents/TooltipComponent.vue";
export default {
name: "Organisations",
- components: { TooltipComponent, AutoCompleteComponent },
+ components: { AutoCompleteComponent },
props: {
value: {
type: Array,
default: () => [],
},
},
+ emits: ["input"],
data: () => {
return {
itemSelected: [],
@@ -130,7 +128,10 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
};
},
computed: {
- ...mapGetters("organisationSearch", ["getSearchOrganisations", "getLoadingStatus"]),
+ ...mapGetters("organisationSearch", [
+ "getSearchOrganisations",
+ "getLoadingStatus",
+ ]),
...mapGetters("advancedSearch", ["getEditDialogStatus"]),
model: {
@@ -143,7 +144,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
},
orgNames() {
return this.getSearchOrganisations.map(({ name }) => name);
- }
+ },
},
watch: {
itemSelected(newValue) {
@@ -159,7 +160,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
if (this.value && this.value.length) {
organisationSearch.commit(
"organisationSearch/setSearchOrganisations",
- this.value
+ this.value,
);
}
}
@@ -230,7 +231,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Subject.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Subject.vue.html
index 4fd6ddab99..b77c521000 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Subject.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Subject.vue.html
@@ -92,17 +92,15 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
<template>
- <div class="d-flex width-90">
- <TooltipComponent :tool-tip-text="toolTipText" />
- <AutoCompleteComponent
- v-model="model"
- :item-value="itemValue"
- :item-list="getSearchSubjects"
- :loading="getLoadingStatus"
- @input="selectedValue"
- @fetchData="getResults"
- />
- </div>
+ <AutoCompleteComponent
+ v-model="model"
+ :item-list="getSearchSubjects"
+ :item-value="itemValue"
+ :loading="getLoadingStatus"
+ :tool-tip-text="toolTipText"
+ @input="selectedValue"
+ @fetch-data="getResults"
+ />
</template>
<script>
import { mapActions, mapGetters } from "vuex";
@@ -110,17 +108,17 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
import subjectSearch from "@/store";
import AutoCompleteComponent from "../UtilComponents/AutoCompleteComponent.vue";
-import TooltipComponent from "../UtilComponents/TooltipComponent.vue";
export default {
name: "Subject",
- components: { TooltipComponent, AutoCompleteComponent },
+ components: { AutoCompleteComponent },
props: {
value: {
type: Array,
default: () => [],
},
},
+ emits: ["input"],
data: () => {
return {
itemSelected: [],
@@ -177,9 +175,6 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
},
};
</script>
-<style lang="scss" scoped>
-@import "@/styles/advancedSearchComponents";
-</style>
@@ -225,7 +220,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Taxonomies.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Taxonomies.vue.html
index e5d1dbc44a..abbee1a797 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Taxonomies.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_Taxonomies.vue.html
@@ -92,17 +92,15 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
<template>
- <div class="d-flex width-90">
- <TooltipComponent :tool-tip-text="toolTipText" />
- <AutoCompleteComponent
- v-model="model"
- :item-value="itemValue"
- :item-list="getSearchTaxonomies"
- :loading="getLoadingStatus"
- @input="selectedValue"
- @fetchData="getResults"
- />
- </div>
+ <AutoCompleteComponent
+ v-model="model"
+ :item-list="getSearchTaxonomies"
+ :item-value="itemValue"
+ :loading="getLoadingStatus"
+ :tool-tip-text="toolTipText"
+ @input="selectedValue"
+ @fetch-data="getResults"
+ />
</template>
<script>
import { mapActions, mapGetters } from "vuex";
@@ -110,17 +108,17 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
import taxonomiesSearch from "@/store";
import AutoCompleteComponent from "../UtilComponents/AutoCompleteComponent.vue";
-import TooltipComponent from "../UtilComponents/TooltipComponent.vue";
export default {
name: "Taxonomies",
- components: { TooltipComponent, AutoCompleteComponent },
+ components: { AutoCompleteComponent },
props: {
value: {
type: Array,
default: () => [],
},
},
+ emits: ["input"],
data: () => {
return {
itemSelected: [],
@@ -131,7 +129,10 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
},
computed: {
- ...mapGetters("taxonomiesSearch", ["getSearchTaxonomies", "getLoadingStatus"]),
+ ...mapGetters("taxonomiesSearch", [
+ "getSearchTaxonomies",
+ "getLoadingStatus",
+ ]),
...mapGetters("advancedSearch", ["getEditDialogStatus"]),
model: {
@@ -157,7 +158,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
if (this.value && this.value.length) {
taxonomiesSearch.commit(
"taxonomiesSearch/setSearchTaxonomies",
- this.value
+ this.value,
);
}
}
@@ -226,7 +227,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_UserDefinedTag.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_UserDefinedTag.vue.html
index 2449cc44d2..9ac4a940a6 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_UserDefinedTag.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GeneralComponents_UserDefinedTag.vue.html
@@ -92,17 +92,15 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
<template>
- <div class="d-flex width-90">
- <TooltipComponent :tool-tip-text="toolTipText" />
- <AutoCompleteComponent
- v-model="model"
- :item-value="itemValue"
- :item-list="getSearchUserDefinedTags"
- :loading="getLoadingStatus"
- @input="selectedValue"
- @fetchData="getResults"
- />
- </div>
+ <AutoCompleteComponent
+ v-model="model"
+ :item-list="getSearchUserDefinedTags"
+ :item-value="itemValue"
+ :loading="getLoadingStatus"
+ :tool-tip-text="toolTipText"
+ @input="selectedValue"
+ @fetch-data="getResults"
+ />
</template>
<script>
import { mapActions, mapGetters } from "vuex";
@@ -110,17 +108,17 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
import userDefinedTagsSearch from "@/store";
import AutoCompleteComponent from "../UtilComponents/AutoCompleteComponent.vue";
-import TooltipComponent from "../UtilComponents/TooltipComponent.vue";
export default {
name: "UserDefinedTag",
- components: { TooltipComponent, AutoCompleteComponent },
+ components: { AutoCompleteComponent },
props: {
value: {
type: Array,
default: () => [],
},
},
+ emits: ["input"],
data: () => {
return {
itemSelected: [],
@@ -131,7 +129,10 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
},
computed: {
- ...mapGetters("userDefinedTagsSearch", ["getSearchUserDefinedTags", "getLoadingStatus"]),
+ ...mapGetters("userDefinedTagsSearch", [
+ "getSearchUserDefinedTags",
+ "getLoadingStatus",
+ ]),
...mapGetters("advancedSearch", ["getEditDialogStatus"]),
model: {
@@ -157,7 +158,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
if (this.value && this.value.length) {
userDefinedTagsSearch.commit(
"userDefinedTagsSearch/setSearchUserDefinedTags",
- this.value
+ this.value,
);
}
}
@@ -226,7 +227,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_DatabaseRule.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_DatabaseRule.vue.html
index b26740f4d2..bdebc52567 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_DatabaseRule.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_DatabaseRule.vue.html
@@ -91,19 +91,13 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
-<template>
+ class="sunlight-highlight-javascript linenums"><template>
<div class="d-flex ruleWrapper">
<select
v-model="selectedDatabaseRule"
class="query-builder-group-slot__rule-selection"
>
- <option
- disabled
- value=""
- >
- Select a database rule
- </option>
+ <option disabled value="">Select a database rule</option>
<option
v-for="rule in databaseQueryBuilderComponents()"
:key="rule.identifier"
@@ -122,7 +116,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
</template>
<script>
-import { sortBy } from "lodash"
+import { sortBy } from "lodash";
import {
AccessMethods,
@@ -139,15 +133,15 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
DataProcessesAndConditions,
DataVersioning,
ResourceSustainability,
- UsesPersistentIdentifier
+ UsesPersistentIdentifier,
} from "../index";
export default {
name: "DatabaseRule",
props: {
groupCtrl: {
type: Object,
- default: null
- }
+ default: null,
+ },
},
data: () => {
return {
@@ -155,7 +149,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
};
},
- methods:{
+ methods: {
databaseQueryBuilderComponents() {
let databaseRecordType = [
{
@@ -164,101 +158,104 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
component: DatabaseRecordType,
initialValue: () => [],
},
- ]
+ ];
- return databaseRecordType.concat(this.sortedArrayList())
+ return databaseRecordType.concat(this.sortedArrayList());
},
/**
* Sort Array list by name
*/
sortedArrayList() {
- return sortBy([
- {
- identifier: "accessMethods",
- name: "Access Methods",
- component: AccessMethods,
- initialValue: () => [],
- },
- {
- identifier: "dataCuration",
- name: "Data Curation",
- component: DataCuration,
- initialValue: () => [],
- },
- {
- identifier: "dataDepositionCondition",
- name: "Data Deposition Condition",
- component: DataDepositionCondition,
- initialValue: () => [],
- },
- {
- identifier: "dataAccessCondition",
- name: "Data Access Condition ",
- component: DataAccessCondition,
- initialValue: () => [],
- },
- {
- identifier: "citationToRelatedPublications",
- name: "Citation To Related Publications",
- component: CitationToRelatedPublications,
- initialValue: () => [],
- },
- {
- identifier: "dataAccessForPrePublicationReview",
- name: "Data Access For Pre Publication Review",
- component: DataAccessForPrePublicationReview,
- initialValue: () => [],
- },
- {
- identifier: "dataContactInformation",
- name: "Data Contact Information",
- component: DataContactInformation,
- initialValue: () => [],
- },
- {
- identifier: "dataVersioning",
- name: "Data Versioning",
- component: DataVersioning,
- initialValue: () => [],
- },
- {
- identifier: "associatedTools",
- name: "Associated Tools",
- component: AssociatedTools,
- initialValue: "",
- },
- {
- identifier: "certificationsAndCommunityBadges",
- name: "Certifications And Community Badges",
- component: CertificationsAndCommunityBadges,
- initialValue: "",
- },
- {
- identifier: "dataProcessesAndConditions",
- name: "Data Processes And Conditions",
- component: DataProcessesAndConditions,
- initialValue: "",
- },
- {
- identifier: "dataPreservationPolicy",
- name: "Data Preservation Policy",
- component: DataPreservationPolicy,
- initialValue: "",
- },
- {
- identifier: "resourceSustainability",
- name: "Resource Sustainability",
- component: ResourceSustainability,
- initialValue: "",
- },
- {
- identifier: "usesPersistentIdentifier",
- name: "Uses Persistent Identifier",
- component: UsesPersistentIdentifier,
- initialValue: "",
- },
- ], "name")
+ return sortBy(
+ [
+ {
+ identifier: "accessMethods",
+ name: "Access Methods",
+ component: AccessMethods,
+ initialValue: () => [],
+ },
+ {
+ identifier: "dataCuration",
+ name: "Data Curation",
+ component: DataCuration,
+ initialValue: () => [],
+ },
+ {
+ identifier: "dataDepositionCondition",
+ name: "Data Deposition Condition",
+ component: DataDepositionCondition,
+ initialValue: () => [],
+ },
+ {
+ identifier: "dataAccessCondition",
+ name: "Data Access Condition ",
+ component: DataAccessCondition,
+ initialValue: () => [],
+ },
+ {
+ identifier: "citationToRelatedPublications",
+ name: "Citation To Related Publications",
+ component: CitationToRelatedPublications,
+ initialValue: () => [],
+ },
+ {
+ identifier: "dataAccessForPrePublicationReview",
+ name: "Data Access For Pre Publication Review",
+ component: DataAccessForPrePublicationReview,
+ initialValue: () => [],
+ },
+ {
+ identifier: "dataContactInformation",
+ name: "Data Contact Information",
+ component: DataContactInformation,
+ initialValue: () => [],
+ },
+ {
+ identifier: "dataVersioning",
+ name: "Data Versioning",
+ component: DataVersioning,
+ initialValue: () => [],
+ },
+ {
+ identifier: "associatedTools",
+ name: "Associated Tools",
+ component: AssociatedTools,
+ initialValue: "",
+ },
+ {
+ identifier: "certificationsAndCommunityBadges",
+ name: "Certifications And Community Badges",
+ component: CertificationsAndCommunityBadges,
+ initialValue: "",
+ },
+ {
+ identifier: "dataProcessesAndConditions",
+ name: "Data Processes And Conditions",
+ component: DataProcessesAndConditions,
+ initialValue: "",
+ },
+ {
+ identifier: "dataPreservationPolicy",
+ name: "Data Preservation Policy",
+ component: DataPreservationPolicy,
+ initialValue: "",
+ },
+ {
+ identifier: "resourceSustainability",
+ name: "Resource Sustainability",
+ component: ResourceSustainability,
+ initialValue: "",
+ },
+ {
+ identifier: "usesPersistentIdentifier",
+ name: "Uses Persistent Identifier",
+ component: UsesPersistentIdentifier,
+ initialValue: "",
+ },
+ ],
+ "name",
+ );
},
/**
@@ -267,13 +264,12 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
* @param selectedRule - String
*/
addNewRule(item, selectedRule) {
- item.addRule(selectedRule)
- this.selectedDatabaseRule = ''
+ item.addRule(selectedRule);
+ this.selectedDatabaseRule = "";
},
- }
+ },
};
</script>
-
@@ -319,7 +315,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_FairassistRule.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_FairassistRule.vue.html
index 18dcee6481..e3d65489f0 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_FairassistRule.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_FairassistRule.vue.html
@@ -97,12 +97,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
v-model="selectedFairassistRule"
class="query-builder-group-slot__rule-selection"
>
- <option
- disabled
- value=""
- >
- Select a FAIRassist rule
- </option>
+ <option disabled value="">Select a FAIRassist rule</option>
<option
v-for="rule in fairassistQueryBuilderComponents()"
:key="rule.identifier"
@@ -129,7 +124,8 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
FairassistRecordType,
IndeterminateExamples,
NegativeExamples,
- PositiveExamples} from "../index";
+ PositiveExamples,
+} from "../index";
export default {
name: "FairassistRule",
props: {
@@ -195,7 +191,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
initialValue: "",
},
],
- "name"
+ "name",
);
},
@@ -256,7 +252,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GeneralRule.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GeneralRule.vue.html
index b40cf1f359..3256c61373 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GeneralRule.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GeneralRule.vue.html
@@ -91,19 +91,13 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
-<template>
+ class="sunlight-highlight-javascript linenums"><template>
<div class="d-flex ruleWrapper">
<select
v-model="selectedGeneralRule"
class="query-builder-group-slot__rule-selection"
>
- <option
- disabled
- value=""
- >
- Select a generic rule
- </option>
+ <option disabled value="">Select a generic rule</option>
<option
v-for="rule in generalQueryBuilderComponents()"
:key="rule.identifier"
@@ -133,15 +127,15 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
Registry,
Subject,
Taxonomies,
- UserDefinedTag
+ UserDefinedTag,
} from "../index";
export default {
name: "GeneralRule",
props: {
groupCtrl: {
type: Object,
- default: null
- }
+ default: null,
+ },
},
data: () => {
return {
@@ -149,7 +143,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
};
},
- methods:{
+ methods: {
generalQueryBuilderComponents() {
return [
{
@@ -218,7 +212,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
component: ObjectTypes,
initialValue: () => [],
},
- ]
+ ];
},
/**
@@ -227,13 +221,12 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
* @param selectedRule - String
*/
addNewRule(item, selectedRule) {
- item.addRule(selectedRule)
- this.selectedGeneralRule = ''
+ item.addRule(selectedRule);
+ this.selectedGeneralRule = "";
},
- }
+ },
};
</script>
-
@@ -279,7 +272,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GroupCtrlSlot.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GroupCtrlSlot.vue.html
index ddcba87500..159d3011f7 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GroupCtrlSlot.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_GroupCtrlSlot.vue.html
@@ -94,7 +94,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
class="sunlight-highlight-javascript linenums"><template>
<div
class="query-builder-group-slot__group-control pa-4 d-flex"
- :class="{ 'flex-column': $vuetify.breakpoint.smAndDown }"
+ :class="{ 'flex-column': $vuetify.display.smAndDown }"
>
<!-- General Component -->
<GeneralRule :group-ctrl="groupCtrl" />
@@ -199,7 +199,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_PolicyRule.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_PolicyRule.vue.html
index 7da6b59e0d..94abec0a0d 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_PolicyRule.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_PolicyRule.vue.html
@@ -91,19 +91,13 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
-<template>
+ class="sunlight-highlight-javascript linenums"><template>
<div class="d-flex ruleWrapper">
<select
v-model="selectedPolicyRule"
class="query-builder-group-slot__rule-selection"
>
- <option
- disabled
- value=""
- >
- Select a policy rule
- </option>
+ <option disabled value="">Select a policy rule</option>
<option
v-for="rule in policyQueryBuilderComponents()"
:key="rule.identifier"
@@ -122,7 +116,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
</template>
<script>
-import { sortBy } from "lodash"
+import { sortBy } from "lodash";
import {
DataAvailabilityStatement,
@@ -140,15 +134,16 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
RecommendsStandard,
SharingResearchSoftware,
SupportedCosts,
- TimingOfDmp, UpdatingOfDmp
+ TimingOfDmp,
+ UpdatingOfDmp,
} from "../index";
export default {
name: "PolicyRule",
props: {
groupCtrl: {
type: Object,
- default: null
- }
+ default: null,
+ },
},
data: () => {
return {
@@ -156,120 +151,124 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
};
},
- methods:{
+ methods: {
policyQueryBuilderComponents() {
let policyRecordType = [
- {
- identifier: "policytype",
- name: "Policy Record Type",
- component: PolicyRecordType,
- initialValue: () => [],
- },
- ]
- return policyRecordType.concat(this.sortedArrayList())
+ {
+ identifier: "policytype",
+ name: "Policy Record Type",
+ component: PolicyRecordType,
+ initialValue: () => [],
+ },
+ ];
+ return policyRecordType.concat(this.sortedArrayList());
},
/**
* Sort Array list by name
*/
- sortedArrayList(){
- return sortBy([{
- identifier: "dataAvailabilityStatement",
- name: "Data Availability Statement",
- component: DataAvailabilityStatement,
- initialValue: "",
- },
- {
- identifier: "dataProtection",
- name: "Data Protection",
- component: DataProtection,
- initialValue: "",
- },
- {
- identifier: "dataCitation",
- name: "Data Citation",
- component: DataCitation,
- initialValue: "",
- },
- {
- identifier: "dataPreservation",
- name: "Data Preservation",
- component: DataPreservation,
- initialValue: "",
- },
- {
- identifier: "exceptionsToDataSharing",
- name: "Exceptions To Data Sharing",
- component: ExceptionsToDataSharing,
- initialValue: "",
- },
- {
- identifier: "licencesForOutputs",
- name: "Licences For Outputs",
- component: LicencesForOutputs,
- initialValue: "",
- },
- {
- identifier: "supportedCosts",
- name: "Supported Costs",
- component: SupportedCosts,
- initialValue: "",
- },
- {
- identifier: "mandatedDataSharing",
- name: "Mandated Data Sharing",
- component: MandatedDataSharing,
- initialValue: () => [],
- },
- {
- identifier: "mandatedDmpCreation",
- name: "Mandated DMP Creation",
- component: MandatedDmpCreation,
- initialValue: () => [],
- },
- {
- identifier: "sharingResearchSoftware",
- name: "Sharing Research Software",
- component: SharingResearchSoftware,
- initialValue: () => [],
- },
- {
- identifier: "timingOfDmp",
- name: "Timing Of DMP",
- component: TimingOfDmp,
- initialValue: () => [],
- },
- {
- identifier: "guidanceToHelpEnableCompliance",
- name: "Guidance To Help Enable Compliance",
- component: GuidanceToHelpEnableCompliance,
- initialValue: "",
- },
- {
- identifier: "monitoringOfCompliance",
- name: "Monitoring Of Compliance",
- component: MonitoringOfCompliance,
- initialValue: "",
- },
- {
- identifier: "recommendsDatabase",
- name: "Recommends At Least One Database",
- component: RecommendsDatabase,
- initialValue: "",
- },
- {
- identifier: "recommendsStandard",
- name: "Recommends At Least One Standard",
- component: RecommendsStandard,
- initialValue: "",
- },
- {
- identifier: "updatingOfDmp",
- name: "Updating of DMP",
- component: UpdatingOfDmp,
- initialValue: "",
- },
- ], "name")
+ sortedArrayList() {
+ return sortBy(
+ [
+ {
+ identifier: "dataAvailabilityStatement",
+ name: "Data Availability Statement",
+ component: DataAvailabilityStatement,
+ initialValue: "",
+ },
+ {
+ identifier: "dataProtection",
+ name: "Data Protection",
+ component: DataProtection,
+ initialValue: "",
+ },
+ {
+ identifier: "dataCitation",
+ name: "Data Citation",
+ component: DataCitation,
+ initialValue: "",
+ },
+ {
+ identifier: "dataPreservation",
+ name: "Data Preservation",
+ component: DataPreservation,
+ initialValue: "",
+ },
+ {
+ identifier: "exceptionsToDataSharing",
+ name: "Exceptions To Data Sharing",
+ component: ExceptionsToDataSharing,
+ initialValue: "",
+ },
+ {
+ identifier: "licencesForOutputs",
+ name: "Licences For Outputs",
+ component: LicencesForOutputs,
+ initialValue: "",
+ },
+ {
+ identifier: "supportedCosts",
+ name: "Supported Costs",
+ component: SupportedCosts,
+ initialValue: "",
+ },
+ {
+ identifier: "mandatedDataSharing",
+ name: "Mandated Data Sharing",
+ component: MandatedDataSharing,
+ initialValue: () => [],
+ },
+ {
+ identifier: "mandatedDmpCreation",
+ name: "Mandated DMP Creation",
+ component: MandatedDmpCreation,
+ initialValue: () => [],
+ },
+ {
+ identifier: "sharingResearchSoftware",
+ name: "Sharing Research Software",
+ component: SharingResearchSoftware,
+ initialValue: () => [],
+ },
+ {
+ identifier: "timingOfDmp",
+ name: "Timing Of DMP",
+ component: TimingOfDmp,
+ initialValue: () => [],
+ },
+ {
+ identifier: "guidanceToHelpEnableCompliance",
+ name: "Guidance To Help Enable Compliance",
+ component: GuidanceToHelpEnableCompliance,
+ initialValue: "",
+ },
+ {
+ identifier: "monitoringOfCompliance",
+ name: "Monitoring Of Compliance",
+ component: MonitoringOfCompliance,
+ initialValue: "",
+ },
+ {
+ identifier: "recommendsDatabase",
+ name: "Recommends At Least One Database",
+ component: RecommendsDatabase,
+ initialValue: "",
+ },
+ {
+ identifier: "recommendsStandard",
+ name: "Recommends At Least One Standard",
+ component: RecommendsStandard,
+ initialValue: "",
+ },
+ {
+ identifier: "updatingOfDmp",
+ name: "Updating of DMP",
+ component: UpdatingOfDmp,
+ initialValue: "",
+ },
+ ],
+ "name",
+ );
},
/**
@@ -278,13 +277,12 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
* @param selectedRule - String
*/
addNewRule(item, selectedRule) {
- item.addRule(selectedRule)
- this.selectedPolicyRule = ''
+ item.addRule(selectedRule);
+ this.selectedPolicyRule = "";
},
- }
+ },
};
</script>
-
@@ -330,7 +328,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_StandardRule.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_StandardRule.vue.html
index 8d99ba8362..a7d0e6a5d2 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_StandardRule.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderComponents_GroupCtrlSlot_StandardRule.vue.html
@@ -91,19 +91,13 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
-<template>
+ class="sunlight-highlight-javascript linenums"><template>
<div class="d-flex ruleWrapper">
<select
v-model="selectedStandardRule"
class="query-builder-group-slot__rule-selection"
>
- <option
- disabled
- value=""
- >
- Select a standards rule
- </option>
+ <option disabled value="">Select a standards rule</option>
<option
v-for="rule in standardQueryBuilderComponents()"
:key="rule.identifier"
@@ -122,20 +116,20 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
</template>
<script>
-
import {
GloballyUnique,
IsImplemented,
Persistent,
Resolvable,
- StandardRecordType} from "../index";
+ StandardRecordType,
+} from "../index";
export default {
name: "StandardRule",
props: {
groupCtrl: {
type: Object,
- default: null
- }
+ default: null,
+ },
},
data: () => {
return {
@@ -143,7 +137,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
};
},
- methods:{
+ methods: {
standardQueryBuilderComponents() {
return [
{
@@ -175,8 +169,8 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
name: "Resolvable",
component: Resolvable,
initialValue: "",
- }
- ]
+ },
+ ];
},
/**
@@ -185,13 +179,12 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
* @param selectedRule - String
*/
addNewRule(item, selectedRule) {
- item.addRule(selectedRule)
- this.selectedStandardRule = ''
+ item.addRule(selectedRule);
+ this.selectedStandardRule = "";
},
- }
+ },
};
</script>
-
@@ -237,7 +230,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderView.vue.html b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderView.vue.html
index 6e1601d1cb..6d335c7c22 100644
--- a/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderView.vue.html
+++ b/documentation/html/components_Records_Search_Input_AdvancedSearch_QueryBuilderView.vue.html
@@ -92,38 +92,26 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
<template>
- <query-builder
- v-model="query"
- :config="config"
- >
+ <query-builder v-model="query" :config="config">
<!-- To use the custom text instead of default text 'Operator' -->
<template #groupOperator="props">
<div class="query-builder-group__group-selection">
<div class="tooltip">
- <v-icon
- small
- class="mr-1 white--text tooltipIcon"
- >
- fa-question-circle
+ <v-icon class="mr-1 text-white tooltipIcon" size="small">
+ fas fa-question-circle
</v-icon>
<span class="tooltiptext" />
</div>
<span class="query-builder-group__group-operator">
Select an Operator to apply across all groups
</span>
-
<select
- class="operatorSelect"
:value="props.currentOperator"
+ class="operatorSelect"
@input="props.updateCurrentOperator($event.target.value)"
>
- <option
- disabled
- value=""
- >
- Select an operator
- </option>
+ <option disabled value="">Select an operator</option>
<option
v-for="operator in props.operators"
:key="operator.identifier"
@@ -140,7 +128,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
</template>
<script>
-import QueryBuilder from "query-builder-vue";
+import QueryBuilder from "query-builder-vue-3";
import { mapGetters } from "vuex";
import advancedSearch from "@/store";
@@ -202,6 +190,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
UserDefinedTag,
UsesPersistentIdentifier,
} from "./QueryBuilderComponents";
+
export default {
name: "QueryBuilderView",
components: { QueryBuilder, GroupCtrlSlot },
@@ -589,6 +578,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
watch: {
query(newValue) {
+ newValue = JSON.parse(JSON.stringify(newValue));
advancedSearch.commit("advancedSearch/setAdvancedSearch", newValue);
//Updating edit advanced search only if newValue has some data
if (newValue["children"] && newValue["children"].length) {
@@ -596,7 +586,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
if (item["children"] && item["children"].length) {
advancedSearch.commit(
"advancedSearch/setEditAdvancedSearch",
- newValue
+ newValue,
);
}
});
@@ -641,8 +631,7 @@ Source: components/Records/Search/Input/AdvancedSearch/Qu
};
</script>
<style lang="scss" scoped>
-@import "~vuetify/src/styles/settings/_variables.scss";
-@import "@/styles/queryBuilderView";
+@use "vuetify/settings";
</style>
@@ -689,7 +678,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_FilterAutocomplete.vue.html b/documentation/html/components_Records_Search_Input_FilterAutocomplete.vue.html
index 816fd2944e..e15d86dbd8 100644
--- a/documentation/html/components_Records_Search_Input_FilterAutocomplete.vue.html
+++ b/documentation/html/components_Records_Search_Input_FilterAutocomplete.vue.html
@@ -94,80 +94,113 @@ Source: components/Records/Search/Input/FilterAutocomplet
class="sunlight-highlight-javascript linenums"><template>
<v-expansion-panel
v-if="filter.filterName"
- :id="filter.filterName + 'AutocompleteList' "
+ :id="filter.filterName + 'AutocompleteList'"
>
- <v-expansion-panel-header> {{ filter.filterLabel }}</v-expansion-panel-header>
- <v-expansion-panel-content class="pl-5 pr-5">
- <div :class="['d-flex',{'flex-column':$vuetify.breakpoint.mdAndDown}]">
- <v-autocomplete
- v-model="selectedValues"
- :attach="true"
- :items="getValues"
- solo
- dense
- clearable
- multiple
- prepend-inner-icon="fa-search"
- :placeholder="`Search`"
- item-text="key"
- item-value="key"
- @focus="scrollTo(filter.filterName)"
- @click:clear="reset(filter)"
- >
- <template #selection="data">
- <v-chip class="blue white--text mb-1 ">
- <span class="chipsValueName">
- {{ cleanString(data.item.key) }}
- </span>
- </v-chip>
- </template>
- <template #item="data">
- <div class="d-flex full-width">
- <span class="filterValueName"> {{ cleanString(data.item.key) }}</span>
- <span class="filterValueCount"> {{ data.item['doc_count'] }}</span>
- </div>
- </template>
- </v-autocomplete>
- <v-btn
- color="primary"
- class="ml-lg-2 custom-btn"
- @click="applyFilters(filter)"
- >
- Apply
- </v-btn>
- </div>
- </v-expansion-panel-content>
+ <v-expansion-panel-title> {{ filter.filterLabel }}</v-expansion-panel-title>
+
+ <v-expansion-panel-text class="pl-5 pr-5">
+ <v-row no-gutters>
+ <v-col cols="12">
+ <div
+ :class="['d-flex', { 'flex-column': $vuetify.display.mdAndDown }]"
+ >
+ <v-combobox
+ v-model="selectedValues"
+ :items="getValues"
+ :menu-props="{ maxWidth: '50' }"
+ chips
+ class="text-capitalize"
+ clearable
+ closable-chips
+ color="primary"
+ density="compact"
+ hide-details="auto"
+ hide-no-data
+ item-title="key"
+ item-value="key"
+ multiple
+ placeholder="Search"
+ prepend-inner-icon="fas fa-search"
+ return-object
+ variant="solo"
+ @focus="scrollTo(filter.filterName)"
+ @click:clear="reset(filter)"
+ >
+ <template #chip="{ props, item }">
+ <v-chip color="blue" v-bind="props" variant="flat">
+ {{ item.title.replace(/_/g, " ") }}
+ <v-tooltip activator="parent" location="bottom">
+ {{ item.title.replace(/_/g, " ") }}
+ </v-tooltip>
+ </v-chip>
+ </template>
+
+ <template #item="{ props, item }">
+ <v-list-item v-bind="props">
+ <template #prepend="{ isActive }">
+ <v-list-item-action start>
+ <v-checkbox-btn
+ :model-value="isActive"
+ readonly
+ ></v-checkbox-btn>
+ </v-list-item-action>
+ </template>
+
+ <span v-if="item.raw.key" class="text-capitalize">
+ {{ item.raw.key.replace(/_/g, " ") }}
+ </span>
+
+ <template #append>
+ <span class="filterValueCount">{{
+ item.raw.doc_count
+ }}</span>
+ </template>
+ </v-list-item>
+ </template>
+ </v-combobox>
+ <v-btn
+ class="ml-lg-2 custom-btn"
+ color="primary"
+ @click="applyFilters(filter)"
+ >
+ Apply
+ </v-btn>
+ </div>
+ </v-col>
+ </v-row>
+ </v-expansion-panel-text>
</v-expansion-panel>
</template>
<script>
-import {mapGetters, mapState} from 'vuex'
+import { mapGetters, mapState } from "vuex";
-import clearString from '@/utils/stringUtils'
+import clearString from "@/utils/stringUtils";
+import { capitalize } from "lodash";
export default {
name: "FilterAutocomplete",
mixins: [clearString],
props: {
- filter: {default: null, type: Object},
- lastItem:{default:false, type:Boolean}
+ filter: { default: null, type: Object },
+ lastItem: { default: false, type: Boolean },
},
data: () => {
return {
- selectedValues: []
- }
+ selectedValues: [],
+ };
},
computed: {
- ...mapGetters('records', ['getFilter']),
- ...mapState('uiController', ['stickToTop']),
+ ...mapGetters("records", ["getFilter"]),
+ ...mapState("uiController", ["stickToTop"]),
getValues: function () {
let _module = this;
let output = _module.getFilter(this.filter.filterName);
- if (output.values && typeof output.values === 'object') {
+ if (output.values && typeof output.values === "object") {
return output.values;
}
- return []
- }
+ return [];
+ },
},
methods: {
/**
@@ -178,37 +211,44 @@ Source: components/Records/Search/Input/FilterAutocomplet
let filterName = _module.filter.filterName;
let currentParams = JSON.parse(JSON.stringify(_module.$route.query));
+ _module.selectedValues = _module.selectedValues.map(({ key }) => key);
if (Object.keys(currentParams).indexOf(filterName) === -1) {
- if (_module.selectedValues !== null && _module.selectedValues.length > 0) {
+ if (
+ _module.selectedValues !== null &&
+ _module.selectedValues.length > 0
+ ) {
if (_module.selectedValues.length === 1) {
- currentParams[filterName] = encodeURIComponent(_module.selectedValues.join(','));
- }
- else {
+ currentParams[filterName] = encodeURIComponent(
+ _module.selectedValues.join(","),
+ );
+ } else {
let newParam = [];
_module.selectedValues.forEach(function (val) {
newParam.push(encodeURIComponent(val));
});
currentParams[filterName] = newParam.join(",");
}
- currentParams['page'] = 1;
+ currentParams["page"] = 1;
_module.$router.push({
name: _module.$route.name,
- query: currentParams
+ query: currentParams,
});
}
- }
- else {
- if (_module.selectedValues === null || _module.selectedValues.length === 0) {
+ } else {
+ if (
+ _module.selectedValues === null ||
+ _module.selectedValues.length === 0
+ ) {
delete currentParams[_module.filter.filterName];
- currentParams['page'] = 1;
+ currentParams["page"] = 1;
_module.$router.push({
name: _module.$route.name,
- query: currentParams
+ query: currentParams,
});
- }
- else {
+ } else {
let newParams = [];
- let existingValues = currentParams[_module.filter.filterName].split(",");
+ let existingValues =
+ currentParams[_module.filter.filterName].split(",");
_module.selectedValues.forEach(function (selectedValue) {
const filterVal = encodeURIComponent(selectedValue);
if (existingValues.indexOf(filterVal) === -1) {
@@ -217,10 +257,10 @@ Source: components/Records/Search/Input/FilterAutocomplet
});
currentParams[_module.filter.filterName] += `,${newParams.join(",")}`;
if (newParams.length > 0) {
- currentParams['page'] = 1;
+ currentParams["page"] = 1;
_module.$router.push({
name: _module.$route.name,
- query: currentParams
+ query: currentParams,
});
}
}
@@ -236,16 +276,24 @@ Source: components/Records/Search/Input/FilterAutocomplet
/* istanbul ignore next */
scrollTo(name) {
let _module = this;
- _module.$scrollTo("#" + name + 'AutocompleteList', 450, {
- container: '#scrollable-holder',
- easing: 'ease-in',
- })
- }
- }
-}
+ _module.$scrollTo("#" + name + "AutocompleteList", 450, {
+ container: "#scrollable-holder",
+ easing: "ease-in",
+ });
+ },
+
+ itemProps(item) {
+ return {
+ key: item.key,
+ title: capitalize(this.cleanString(item.key)),
+ subtitle: item.doc_count,
+ };
+ },
+ },
+};
</script>
-<style scoped>
+<style lang="scss" scoped>
.filterValueName {
text-overflow: ellipsis;
overflow: hidden;
@@ -261,7 +309,7 @@ Source: components/Records/Search/Input/FilterAutocomplet
}
.filterValueCount {
- background: #2196F3;
+ background: #2196f3;
color: white;
padding: 0 7px;
}
@@ -269,6 +317,16 @@ Source: components/Records/Search/Input/FilterAutocomplet
.custom-btn {
height: 38px;
}
+
+.v-field {
+ .v-chip {
+ height: inherit;
+ }
+}
+
+:deep(.v-list-item-title) {
+ display: none;
+}
</style>
@@ -315,7 +373,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_FilterButton.vue.html b/documentation/html/components_Records_Search_Input_FilterButton.vue.html
index 144d80ade5..fed241bf9b 100644
--- a/documentation/html/components_Records_Search_Input_FilterButton.vue.html
+++ b/documentation/html/components_Records_Search_Input_FilterButton.vue.html
@@ -93,26 +93,28 @@ Source: components/Records/Search/Input/FilterButton.vue<
<template>
<v-tooltip
- bottom
- :disabled="itemModified.tooltip===undefined || $vuetify.breakpoint.smAndDown"
+ location="bottom"
+ :disabled="itemModified.tooltip === undefined || $vuetify.display.smAndDown"
>
- <template #activator="{ on }">
+ <template #activator="{ props }">
<v-btn
color="primary"
class="mr-1 mr-lg-2"
- :outlined="!itemModified.active"
- :class="[isFirstItem && !doubleItems ? 'first-child' : 'flex-1', {'button-style-md-screens' : mdScreens, 'buttons-md-style' : multipleItems && !isFirstItem}]"
+ :variant="!itemModified.active ? 'outlined' : 'flat'"
+ :class="[
+ isFirstItem && !doubleItems ? 'first-child' : 'flex-1',
+ {
+ 'button-style-md-screens': mdScreens,
+ 'buttons-md-style': multipleItems && !isFirstItem,
+ },
+ ]"
+ v-bind="props"
@click="selectFilter(itemModified)"
- v-on="on"
>
- <span v-if="itemModified.title!=='ALL'">{{ itemModified.title }}</span>
- <v-icon
- v-else
- small
- color="primary"
- >
- {{ $vuetify.icons.values.loading }}
- </v-icon>
+ <span v-if="itemModified.title !== 'ALL'">{{
+ itemModified.title
+ }}</span>
+ <v-icon v-else size="large" color="primary"> fas fa-sync </v-icon>
</v-btn>
</template>
<span>{{ itemModified.tooltip }}</span>
@@ -120,119 +122,122 @@ Source: components/Records/Search/Input/FilterButton.vue<
</template>
<script>
- import { isEqual } from "lodash";
- import { mapActions } from 'vuex'
-
- import currentParameter from "@/utils/currentParameterMixin.js"
-
- export default {
- name: "FilterButton",
- mixins: [currentParameter],
- props: {
- item: {default: null, type: Object},
- isFirstItem: {default: false, type: Boolean},
- mdScreens: {default: null, type: Boolean},
- itemParentIndex: {default: 0, type: Number},
- multipleItems: {default: false, type: Boolean},
- doubleItems: {default: false, type: Boolean},
- },
- data: () => {
- return {
- itemModified: {default: null, type: Object}
- }
- },
- watch: {
- currentParameter: {
- handler(newVal) {
- const _module = this;
- const fieldName = _module.itemModified.filterName;
- const fieldValue = newVal[fieldName];
- const currentValue = _module.itemModified.value;
- const title = _module.itemModified.title;
- _module.checkCurrentParameters(title, fieldValue, currentValue);
- },
- deep: true
- }
- },
- mounted(){
- this.$nextTick(function () {
- const _module = this;
- _module.itemModified = JSON.parse(JSON.stringify(this.item));
- const fieldValue = _module.currentParameter[this.itemModified.filterName];
- const currentValue = _module.itemModified.value;
- const title = _module.itemModified.title;
- _module.checkCurrentParameters(title, fieldValue, currentValue);
- });
- },
- methods: {
- checkCurrentParameters: function(title, fieldValue, currentValue) {
- if (fieldValue === null) {
- this.itemModified.active = title === 'all' || title === 'match all terms';
- }
- else {
- if (currentValue === undefined) {
- this.itemModified.active = false;
- }
- else {
- this.itemModified.active = currentValue.toString() === fieldValue;
- }
- }
- },
- /**
- * Apply the filters by building the new query parameters using the form data.
- */
- applyFilters: function (selectedItem) {
- const _module = this;
- let currentQuery = {};
- let oldQuery = {};
- Object.keys(_module.$route.query).forEach(function (param) {
- currentQuery[param] = _module.$route.query[param];
- oldQuery[param] = _module.$route.query[param]
- });
-
- Object.prototype.hasOwnProperty.call(selectedItem, 'value') ? currentQuery[selectedItem.filterName] = encodeURIComponent(selectedItem.value)
- : delete currentQuery[selectedItem.filterName];
- if (!isEqual(currentQuery, oldQuery)) {
- currentQuery['page'] = 1;
- this.$router.push({
- name: _module.$route.name,
- query: currentQuery
- });
- }
- },
- selectFilter: function (selectedItem) {
- let _module = this;
- _module.resetFilterButtons(_module.itemParentIndex);
- _module.activateButton({
- 'activeItem': selectedItem,
- 'itemParentIndex': _module.itemParentIndex
- });
- this.applyFilters(selectedItem);
- },
- ...mapActions("searchFilters", ["resetFilterButtons", "activateButton"])
+import { isEqual } from "lodash";
+import { mapActions } from "vuex";
+import customIcons from "@/plugins/icons";
+
+import currentParameter from "@/utils/currentParameterMixin.js";
+
+export default {
+ name: "FilterButton",
+ mixins: [currentParameter],
+ props: {
+ item: { default: null, type: Object },
+ isFirstItem: { default: false, type: Boolean },
+ mdScreens: { default: null, type: Boolean },
+ itemParentIndex: { default: 0, type: Number },
+ multipleItems: { default: false, type: Boolean },
+ doubleItems: { default: false, type: Boolean },
+ },
+ data: () => {
+ return {
+ itemModified: { default: null, type: Object },
+ customIcons: customIcons,
+ };
+ },
+ watch: {
+ currentParameter: {
+ handler(newVal) {
+ const _module = this;
+ const fieldName = _module.itemModified.filterName;
+ const fieldValue = newVal[fieldName];
+ const currentValue = _module.itemModified.value;
+ const title = _module.itemModified.title;
+ _module.checkCurrentParameters(title, fieldValue, currentValue);
+ },
+ deep: true,
+ },
+ },
+ mounted() {
+ this.$nextTick(function () {
+ const _module = this;
+ _module.itemModified = JSON.parse(JSON.stringify(this.item));
+ const fieldValue = _module.currentParameter[this.itemModified.filterName];
+ const currentValue = _module.itemModified.value;
+ const title = _module.itemModified.title;
+ _module.checkCurrentParameters(title, fieldValue, currentValue);
+ });
+ },
+ methods: {
+ ...mapActions("searchFilters", ["resetFilterButtons", "activateButton"]),
+ checkCurrentParameters: function (title, fieldValue, currentValue) {
+ if (fieldValue === null) {
+ this.itemModified.active =
+ title === "all" || title === "match all terms";
+ } else {
+ if (currentValue === undefined) {
+ this.itemModified.active = false;
+ } else {
+ this.itemModified.active = currentValue.toString() === fieldValue;
}
- }
+ }
+ },
+ /**
+ * Apply the filters by building the new query parameters using the form data.
+ */
+ applyFilters: function (selectedItem) {
+ const _module = this;
+ let currentQuery = {};
+ let oldQuery = {};
+
+ Object.keys(_module.$route.query).forEach(function (param) {
+ currentQuery[param] = _module.$route.query[param];
+ oldQuery[param] = _module.$route.query[param];
+ });
+ Object.prototype.hasOwnProperty.call(selectedItem, "value")
+ ? (currentQuery[selectedItem.filterName] = encodeURIComponent(
+ selectedItem.value,
+ ))
+ : delete currentQuery[selectedItem.filterName];
+ if (!isEqual(currentQuery, oldQuery)) {
+ currentQuery["page"] = 1;
+ this.$router.push({
+ name: _module.$route.name,
+ query: currentQuery,
+ });
+ }
+ },
+ selectFilter: function (selectedItem) {
+ let _module = this;
+ _module.resetFilterButtons(_module.itemParentIndex);
+ _module.activateButton({
+ activeItem: selectedItem,
+ itemParentIndex: _module.itemParentIndex,
+ });
+ this.applyFilters(selectedItem);
+ },
+ },
+};
</script>
<style scoped>
- .button-style-md-screens {
- font-size: 9px !important;
- }
-
- .first-child {
- font-size: 11px;
- width: 16.5%;
- }
-
- .flex-1 {
- font-size: 11px;
- flex: 1;
- }
-
- .buttons-md-style {
- min-width: 32px !important;
- }
-
+.button-style-md-screens {
+ font-size: 9px !important;
+}
+
+.first-child {
+ font-size: 11px;
+ width: 16.5%;
+}
+
+.flex-1 {
+ font-size: 11px;
+ flex: 1;
+}
+
+.buttons-md-style {
+ min-width: 32px !important;
+}
</style>
@@ -279,7 +284,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_Input_SearchInput.vue.html b/documentation/html/components_Records_Search_Input_SearchInput.vue.html
index 88df2f85c8..d775894875 100644
--- a/documentation/html/components_Records_Search_Input_SearchInput.vue.html
+++ b/documentation/html/components_Records_Search_Input_SearchInput.vue.html
@@ -94,8 +94,11 @@ Source: components/Records/Search/Input/SearchInput.vue
class="sunlight-highlight-javascript linenums"><template>
<v-card
id="scrollable-holder"
- :class="['pa-2', ($vuetify.breakpoint.mdAndUp) ? responsiveClassObject : 'fullHeight']"
- outlined
+ :class="[
+ 'pa-2 overflow-auto',
+ $vuetify.display.mdAndUp ? responsiveClassObject : 'fullHeight',
+ ]"
+ border
tile
elevation="3"
width="100%"
@@ -108,22 +111,18 @@ Source: components/Records/Search/Input/SearchInput.vue
placeholder="Search through current results."
/>
- <hr
- v-if="showSearchBox"
- class="mb-3 mr-2 ml-2 custom-hr"
- >
+ <hr v-if="showSearchBox" class="mb-3 mr-2 ml-2 custom-hr" />
<!-- Filter Buttons -->
<FilterButtons />
<!-- expansion Panels -->
<v-expansion-panels
- v-if="getFilters.length>0"
+ v-if="getFilters.length > 0"
v-model="panel"
multiple
flat
- hover
- accordion
+ variant="accordion"
>
<filter-autocomplete
v-for="filter in setup"
@@ -135,7 +134,7 @@ Source: components/Records/Search/Input/SearchInput.vue
</template>
<script>
-import {mapGetters, mapState} from "vuex"
+import { mapGetters, mapState } from "vuex";
import StringSearch from "@/components/Records/Search/Input/StringSearch";
import filterMapping from "@/data/FiltersLabelMapping.json";
@@ -145,20 +144,20 @@ Source: components/Records/Search/Input/SearchInput.vue
export default {
name: "SearchInput",
- components: {StringSearch, FilterButtons, FilterAutocomplete},
- props:{
- showSearchBox: {default: true, type: Boolean},
- searchPath: {default: '/search', type: String}
+ components: { StringSearch, FilterButtons, FilterAutocomplete },
+ props: {
+ showSearchBox: { default: true, type: Boolean },
+ searchPath: { default: "/search", type: String },
},
data() {
return {
panel: [],
filterSelected: {},
- sortOrder: filterMapping['sort_order'],
- }
+ sortOrder: filterMapping["sort_order"],
+ };
},
computed: {
- ...mapState('uiController', ['UIGeneralStatus']),
+ ...mapState("uiController", ["UIGeneralStatus"]),
...mapGetters("searchFilters", ["getFilters"]),
setup() {
let _module = this;
@@ -168,20 +167,21 @@ Source: components/Records/Search/Input/SearchInput.vue
},
responsiveClassObject: function () {
return {
- 'filters-holder-default': this.UIGeneralStatus.headerVisibilityState,
- 'filters-holder-after-scroll': !this.UIGeneralStatus.headerVisibilityState,
- }
- }
+ "filters-holder-default": this.UIGeneralStatus.headerVisibilityState,
+ "filters-holder-after-scroll":
+ !this.UIGeneralStatus.headerVisibilityState,
+ };
+ },
},
methods: {
setPanel() {
- this.panel = [...Array(this.getFilters.length).keys()].map((k, i) => i)
+ this.panel = [...Array(this.getFilters.length).keys()].map((k, i) => i);
},
resetPanel() {
- this.panel = []
+ this.panel = [];
},
createIndexForFilters: function () {
- this.getFilters.forEach(item => {
+ this.getFilters.forEach((item) => {
this.filterSelected[item.filterName] = [];
});
},
@@ -190,10 +190,10 @@ Source: components/Records/Search/Input/SearchInput.vue
* users' preferences. But, some terms may not be in the list, so they are given the index of 100 to force
* them to appear later.
*/
- compareLabels: function(a, b) {
+ compareLabels: function (a, b) {
let _module = this;
- const aIndex = _module.sortOrder.indexOf(a['filterName']);
- const bIndex = _module.sortOrder.indexOf(b['filterName']);
+ const aIndex = _module.sortOrder.indexOf(a["filterName"]);
+ const bIndex = _module.sortOrder.indexOf(b["filterName"]);
const aOrder = aIndex === -1 ? 100 : aIndex;
const bOrder = bIndex === -1 ? 100 : bIndex;
let comparison = -1;
@@ -201,9 +201,9 @@ Source: components/Records/Search/Input/SearchInput.vue
comparison = 1;
}
return comparison;
- }
- }
-}
+ },
+ },
+};
</script>
<style scoped>
@@ -217,7 +217,7 @@ Source: components/Records/Search/Input/SearchInput.vue
top: 0;
transition: height ease-in 500ms;
overscroll-behavior: contain;
- scrollbar-width:thin;
+ scrollbar-width: thin;
}
.filters-holder-after-scroll {
border-radius: 0;
@@ -229,16 +229,15 @@ Source: components/Records/Search/Input/SearchInput.vue
top: 0;
transition: height ease-in 500ms;
overscroll-behavior: contain;
- scrollbar-width:thin;
+ scrollbar-width: thin;
}
.custom-hr {
- opacity: .5;
+ opacity: 0.5;
}
.fullHeight {
height: 90vh;
overflow: scroll;
}
-
</style>
@@ -285,7 +284,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_SaveSearch_SaveSearchButton.vue.html b/documentation/html/components_Records_Search_SaveSearch_SaveSearchButton.vue.html
index 9201067c56..99cf262bfb 100644
--- a/documentation/html/components_Records_Search_SaveSearch_SaveSearchButton.vue.html
+++ b/documentation/html/components_Records_Search_SaveSearch_SaveSearchButton.vue.html
@@ -93,9 +93,9 @@ Source: components/Records/Search/SaveSearch/SaveSearchBu
<template>
<v-btn
- class="mb-2 white--text saveSearchResults"
+ class="mb-2 text-white saveSearchResults font-12"
color="accent2"
- small
+ size="small"
@click="!user().isLoggedIn ? goToLogin() : saveSearchResults()"
>
Save Search Results
@@ -182,7 +182,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_SaveSearch_SaveSearchStepper.vue.html b/documentation/html/components_Records_Search_SaveSearch_SaveSearchStepper.vue.html
index 7bb7459ab9..2e43a434f8 100644
--- a/documentation/html/components_Records_Search_SaveSearch_SaveSearchStepper.vue.html
+++ b/documentation/html/components_Records_Search_SaveSearch_SaveSearchStepper.vue.html
@@ -94,191 +94,186 @@ Source: components/Records/Search/SaveSearch/SaveSearchSt
class="sunlight-highlight-javascript linenums"><template>
<v-row justify="center">
<v-dialog
- :value="stepperDialog"
- width="900"
- persistent
+ :model-value="stepperDialog"
:retain-focus="false"
+ persistent
+ width="900"
@keydown.esc="closeStepperDialog()"
>
<!--Dialog Header -->
- <StepperDialogHeader @restartStepper="restartStepper" />
+ <StepperDialogHeader @restart-stepper="restartStepper" />
<!--Stepper Form -->
<div v-if="getShowStepper">
- <v-stepper
- v-model="steps"
- non-linear
- class="rounded-t-0"
- >
+ <v-stepper :model-value="steps" class="rounded-t-0" non-linear>
<!--Stepper Header -->
<v-stepper-header class="rounded-0">
<!--Header 1 -->
- <v-stepper-step
- editable
+ <v-stepper-item
:complete="steps > 1"
- step="1"
+ :value="1"
+ editable
+ subtitle="Optional"
+ title="Create Policy Link"
+ @click="steps = 1"
>
- Create Policy Link
- <small>Optional</small>
- </v-stepper-step>
+ </v-stepper-item>
<v-divider />
<!--Header 2 -->
- <v-stepper-step
+ <v-stepper-item
v-if="user().is_super_curator"
- editable
:complete="steps > 2"
- step="2"
+ :value="2"
+ editable
+ subtitle="Optional"
+ title="Create Organisation Link"
+ @click="steps = 2"
>
- Create Organisation Link
- <small>Optional</small>
- </v-stepper-step>
+ </v-stepper-item>
<v-divider v-if="user().is_super_curator" />
<!--Header 3 -->
- <v-stepper-step
+ <v-stepper-item
v-if="user().is_super_curator"
- editable
:complete="steps > 3"
- step="3"
+ :value="3"
+ editable
+ subtitle="Optional"
+ title="Create User Link"
+ @click="steps = 3"
>
- Create User Link
- <small>Optional</small>
- </v-stepper-step>
+ </v-stepper-item>
<v-divider v-if="user().is_super_curator" />
<!--Header 4 -->
- <v-stepper-step
+ <v-stepper-item
+ :value="user().is_super_curator ? 4 : 2"
editable
- :step="user().is_super_curator ? 4 : 2"
+ @click="steps = user().is_super_curator ? 4 : 2"
>
Save Search
- </v-stepper-step>
+ </v-stepper-item>
</v-stepper-header>
<!--Stepper Body -->
- <v-stepper-items>
+ <v-window :model-value="steps" class="ma-6">
<!--Stepper Content 1 Policy List-->
- <v-stepper-content step="1">
+ <v-window-item :value="1">
<PolicyStepper />
<v-btn
+ :class="{ 'full-width': $vuetify.display.smAndDown }"
class="float-md-right my-3"
- :class="{ 'full-width': $vuetify.breakpoint.smAndDown }"
color="primary"
+ variant="elevated"
@click="steps = 2"
>
Continue
</v-btn>
- </v-stepper-content>
+ </v-window-item>
<!--Stepper Content 2 Organisation List-->
- <v-stepper-content
- v-if="user().is_super_curator"
- step="2"
- >
+ <v-window-item v-if="user().is_super_curator" :value="2">
<OrganisationStepper />
<div
class="d-flex flex-column flex-md-row justify-md-space-between my-3"
>
<v-btn
- class="order-md-2"
:class="{
- 'mb-3': $vuetify.breakpoint.smAndDown,
+ 'mb-3': $vuetify.display.smAndDown,
}"
+ class="order-md-2"
color="primary"
+ variant="elevated"
@click="steps = 3"
>
Continue
</v-btn>
<v-btn
- class="white--text order-md-1"
+ class="text-white order-md-1"
color="accent3"
+ variant="elevated"
@click="steps = 1"
>
Back
</v-btn>
</div>
- </v-stepper-content>
+ </v-window-item>
<!--Stepper Content 3 Save Search Form-->
- <v-stepper-content
- v-if="user().is_super_curator"
- step="3"
- >
+ <v-window-item v-if="user().is_super_curator" :value="3">
<UserStepper />
<div
class="d-flex flex-column flex-md-row justify-md-space-between my-3"
>
<v-btn
- class="order-md-2"
:class="{
- 'mb-3': $vuetify.breakpoint.smAndDown,
+ 'mb-3': $vuetify.display.smAndDown,
}"
+ class="order-md-2"
color="primary"
+ variant="elevated"
@click="steps = 4"
>
Continue
</v-btn>
<v-btn
- class="white--text order-md-1"
+ class="text-white order-md-1"
color="accent3"
+ variant="elevated"
@click="steps = 2"
>
Back
</v-btn>
</div>
- </v-stepper-content>
+ </v-window-item>
<!--Stepper Content 4 Save Search Form-->
- <v-stepper-content :step="user().is_super_curator ? 4 : 2">
- <v-form
- ref="searchFormRef"
- v-model="searchForm"
- >
+ <v-window-item :value="user().is_super_curator ? 4 : 2">
+ <v-form ref="searchFormRef" v-model="searchForm">
<v-text-field
v-model="searchName"
- label="Search Name"
:rules="[isRequired()]"
+ label="Search Name"
/>
<v-text-field
v-model="searchComment"
:counter="100"
- maxlength="100"
label="Comments"
+ maxlength="100"
/>
</v-form>
<div
class="d-flex flex-column flex-md-row justify-md-space-between my-3"
>
<v-btn
- class="order-md-2"
:class="{
- 'mb-3': $vuetify.breakpoint.smAndDown,
+ 'mb-3': $vuetify.display.smAndDown,
}"
- color="success order-md-1"
:disabled="!searchForm"
:loading="loading"
+ class="order-md-2"
+ color="success order-md-1"
+ variant="elevated"
@click="saveSearch"
>
Save
</v-btn>
<v-btn
- class="white--text"
+ class="text-white"
color="accent3"
+ variant="elevated"
@click="steps = user().is_super_curator ? 3 : 1"
>
Back
</v-btn>
</div>
- </v-stepper-content>
- </v-stepper-items>
+ </v-window-item>
+ </v-window>
</v-stepper>
</div>
- <ResultCard
- v-else
- @restartStepper="restartStepper"
- />
+ <ResultCard v-else @restart-stepper="restartStepper" />
</v-dialog>
</v-row>
</template>
@@ -312,7 +307,7 @@ Source: components/Records/Search/SaveSearch/SaveSearchSt
data() {
return {
stepperDialog: false,
- steps: 1,
+ steps: 0,
policySelected: [],
organisationSelected: [],
policyList: [],
@@ -380,7 +375,7 @@ Source: components/Records/Search/SaveSearch/SaveSearchSt
const searchResult = await restClient.saveSearch(
saveSearchObj,
- this.user().credentials.token
+ this.user().credentials.token,
);
//Hide stepper and show result section
@@ -416,7 +411,7 @@ Source: components/Records/Search/SaveSearch/SaveSearchSt
/**
* Restart the Save Search from step 1
- * @param value - Step number 1
+ * @param value - Value number 1
*/
restartStepper(value) {
this.steps = value;
@@ -469,7 +464,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_OrganisationStepper.vue.html b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_OrganisationStepper.vue.html
index b50635a488..281e5caff8 100644
--- a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_OrganisationStepper.vue.html
+++ b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_OrganisationStepper.vue.html
@@ -96,43 +96,26 @@ Source: components/Records/Search/SaveSearch/StepperCompo
<template v-if="user().is_super_curator">
<v-autocomplete
v-model="organisationSelected"
+ v-model:search="searchOrganisation"
:items="getSearchOrganisations"
- :search-input.sync="searchOrganisation"
- class="mb-7"
:loading="getLoadingStatus"
- hide-details
- multiple
- cache-items
chips
- deletable-chips
+ class="mb-7 full-width stepperField"
+ closable-chips
+ color="primary"
+ flat
+ hide-details="auto"
+ item-title="name"
item-value="id"
- item-text="name"
label="Enter text to search for organisation(s) to associate with this saved search"
+ multiple
+ variant="underlined"
>
- <template #selection="data">
- <v-chip
- v-bind="data.attrs"
- :input-value="data.item['id']"
- close
- @click="data.select"
- @click:close="remove(data.item['id'])"
- >
- {{ data.item["name"] }}
- </v-chip>
- </template>
<template #no-data>
- <div
- v-show="!getLoadingStatus"
- class="py-3 px-4"
- >
+ <div v-show="!getLoadingStatus" class="py-3 px-4">
No organisation found
</div>
- <div
- v-show="getLoadingStatus"
- class="py-3 px-4"
- >
- Loading...
- </div>
+ <div v-show="getLoadingStatus" class="py-3 px-4">Loading...</div>
</template>
</v-autocomplete>
</template>
@@ -140,9 +123,9 @@ Source: components/Records/Search/SaveSearch/StepperCompo
<v-progress-linear
:active="loading"
:indeterminate="loading"
+ color="primary"
height="6"
rounded
- color="primary"
/>
<template v-if="organisationList && organisationList.length">
<v-checkbox
@@ -154,9 +137,7 @@ Source: components/Records/Search/SaveSearch/StepperCompo
/>
</template>
<template v-else>
- <p v-if="!loading">
- No organisation found
- </p>
+ <p v-if="!loading">No organisation found</p>
</template>
</template>
</div>
@@ -278,7 +259,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_PolicyStepper.vue.html b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_PolicyStepper.vue.html
index 107e26cac0..29ff59c0ca 100644
--- a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_PolicyStepper.vue.html
+++ b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_PolicyStepper.vue.html
@@ -96,43 +96,26 @@ Source: components/Records/Search/SaveSearch/StepperCompo
<template v-if="user().is_super_curator">
<v-autocomplete
v-model="policySelected"
+ v-model:search="searchPolicy"
:items="getPolicyRecords"
- :search-input.sync="searchPolicy"
- class="mb-7"
:loading="getLoadingStatus"
- hide-details
- multiple
- cache-items
chips
- deletable-chips
+ class="mb-7 full-width stepperField"
+ closable-chips
+ color="primary"
+ flat
+ hide-details="auto"
+ item-title="name"
item-value="id"
- item-text="name"
label="Enter text to search for policy record(s) to associate with this saved search"
+ multiple
+ variant="underlined"
>
- <template #selection="data">
- <v-chip
- v-bind="data.attrs"
- :input-value="data.item['id']"
- close
- @click="data.select"
- @click:close="remove(data.item['id'])"
- >
- {{ data.item["name"] }}
- </v-chip>
- </template>
<template #no-data>
- <div
- v-show="!getLoadingStatus"
- class="py-3 px-4"
- >
+ <div v-show="!getLoadingStatus" class="py-3 px-4">
No Policy found
</div>
- <div
- v-show="getLoadingStatus"
- class="py-3 px-4"
- >
- Loading...
- </div>
+ <div v-show="getLoadingStatus" class="py-3 px-4">Loading...</div>
</template>
</v-autocomplete>
</template>
@@ -140,9 +123,9 @@ Source: components/Records/Search/SaveSearch/StepperCompo
<v-progress-linear
:active="loading"
:indeterminate="loading"
+ color="primary"
height="6"
rounded
- color="primary"
/>
<template v-if="policyList && policyList.length">
<v-checkbox
@@ -154,9 +137,7 @@ Source: components/Records/Search/SaveSearch/StepperCompo
/>
</template>
<template v-else>
- <p v-if="!loading">
- No policy found
- </p>
+ <p v-if="!loading">No policy found</p>
</template>
</template>
</div>
@@ -212,12 +193,11 @@ Source: components/Records/Search/SaveSearch/StepperCompo
*/
async fetchUserPolicyRecordData() {
await this.getUser();
- let maintainedRecordsArr = await this.getUserRecords.user[
- "maintainedRecords"
- ];
+ let maintainedRecordsArr =
+ await this.getUserRecords.user["maintainedRecords"];
if (maintainedRecordsArr && maintainedRecordsArr.length) {
return maintainedRecordsArr.filter(
- (record) => record["registry"] === "Policy"
+ (record) => record["registry"] === "Policy",
);
}
return [];
@@ -279,7 +259,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_ResultCard.vue.html b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_ResultCard.vue.html
index 8d0d027867..ffc450e100 100644
--- a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_ResultCard.vue.html
+++ b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_ResultCard.vue.html
@@ -92,85 +92,84 @@ Source: components/Records/Search/SaveSearch/StepperCompo
<template>
- <!--Success -->
- <v-card
- v-if="getSaveSearchStatus"
- class="mx-auto rounded-t-0 pb-2"
- >
- <v-card-title
- class="justify-center white--text mb-4"
- style="background-color: green"
- >
- Success !!
- </v-card-title>
- <v-card-text class="pb-0">
- <p class="text-body-1">
- Your search was saved successfully. Please check the saved search table under profile page.
- </p>
- </v-card-text>
-
- <v-card-actions
- class="flex-column flex-md-row justify-md-space-between my-3"
- >
- <v-btn
- class="white--text order-md-2"
- :class="{
- 'mb-3': $vuetify.breakpoint.smAndDown,
- }"
- color="accent2"
- to="/accounts/profile"
- @click="resetSaveSearchDialog()"
+ <div>
+ <!--Success -->
+ <v-card v-if="getSaveSearchStatus" class="mx-auto rounded-t-0 pb-2">
+ <v-card-title
+ class="justify-center text-white mb-4 text-center"
+ style="background-color: green"
>
- Goto Profile page
- </v-btn>
- <v-btn
- class="white--text order-md-1"
- color="accent3"
- @click="closeStepperDialog"
+ Success !!
+ </v-card-title>
+ <v-card-text class="pb-0 px-6">
+ <p class="text-body-1">
+ Your search was saved successfully. Please check the saved search
+ table under profile page.
+ </p>
+ </v-card-text>
+
+ <v-card-actions
+ class="flex-column flex-md-row justify-md-space-between my-3 px-6"
>
- Close
- </v-btn>
- </v-card-actions>
- </v-card>
-
- <!-- Error -->
- <v-card
- v-else-if="!getSaveSearchStatus"
- class="mx-auto pb-2"
- >
- <v-card-title
- class="justify-center white--text mb-4"
- style="background-color: darkred"
- >
- Error
- </v-card-title>
- <v-card-text class="pb-0">
- <p class="text-body-1">
- Something went wrong. Please try again.
- </p>
- </v-card-text>
- <v-card-actions
- class="flex-column flex-md-row justify-md-space-between my-3"
- >
- <v-btn
- class="white--text order-md-2"
- :class="{
- 'mb-3': $vuetify.breakpoint.smAndDown,
- }"
- color="accent2"
- @click="restartStepper"
+ <v-btn
+ :class="{
+ 'mb-3': $vuetify.display.smAndDown,
+ }"
+ class="text-white order-md-2"
+ color="accent2"
+ to="/accounts/profile"
+ variant="elevated"
+ @click="resetSaveSearchDialog()"
+ >
+ Goto Profile page
+ </v-btn>
+ <v-btn
+ class="text-white order-md-1"
+ color="accent3"
+ variant="elevated"
+ @click="closeStepperDialog"
+ >
+ Close
+ </v-btn>
+ </v-card-actions>
+ </v-card>
+
+ <!-- Error -->
+ <v-card v-else-if="!getSaveSearchStatus" class="mx-auto pb-2">
+ <v-card-title
+ class="justify-center text-white mb-4 text-center"
+ style="background-color: darkred"
>
- Start Again
- </v-btn>
- <v-btn
- class="white--text order-md-1"
- color="secondary"
- @click="closeStepperDialog"
+ Error
+ </v-card-title>
+ <v-card-text class="pb-0 px-6">
+ <p class="text-body-1">Something went wrong. Please try again.</p>
+ </v-card-text>
+ <v-card-actions
+ class="flex-column flex-md-row justify-md-space-between my-3 px-6"
>
- Close
- </v-btn>
- </v-card-actions>
- </v-card>
+ <v-btn
+ :class="{
+ 'mb-3': $vuetify.display.smAndDown,
+ }"
+ class="text-white order-md-2"
+ color="accent2"
+ data-test="restart-btn"
+ @click="restartStepper"
+ >
+ Start Again
+ </v-btn>
+ <v-btn
+ class="text-white order-md-1"
+ color="secondary"
+ data-test="close-btn"
+ @click="closeStepperDialog"
+ >
+ Close
+ </v-btn>
+ </v-card-actions>
+ </v-card>
+ </div>
</template>
<script>
@@ -180,6 +179,7 @@ Source: components/Records/Search/SaveSearch/StepperCompo
export default {
name: "ResultCard",
+ emits: ["restartStepper"],
data() {
return {};
},
@@ -209,7 +209,7 @@ Source: components/Records/Search/SaveSearch/StepperCompo
}
saveSearch.commit("saveSearch/setSaveSearchStepperDialog", false);
this.resetSaveSearchDialog();
- this.$emit("restartStepper", 1);
+ this.$emit("restartStepper", 0);
},
},
};
@@ -259,7 +259,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_StepperDialogHeader.vue.html b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_StepperDialogHeader.vue.html
index 160ffd87e8..0e99956e1c 100644
--- a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_StepperDialogHeader.vue.html
+++ b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_StepperDialogHeader.vue.html
@@ -92,38 +92,31 @@ Source: components/Records/Search/SaveSearch/StepperCompo
<template>
- <div
- class="rounded-0 white py-3"
- style="position: relative"
- >
- <h2 class="text-center">
- Save Your Search
- </h2>
+ <div class="rounded-0 bg-white py-3" style="position: relative">
+ <h2 class="text-center">Save Your Search</h2>
<v-btn
+ elevation="0"
icon
- dark
style="position: absolute; top: 10px; right: 15px"
>
<v-icon
- color="
- black"
+ icon="fas fa-xmark fa-solid"
size="40px"
@click="closeStepperDialog()"
- >
- mdi-close
- </v-icon>
+ />
</v-btn>
</div>
</template>
<script>
-import {mapActions, mapGetters} from "vuex";
+import { mapActions, mapGetters } from "vuex";
import saveSearch from "@/store";
export default {
name: "StepperDialogHeader",
+ emits: ["restartStepper"],
computed: {
...mapGetters("saveSearch", ["getSaveSearchStatus"]),
@@ -137,7 +130,7 @@ Source: components/Records/Search/SaveSearch/StepperCompo
closeStepperDialog() {
if (this.getSaveSearchStatus) {
this.resetSaveSearchDialog();
- this.$emit("restartStepper", 1);
+ this.$emit("restartStepper", 0);
}
saveSearch.commit("saveSearch/setSaveSearchStepperDialog", false);
},
@@ -189,7 +182,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_UserStepper.vue.html b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_UserStepper.vue.html
index 0694179691..2c88be3262 100644
--- a/documentation/html/components_Records_Search_SaveSearch_StepperComponents_UserStepper.vue.html
+++ b/documentation/html/components_Records_Search_SaveSearch_StepperComponents_UserStepper.vue.html
@@ -96,43 +96,24 @@ Source: components/Records/Search/SaveSearch/StepperCompo
<template v-if="user().is_super_curator">
<v-autocomplete
v-model="userSelected"
+ v-model:search="searchUser"
:items="usersList"
- :search-input.sync="searchUser"
- class="mb-7"
:loading="loading"
- hide-details
- multiple
- cache-items
chips
- deletable-chips
+ class="mb-7 full-width stepperField"
+ closable-chips
+ color="primary"
+ flat
+ hide-details="auto"
+ item-title="username"
item-value="id"
- item-text="username"
label="Enter text to search for additional user(s) to associate with this saved search"
+ multiple
+ variant="underlined"
>
- <template #selection="data">
- <v-chip
- v-bind="data.attrs"
- :input-value="data.item['id']"
- close
- @click="data.select"
- @click:close="remove(data.item['id'])"
- >
- {{ data.item["username"] }}
- </v-chip>
- </template>
<template #no-data>
- <div
- v-show="!loading"
- class="py-3 px-4"
- >
- No User found
- </div>
- <div
- v-show="loading"
- class="py-3 px-4"
- >
- Loading...
- </div>
+ <div v-show="!loading" class="py-3 px-4">No User found</div>
+ <div v-show="loading" class="py-3 px-4">Loading...</div>
</template>
</v-autocomplete>
</template>
@@ -230,7 +211,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/components_Users_Profiles_Private_ViewSavedSearchesTable.vue.html b/documentation/html/components_Users_Profiles_Private_ViewSavedSearchesTable.vue.html
index 8e61f3d827..28c90ec3ff 100644
--- a/documentation/html/components_Users_Profiles_Private_ViewSavedSearchesTable.vue.html
+++ b/documentation/html/components_Users_Profiles_Private_ViewSavedSearchesTable.vue.html
@@ -103,18 +103,14 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
mobile-breakpoint="960"
>
<template #[`item.creator`]="{ item }">
- <a :href="`/users/${item.creator['id']}`">{{ item.creator["username"] }}
+ <a :href="`/users/${item.creator['id']}`"
+ >{{ item.creator["username"] }}
</a>
</template>
<template #[`item.additionalUser`]="{ item }">
<ul class="pl-0">
- <li
- v-for="user in additionalUsers(item)"
- :key="user.id"
- class="mb-2"
- >
- <a :href="`/users/${user['id']}`">{{ user["username"] }}
- </a>
+ <li v-for="user in additionalUsers(item)" :key="user.id" class="mb-2">
+ <a :href="`/users/${user['id']}`">{{ user["username"] }} </a>
</li>
</ul>
</template>
@@ -134,8 +130,7 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
:key="record.id"
class="my-2"
>
- <a :href="`/${record['id']}`">{{ record["name"] }}
- </a>
+ <a :href="`/${record['id']}`">{{ record["name"] }} </a>
</li>
</ul>
</template>
@@ -146,7 +141,8 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
:key="organisation.id"
class="my-2"
>
- <a :href="`/organisations/${organisation['id']}`">{{ organisation["name"] }}
+ <a :href="`/organisations/${organisation['id']}`"
+ >{{ organisation["name"] }}
</a>
</li>
</ul>
@@ -167,12 +163,7 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
mdi-link-off
</v-icon>
<!--User is on its account profile page-->
- <v-icon
- v-else
- @click="deleteItem(item)"
- >
- mdi-delete
- </v-icon>
+ <v-icon v-else @click="deleteItem(item)"> mdi-delete </v-icon>
</template>
<template #no-data>
<div>
@@ -182,10 +173,7 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
</template>
</v-data-table>
<!--Delete action dialog box -->
- <v-dialog
- v-model="modifyDialog"
- max-width="500px"
- >
+ <v-dialog v-model="modifyDialog" max-width="500px">
<!--Delete -->
<v-card v-if="deleteSavedSearch">
<v-card-title class="text-h5">
@@ -193,15 +181,11 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
</v-card-title>
<v-card-actions>
<v-spacer />
- <v-btn
- class="white--text"
- color="accent3"
- @click="closeDialog"
- >
+ <v-btn class="text-white" color="accent3" @click="closeDialog">
Cancel
</v-btn>
<v-btn
- class="white--text"
+ class="text-white"
color="success"
:loading="loading"
@click="deleteItemConfirm()"
@@ -218,15 +202,11 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
</v-card-title>
<v-card-actions>
<v-spacer />
- <v-btn
- class="white--text"
- color="accent3"
- @click="closeDialog"
- >
+ <v-btn class="text-white" color="accent3" @click="closeDialog">
Cancel
</v-btn>
<v-btn
- class="white--text"
+ class="text-white"
color="success"
:loading="loading"
@click="unlinkItemConfirm()"
@@ -253,7 +233,7 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
name: "ViewSavedSearchesTable",
props: {
createdSearches: { type: Array, default: null },
- savedSearches: { type: Array, default: null }
+ savedSearches: { type: Array, default: null },
},
data: () => {
return {
@@ -276,18 +256,43 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
...mapGetters("users", ["getUserRecords"]),
headers() {
let headers = [
- { text: "Creator", value: "creator", align: "center", sortable: false },
- { text: "Date", value: "date", align: "center", sortable: false },
- { text: "Name", value: "name", align: "center", sortable: false },
- { text: "Comments", value: "comments", align: "center", sortable: false },
- { text: "Record", value: "record", align: "center", sortable: false },
- { text: "Organisation", value: "organisation", align: "center", sortable: false },
+ {
+ title: "Creator",
+ value: "creator",
+ align: "center",
+ sortable: false,
+ },
+ { title: "Date", value: "date", align: "center", sortable: false },
+ { title: "Name", value: "name", align: "center", sortable: false },
+ {
+ title: "Comments",
+ value: "comments",
+ align: "center",
+ sortable: false,
+ },
+ { title: "Record", value: "record", align: "center", sortable: false },
+ {
+ title: "Organisation",
+ value: "organisation",
+ align: "center",
+ sortable: false,
+ },
];
if (this.user().isLoggedIn) {
- headers.push({ text: "Actions", value: "actions", align: "center", sortable: false },)
+ headers.push({
+ text: "Actions",
+ value: "actions",
+ align: "center",
+ sortable: false,
+ });
}
- if(this.user().is_super_curator) {
- headers.splice(1,0, { text: "Additional User", value: "additionalUser", align: "center", sortable: false },)
+ if (this.user().is_super_curator) {
+ headers.splice(1, 0, {
+ text: "Additional User",
+ value: "additionalUser",
+ align: "center",
+ sortable: false,
+ });
}
return headers;
},
@@ -304,21 +309,19 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
* page
*/
async combinedSearches(searchDeleted, searchUnlinked) {
- let createdSearches, savedSearches
+ let createdSearches, savedSearches;
if (searchDeleted) {
await this.getUser();
createdSearches = this.getUserRecords.user["createdSearches"];
savedSearches = this.getUserRecords.user["savedSearches"];
- }
- else if (searchUnlinked) {
+ } else if (searchUnlinked) {
let userId = this.$route.params.id;
let userR = await this.getPublicUser(userId);
await this.getUser();
createdSearches = userR.user["createdSearches"];
savedSearches = userR.user["savedSearches"];
- }
- else {
+ } else {
createdSearches = this.createdSearches;
savedSearches = this.savedSearches;
}
@@ -330,10 +333,9 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
}
//Reversed array to show latest entry first
let searchValues = [...mapSearches.values()];
- this.totalSearches = searchValues.sort((a, b) => new Date(b.createdAt)
- - new Date(a.createdAt)
+ this.totalSearches = searchValues.sort(
+ (a, b) => new Date(b.createdAt) - new Date(a.createdAt),
);
-
},
/**
@@ -355,7 +357,7 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
this.loading = true;
let data = await restClient.deleteSavedSearch(
this.selectedItem["id"],
- this.user().credentials.token
+ this.user().credentials.token,
);
if (data["message"] === "success") {
@@ -383,22 +385,24 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
*/
async unlinkItemConfirm() {
this.loading = true;
- let additionalUsersArr = this.additionalUsers(this.selectedItem)
+ let additionalUsersArr = this.additionalUsers(this.selectedItem);
//Filter the user to unlink
- let linkedUser = additionalUsersArr.filter(({id}) => id !== Number(this.$route.params.id))
+ let linkedUser = additionalUsersArr.filter(
+ ({ id }) => id !== Number(this.$route.params.id),
+ );
//Array of id of the remaining users
- linkedUser = linkedUser.map(({id}) => id)
+ linkedUser = linkedUser.map(({ id }) => id);
let saveSearchObj = {
user_ids: linkedUser,
};
let updatedSearchResult = await restClient.updateSaveSearch(
- this.selectedItem["id"],
- saveSearchObj,
- this.user().credentials.token
+ this.selectedItem["id"],
+ saveSearchObj,
+ this.user().credentials.token,
);
//Commit the updated result to store
@@ -409,7 +413,6 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
this.loading = false;
this.unlinkSavedSearch = false;
this.closeDialog();
-
},
/**
@@ -424,7 +427,7 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
openAdvancedSearch() {
advancedSearch.commit(
"advancedSearch/setAdvancedSearchDialogStatus",
- true
+ true,
);
},
/**
@@ -433,30 +436,30 @@ Source: components/Users/Profiles/Private/ViewSavedSearch
* @return {Array} - additional user list without creator
*/
additionalUsers(item) {
- let additionalUsersList = item["users"].filter((e) => {
- return e['id'] !== item.creator['id']
- })
+ let additionalUsersList = item["users"].filter((e) => {
+ return e["id"] !== item.creator["id"];
+ });
return additionalUsersList;
},
-
},
};
</script>
<style lang="scss" scoped>
-@import '~vuetify/src/styles/settings/_variables.scss';
-.userProfileSavedSearches::v-deep {
+@use "sass:map";
+@use "vuetify/settings" as v;
+.userProfileSavedSearches:deep(*) {
table {
tbody {
tr {
- td {
- word-break: break-all;
- @media #{map-get($display-breakpoints, 'md-and-up')} {
- width: 100px;
- min-width: 100px;
- max-width: 100px;
- }
+ td {
+ word-break: break-all;
+ @media #{map.get(v.$display-breakpoints, 'md-and-up')} {
+ width: 100px;
+ min-width: 100px;
+ max-width: 100px;
}
+ }
}
}
}
@@ -507,7 +510,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/global.html b/documentation/html/global.html
index a0e20509bf..392ed0bf5d 100644
--- a/documentation/html/global.html
+++ b/documentation/html/global.html
@@ -215,7 +215,7 @@ <constant> buildFace
@@ -285,7 +285,7 @@ <constant> buildFil
@@ -367,7 +367,7 @@ Type:
@@ -448,7 +448,7 @@ Type:
@@ -518,7 +518,7 @@ <constant> para
@@ -599,7 +599,7 @@ Type:
@@ -751,7 +751,7 @@ Type:
@@ -905,7 +905,7 @@ Properties:
@@ -988,7 +988,7 @@ hackSearch(
@@ -1245,7 +1245,7 @@ isAllowe
@@ -1353,7 +1353,7 @@ isBluesky()<
@@ -1569,7 +1569,7 @@ isEmailOr
@@ -1677,7 +1677,7 @@ isImage()
@@ -1835,7 +1835,7 @@ Parameters:
@@ -1943,7 +1943,7 @@ isMastodon(
@@ -2051,7 +2051,7 @@ isOrcid()
@@ -2159,7 +2159,7 @@ isRequired(
@@ -2267,7 +2267,7 @@ isUrl()
@@ -2449,7 +2449,7 @@ Parameters:
@@ -2859,7 +2859,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/index.html b/documentation/html/index.html
index bc3ad990af..7fc292aeb6 100644
--- a/documentation/html/index.html
+++ b/documentation/html/index.html
@@ -175,7 +175,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/lib_Client_ExternalClients.js.html b/documentation/html/lib_Client_ExternalClients.js.html
index dacb13b83b..01a6d49517 100644
--- a/documentation/html/lib_Client_ExternalClients.js.html
+++ b/documentation/html/lib_Client_ExternalClients.js.html
@@ -91,95 +91,95 @@ Source: lib/Client/ExternalClients.js
import axios from "axios"
+ class="sunlight-highlight-javascript linenums">import axios from "axios";
class ExternalRESTClients {
-
- /**
- * The RESTClient is a singleton class that handles the connection and data exchange from the back-end
- * REST API.
- */
- constructor() {
- if (ExternalRESTClients._instance) {
- return ExternalRESTClients._instance
- }
- ExternalRESTClients._instance = this;
- this.doiBaseURL = 'https://dx.doi.org/';
- this.headers = {
- 'Accept': 'application/x-bibtex',
- };
- this.pmidBaseURL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&retmode=json&id=";
- this.tessBaseURL = "https://tess.elixir-europe.org/materials.json?q=";
- this.orcidBaseURL = "https://pub.orcid.org/v2.0/";
- this.rorOrganisationsBaseURL = "https://api.ror.org/v2/organizations?query=";
- }
-
- async getDOI(doi){
- let localHeaders = this.headers;
- localHeaders['Accept'] = 'application/json';
- const request = {
- url: this.doiBaseURL + doi,
- headers: localHeaders
- };
- let response = await this.executeQuery(request);
- return response.data;
- }
-
- async getPMID(id){
- const request = {
- url: this.pmidBaseURL + id,
- headers: {
- 'Accept': 'application/json',
- }
- };
- let response = await this.executeQuery(request);
- return response.data;
- }
-
- async getTessRecords(string){
- const request = {
- url: this.tessBaseURL + string,
- headers: this.headers
- };
- let response = await this.executeQuery(request);
- return response.data;
- }
-
- async getOrcidUser(user){
- this.headers['Accept'] = "application/orcid+json";
- const request = {
- url: this.orcidBaseURL + user,
- headers: this.headers
- };
- let response = await this.executeQuery(request);
- this.headers['Accept'] = 'application/x-bibtex';
- return response.data;
+ /**
+ * The RESTClient is a singleton class that handles the connection and data exchange from the back-end
+ * REST API.
+ */
+ constructor() {
+ if (ExternalRESTClients._instance) {
+ return ExternalRESTClients._instance;
}
-
- async getROROrganisation(organisation){
- let localHeaders = this.headers;
- localHeaders['Accept'] = 'application/json';
- const request = {
- url: this.rorOrganisationsBaseURL + organisation,
- headers: localHeaders
- };
- let response = await this.executeQuery(request);
- return response.data;
- }
-
- /**
- * Trigger the given query with Axios
- * @param query
- * @returns {Promise<*>}
- */
- async executeQuery(query) {
- try {
- return await axios.get(query.url, {headers: query.headers});
- }
- catch(e){
- return({data: {error: e}});
- }
+ ExternalRESTClients._instance = this;
+ this.doiBaseURL = "https://dx.doi.org/";
+ this.headers = {
+ Accept: "application/x-bibtex",
+ };
+ this.pmidBaseURL =
+ "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&retmode=json&id=";
+ this.tessBaseURL = "https://tess.elixir-europe.org/materials.json?q=";
+ this.orcidBaseURL = "https://pub.orcid.org/v2.0/";
+ this.rorOrganisationsBaseURL =
+ "https://api.ror.org/v2/organizations?query=";
+ }
+
+ async getDOI(doi) {
+ let localHeaders = this.headers;
+ localHeaders["Accept"] = "application/json";
+ const request = {
+ url: this.doiBaseURL + doi,
+ headers: localHeaders,
+ };
+ let response = await this.executeQuery(request);
+ return response.data;
+ }
+
+ async getPMID(id) {
+ const request = {
+ url: this.pmidBaseURL + id,
+ headers: {
+ Accept: "application/json",
+ },
+ };
+ let response = await this.executeQuery(request);
+ return response.data;
+ }
+
+ async getTessRecords(string) {
+ const request = {
+ url: this.tessBaseURL + string,
+ headers: this.headers,
+ };
+ let response = await this.executeQuery(request);
+ return response.data;
+ }
+
+ async getOrcidUser(user) {
+ this.headers["Accept"] = "application/orcid+json";
+ const request = {
+ url: this.orcidBaseURL + user,
+ headers: this.headers,
+ };
+ let response = await this.executeQuery(request);
+ this.headers["Accept"] = "application/x-bibtex";
+ return response.data;
+ }
+
+ async getROROrganisation(organisation) {
+ let localHeaders = this.headers;
+ localHeaders["Accept"] = "application/json";
+ const request = {
+ url: this.rorOrganisationsBaseURL + organisation,
+ headers: localHeaders,
+ };
+ let response = await this.executeQuery(request);
+ return response.data;
+ }
+
+ /**
+ * Trigger the given query with Axios
+ * @param query
+ * @returns {Promise<*>}
+ */
+ async executeQuery(query) {
+ try {
+ return await axios.get(query.url, { headers: query.headers });
+ } catch (e) {
+ return { data: { error: e } };
}
+ }
}
export default ExternalRESTClients;
@@ -228,7 +228,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/lib_Client_RESTClient.js.html b/documentation/html/lib_Client_RESTClient.js.html
index 1946e81253..4e5ebb8823 100644
--- a/documentation/html/lib_Client_RESTClient.js.html
+++ b/documentation/html/lib_Client_RESTClient.js.html
@@ -104,13 +104,13 @@ Source: lib/Client/RESTClient.js
return RESTClient._instance;
}
RESTClient._instance = this;
- this.baseURL = process.env.VUE_APP_API_ENDPOINT;
+ this.baseURL = import.meta.env.VITE_API_ENDPOINT;
this.headers = {
Accept: "application/json",
"Content-Type": "application/json",
"Cache-Control": "no-cache",
};
- this.headers["X-Client-Id"] = process.env.VUE_APP_CLIENT_ID;
+ this.headers["X-Client-Id"] = import.meta.env.VITE_CLIENT_ID;
}
/* USERS: all methods below related to handling user authentication */
@@ -851,7 +851,7 @@ Source: lib/Client/RESTClient.js
async updateStatusMaintenanceRequest(
maintenanceRequest,
newStatus,
- userToken
+ userToken,
) {
let _client = this;
const request = {
@@ -1230,7 +1230,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/lib_GraphClient_GraphClient.js.html b/documentation/html/lib_GraphClient_GraphClient.js.html
index edccc3019a..19e434827e 100644
--- a/documentation/html/lib_GraphClient_GraphClient.js.html
+++ b/documentation/html/lib_GraphClient_GraphClient.js.html
@@ -91,8 +91,7 @@ Source: lib/GraphClient/GraphClient.js
const axios = require("axios");
-
+ class="sunlight-highlight-javascript linenums">import axios from "axios";
import Fragments from "./queries/fragments/fragments.json";
class GraphQLClient {
@@ -107,7 +106,7 @@ Source: lib/GraphClient/GraphClient.js
return GraphQLClient._instance;
}
GraphQLClient._instance = this;
- this.url = process.env.VUE_APP_API_ENDPOINT + "/graphql";
+ this.url = import.meta.env.VITE_API_ENDPOINT + "/graphql";
}
/**
@@ -232,7 +231,7 @@ Source: lib/GraphClient/GraphClient.js
Accept: "application/json",
"Content-Type": "application/json",
};
- this.headers["X-Client-Id"] = process.env.VUE_APP_CLIENT_ID;
+ this.headers["X-Client-Id"] = import.meta.env.VITE_CLIENT_ID;
/* istanbul ignore if */
if (this.headers["X-Client-Id"] === undefined) {
delete this.headers["X-Client-Id"];
@@ -286,7 +285,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/module-Home.html b/documentation/html/module-Home.html
index 2f7787c54a..d0beaeed69 100644
--- a/documentation/html/module-Home.html
+++ b/documentation/html/module-Home.html
@@ -220,7 +220,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/module-Login.html b/documentation/html/module-Login.html
index ee8303dea7..607c14e729 100644
--- a/documentation/html/module-Login.html
+++ b/documentation/html/module-Login.html
@@ -220,7 +220,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/module-NewRecord.html b/documentation/html/module-NewRecord.html
index 0ce36f2676..9133b76365 100644
--- a/documentation/html/module-NewRecord.html
+++ b/documentation/html/module-NewRecord.html
@@ -220,7 +220,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/module-Pagination.html b/documentation/html/module-Pagination.html
index ad80900ee5..ad2532d6cd 100644
--- a/documentation/html/module-Pagination.html
+++ b/documentation/html/module-Pagination.html
@@ -306,7 +306,7 @@ Parameters:
@@ -444,7 +444,7 @@ Parameters:
@@ -527,7 +527,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/module-Signup.html b/documentation/html/module-Signup.html
index fae0b818eb..bd2fa5012f 100644
--- a/documentation/html/module-Signup.html
+++ b/documentation/html/module-Signup.html
@@ -220,7 +220,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/module-User.html b/documentation/html/module-User.html
index e589887297..471322d048 100644
--- a/documentation/html/module-User.html
+++ b/documentation/html/module-User.html
@@ -228,7 +228,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/modules.list.html b/documentation/html/modules.list.html
index b8a77b2a13..7a1765751f 100644
--- a/documentation/html/modules.list.html
+++ b/documentation/html/modules.list.html
@@ -235,7 +235,7 @@ <constant> buildFace
@@ -305,7 +305,7 @@ <constant> buildFil
@@ -387,7 +387,7 @@ Type:
@@ -468,7 +468,7 @@ Type:
@@ -538,7 +538,7 @@ <constant> para
@@ -619,7 +619,7 @@ Type:
@@ -771,7 +771,7 @@ Type:
@@ -925,7 +925,7 @@ Properties:
@@ -1008,7 +1008,7 @@ hackSearch(
@@ -1265,7 +1265,7 @@ isAllowe
@@ -1373,7 +1373,7 @@ isBluesky()<
@@ -1589,7 +1589,7 @@ isEmailOr
@@ -1697,7 +1697,7 @@ isImage()
@@ -1855,7 +1855,7 @@ Parameters:
@@ -1963,7 +1963,7 @@ isMastodon(
@@ -2071,7 +2071,7 @@ isOrcid()
@@ -2179,7 +2179,7 @@ isRequired(
@@ -2287,7 +2287,7 @@ isUrl()
@@ -2469,7 +2469,7 @@ Parameters:
@@ -2879,7 +2879,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/namespaces.list.html b/documentation/html/namespaces.list.html
index 00d27f4ca2..f0a0a68821 100644
--- a/documentation/html/namespaces.list.html
+++ b/documentation/html/namespaces.list.html
@@ -235,7 +235,7 @@ <constant> buildFace
@@ -305,7 +305,7 @@ <constant> buildFil
@@ -387,7 +387,7 @@ Type:
@@ -468,7 +468,7 @@ Type:
@@ -538,7 +538,7 @@ <constant> para
@@ -619,7 +619,7 @@ Type:
@@ -771,7 +771,7 @@ Type:
@@ -925,7 +925,7 @@ Properties:
@@ -1008,7 +1008,7 @@ hackSearch(
@@ -1265,7 +1265,7 @@ isAllowe
@@ -1373,7 +1373,7 @@ isBluesky()<
@@ -1589,7 +1589,7 @@ isEmailOr
@@ -1697,7 +1697,7 @@ isImage()
@@ -1855,7 +1855,7 @@ Parameters:
@@ -1963,7 +1963,7 @@ isMastodon(
@@ -2071,7 +2071,7 @@ isOrcid()
@@ -2179,7 +2179,7 @@ isRequired(
@@ -2287,7 +2287,7 @@ isUrl()
@@ -2469,7 +2469,7 @@ Parameters:
@@ -2879,7 +2879,7 @@ Search results
Documentation generated by JSDoc 4.0.5
- on Fri Mar 20th 2026
+ on Fri Apr 10th 2026
using the DocStrap template .
diff --git a/documentation/html/quicksearch.html b/documentation/html/quicksearch.html
index a762ecfa85..abeafebd9a 100644
--- a/documentation/html/quicksearch.html
+++ b/documentation/html/quicksearch.html
@@ -7,7 +7,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Source: views/Browsers/OntologyBrowser.vue
+
+
+
+ <template>
+ <main>
+ <v-container class="py-0 mb-10" fluid>
+ <NotFound v-if="error" />
+ <v-row v-else no-gutters>
+ <v-col
+ id="ontologyBrowser"
+ class="border-e"
+ cols="12"
+ lg="4"
+ md="12"
+ sm="12"
+ xl="3"
+ xs="12"
+ >
+ <div v-if="tree.length > 0" id="searchOntology" class="pr-2 mt-6">
+ <v-autocomplete
+ v-model="search"
+ :color="color"
+ :items="uniqueSearchItems"
+ :label="`Search ${selectedOntology}s`"
+ clearable
+ hide-details
+ item-title="name"
+ item-value="id"
+ return-object
+ variant="outlined"
+ />
+ <v-divider class="mb-2 opacity-100" />
+ </div>
+
+ <v-virtual-scroll
+ ref="virtualScroll"
+ :height="'70vh'"
+ :items="visibleNodes"
+ class="tree pb-3 px-3"
+ >
+ <template #default="{ item }">
+ <div
+ :style="{ paddingLeft: `${item.depth * 24}px` }"
+ class="d-flex align-center py-1 cursor-pointer hover-bg"
+ >
+ <div class="d-flex justify-center" style="width: 24px">
+ <v-icon
+ v-if="item.hasChildren"
+ :icon="
+ isOpen(item.identifier)
+ ? 'fas fa-caret-down'
+ : 'fas fa-caret-right'
+ "
+ size="small"
+ @click="toggleNode(item)"
+ />
+ </div>
+
+ <div
+ class="d-flex flex-row justify-center align-center flex-grow-1"
+ @click="searchTerm(item)"
+ >
+ <span
+ :class="[
+ 'chip-mimic mr-2',
+ item.isTarget || activeTerms.includes(item.identifier)
+ ? `bg-${color} text-white font-weight-bold elevation-2 border-0`
+ : `text-${color} border-${color}`,
+ ]"
+ >
+ {{ item.name }}
+ </span>
+
+ <v-spacer />
+
+ <div
+ :class="
+ activeTerms.includes(item.identifier)
+ ? `bg-${color} text-white`
+ : `bg-white text-${color} border-${color} border border-solid border-opacity-100`
+ "
+ class="hits d-flex justify-center align-center"
+ >
+ {{ item.records_count || 0 }}
+ </div>
+ </div>
+ </div>
+ </template>
+ </v-virtual-scroll>
+ </v-col>
+
+ <v-col
+ id="termDisplay"
+ class="py-0 my-0"
+ cols="12"
+ lg="8"
+ md="12"
+ sm="12"
+ xl="9"
+ xs="12"
+ >
+ <div v-if="!loadingData && tree.length > 0">
+ <TermDetails
+ v-if="records && selectedTerm"
+ :selected-ontology="selectedOntology"
+ @clear-selection="noSelection"
+ />
+ <v-card v-else class="pa-0" flat>
+ <v-card-text class="pa-0">
+ <OntologySunburst @subject-node="subjectNode" />
+ </v-card-text>
+ </v-card>
+ </div>
+ </v-col>
+ </v-row>
+ </v-container>
+
+ <v-fade-transition>
+ <div>
+ <v-overlay
+ v-model="loadingData"
+ :absolute="false"
+ class="align-center justify-center"
+ opacity="0.8"
+ >
+ <Loaders />
+ </v-overlay>
+ </div>
+ </v-fade-transition>
+ </main>
+</template>
+
+<script>
+import { mapActions, mapState } from "vuex";
+import Loaders from "@/components/Navigation/Loaders";
+import OntologySunburst from "@/components/Ontologies/OntologySunburst";
+import TermDetails from "@/components/Ontologies/TermDetails";
+import NotFound from "@/views/Errors/404";
+
+export default {
+ name: "OntologyBrowser",
+ components: { Loaders, NotFound, TermDetails, OntologySunburst },
+ data() {
+ return {
+ allowedOntologies: ["domain", "subject"],
+ search: null,
+ };
+ },
+ computed: {
+ ...mapState("editor", ["colors"]),
+ // We do NOT map activeTerms/openedTerms directly to avoid undefined errors
+ ...mapState("ontologyBrowser", [
+ "tree",
+ "records",
+ "loadingData",
+ "flattenedTree",
+ "pagination",
+ "selectedTerm",
+ ]),
+
+ selectedOntology() {
+ return this.$route.params.id;
+ },
+ error() {
+ return !this.allowedOntologies.includes(this.selectedOntology);
+ },
+ color() {
+ return this.colors[this.selectedOntology];
+ },
+ term() {
+ const qTerm = this.$route.query["term"];
+ if (!qTerm) return null;
+ return this.flattenedTree.find(
+ (node) =>
+ node.name.toLowerCase() === decodeURIComponent(qTerm).toLowerCase(),
+ );
+ },
+ // Manual State mapping with Safety Checks
+ activeTerms() {
+ return this.$store.state.ontologyBrowser.activeTerms || [];
+ },
+ openedTerms() {
+ return this.$store.state.ontologyBrowser.openedTerms || [];
+ },
+
+ /**
+ * VISIBLE NODES
+ * Combines Pruning (Search) + Flattening (Expansion)
+ */
+ visibleNodes() {
+ let sourceTree = this.tree || [];
+
+ // 1. If Searching, use a Pruned Tree (Supports Multiple Instances)
+ if (this.search && this.search.identifier) {
+ const pruned = this.pruneTreeWithChildren(
+ this.tree,
+ this.search.identifier,
+ );
+ if (pruned.length > 0) sourceTree = pruned;
+ }
+
+ const result = [];
+ const searchId = this.search?.identifier
+ ? String(this.search.identifier)
+ : null;
+
+ // Safety: Ensure we have an array of Strings for comparison
+ const currentOpenTerms = (this.openedTerms || []).map(String);
+
+ const traverse = (nodes, depth = 0) => {
+ if (!nodes || nodes.length === 0) return;
+
+ for (const node of nodes) {
+ const hasChildren = node.children && node.children.length > 0;
+ const strId = String(node.identifier);
+ const isTarget = strId === searchId;
+
+ // Check if this node is Open
+ const isOpen = currentOpenTerms.includes(strId);
+
+ result.push({
+ ...node,
+ depth,
+ hasChildren,
+ isTarget,
+ });
+
+ // Expand logic:
+ // We only descend if the node has children AND is marked as Open
+ if (hasChildren && isOpen) {
+ traverse(node.children, depth + 1);
+ }
+ }
+ };
+
+ traverse(sourceTree);
+ return result;
+ },
+
+ /**
+ * UNIQUE SEARCH ITEMS
+ * Filters the flattenedTree to ensure each term ID appears only once
+ * in the Autocomplete dropdown.
+ */
+ uniqueSearchItems() {
+ const items = this.flattenedTree || [];
+ const seen = new Set();
+
+ return items.filter((item) => {
+ const id = item.identifier;
+ if (seen.has(id)) {
+ return false; // Duplicate found, skip it
+ }
+ seen.add(id);
+ return true; // New item, keep it
+ });
+ },
+ },
+ watch: {
+ // URL Term Watcher
+ async term(newVal) {
+ if (newVal) {
+ await this.activateTerms(newVal);
+
+ // Find ALL paths to this term (in case it exists in multiple places)
+ const allPaths = this.findAllPaths(this.tree, newVal.identifier);
+ const parentsToOpen = new Set();
+
+ allPaths.forEach((path) => {
+ path.forEach((id) => {
+ if (String(id) !== String(newVal.identifier)) {
+ parentsToOpen.add(String(id));
+ }
+ });
+ });
+
+ this.openTerms(Array.from(parentsToOpen));
+ } else {
+ await this.activateTerms();
+ }
+ },
+
+ // --- SEARCH WATCHER (Handles Multiple Instances) ---
+ search(newTerm) {
+ // CASE 1: Search Cleared
+ if (!newTerm) {
+ // Reset to full tree by clearing the "open" list
+ this.openTerms([]);
+ return;
+ }
+ // CASE 2: Active Search
+ const targetId = newTerm.identifier || newTerm;
+ const strTargetId = String(targetId);
+ // 1. Find ALL paths to the target node
+ const allPaths = this.findAllPaths(this.tree, targetId);
+
+ // 2. Collect ALL parent IDs from ALL paths
+ const allIdsToOpen = new Set();
+
+ allPaths.forEach((path) => {
+ path.forEach((id) => {
+ // Add ID to open set ONLY if it is NOT the target itself
+ // (We want the parents open, but the target closed)
+ if (
+ String(id) !== strTargetId &&
+ !Object.keys(newTerm).includes("isSunburst")
+ ) {
+ allIdsToOpen.add(String(id));
+ }
+ //Target is open because the selection is from Sunburst
+ else if (newTerm["isSunburst"]) {
+ allIdsToOpen.add(String(id));
+ }
+ });
+ });
+
+ // 3. Update Vuex State
+ this.openTerms(Array.from(allIdsToOpen));
+
+ // 4. Scroll to FIRST Instance
+ setTimeout(() => {
+ if (!this.$refs.virtualScroll) return;
+
+ // Find index of the FIRST occurrence in the visible list
+ const index = this.visibleNodes.findIndex(
+ (x) => String(x.identifier) === strTargetId,
+ );
+
+ if (index !== -1) {
+ if (this.$refs.virtualScroll.scrollToIndex) {
+ this.$refs.virtualScroll.scrollToIndex(index);
+ } else {
+ // Fallback: 50px is the estimated item height
+ this.$refs.virtualScroll.$el.scrollTop = index * 50;
+ }
+ }
+ }, 300);
+ },
+ },
+ async mounted() {
+ await this.fetchTerms();
+ },
+ unmounted() {
+ this.leavePage();
+ },
+ methods: {
+ ...mapActions("ontologyBrowser", [
+ "fetchTerms",
+ "fetchRecords",
+ "resetPagination",
+ "activateTerms",
+ "openTerms",
+ "leavePage",
+ ]),
+
+ /**
+ * Searches for a term and updates the route based on its presence in the active terms list.
+ *
+ * @param {Object} term - The term object to be searched.
+ * @param {string} term.identifier - The unique identifier of the term.
+ * @param {string} term.name - The name of the term to encode and include in the query parameters if not already active.
+ * @return {void} This method does not return a value.
+ */
+ searchTerm(term) {
+ this.resetPagination();
+ if (this.activeTerms.includes(term.identifier))
+ this.$router.push({ path: this.$route.path });
+ else
+ this.$router.push({
+ path: this.$route.path,
+ query: { term: encodeURIComponent(term.name) },
+ });
+ },
+
+ // --- UPDATED HELPER: Find ALL Paths ---
+ // Returns Array of Arrays: [[Root, Child, Target], [Root, OtherChild, Target]]
+ findAllPaths(nodes, targetId, currentPath = [], results = []) {
+ const strTarget = String(targetId);
+
+ for (const node of nodes) {
+ const strNode = String(node.identifier);
+
+ // Create a new path array for this branch
+ const newPath = [...currentPath, node.identifier];
+
+ // Match Found: Add this full path to results
+ if (strNode === strTarget) {
+ results.push(newPath);
+ }
+
+ // Continue searching deeper even if match found (in case of nested weirdness),
+ // but primarily to find matches in OTHER branches.
+ if (node.children && node.children.length > 0) {
+ this.findAllPaths(node.children, targetId, newPath, results);
+ }
+ }
+
+ return results;
+ },
+
+ /**
+ * Toggles the open or closed state of a node in the hierarchy.
+ * Updates the list of currently opened nodes based on the given item's identifier.
+ *
+ * @param {Object} item - The node object to be toggled.
+ * @param {boolean} item.hasChildren - Indicates if the node has child items.
+ * @param {number|string} item.identifier - The unique identifier of the node.
+ * @return {void} This method does not return a value.
+ */
+ toggleNode(item) {
+ if (!item.hasChildren) return;
+
+ const strId = String(item.identifier);
+ const currentOpenTerms = (this.openedTerms || []).map(String);
+ const isOpen = currentOpenTerms.includes(strId);
+
+ let newOpened = [...(this.openedTerms || [])];
+
+ if (isOpen) {
+ // Close: Remove strict match
+ newOpened = newOpened.filter((id) => String(id) !== strId);
+ } else {
+ // Open: Add original ID
+ newOpened.push(item.identifier);
+ }
+ newOpened = newOpened.map((item) =>
+ typeof item === "string" ? Number(item) : item,
+ );
+ this.openTerms(newOpened);
+ },
+
+ /**
+ * Prune logic that supports multiple matches
+ * @param nodes
+ * @param targetId
+ * @return Array
+ */
+ pruneTreeWithChildren(nodes, targetId) {
+ const filtered = [];
+ const strTarget = String(targetId);
+
+ for (const node of nodes) {
+ const strNode = String(node.identifier);
+
+ // CASE 1: Found the target
+ if (strNode === strTarget) {
+ filtered.push({
+ ...node,
+ children: node.children ? [...node.children] : [],
+ });
+ // We do NOT 'continue' here because a child might ALSO contain the target
+ // (unlikely in standard ontology but possible in graph structures)
+ // Actually, for standard tree display, if we found it, we show it.
+ // If the term appears AGAIN inside itself, recursion handles it.
+ continue;
+ }
+
+ // CASE 2: Look in children
+ if (node.children && node.children.length > 0) {
+ const matchingChildren = this.pruneTreeWithChildren(
+ node.children,
+ targetId,
+ );
+ if (matchingChildren.length > 0) {
+ filtered.push({ ...node, children: matchingChildren });
+ }
+ }
+ }
+ return filtered;
+ },
+
+ /**
+ * SAFE CHECK: Checks if a node is open regardless of ID type (String/Number)
+ * @param identifier
+ * @return Boolean
+ */
+ isOpen(identifier) {
+ if (!this.openedTerms) return false;
+ // Convert everything to String for comparison
+ return this.openedTerms.map(String).includes(String(identifier));
+ },
+
+ /**
+ * Updates the search property with the first element of the provided value array
+ * and calls the toggleNode method with the same element.
+ * @param {Array} value - An array where the first element is used to update the search property and passed to the toggleNode method.
+ */
+ subjectNode(value) {
+ if (value && value.length) {
+ this.search = value[0];
+ this.toggleNode(value[0]);
+ } else {
+ this.search = null;
+ }
+ },
+
+ noSelection(value) {
+ if (value) {
+ this.search = null;
+ }
+ },
+ },
+};
+</script>
+
+<style lang="scss" scoped>
+.subject_color--border {
+ border: 1px solid #e67e22 !important;
+}
+
+.domain_color--border {
+ border: 1px solid #712727 !important;
+}
+
+.hits {
+ width: 45px;
+ height: 45px;
+ border-radius: 50%;
+}
+
+#ontologyBrowser,
+#termDisplay {
+ display: flex;
+ flex-direction: column;
+}
+
+.tree {
+ /* overflow-y handled by virtual-scroll, but we keep this for flex layout */
+ flex-grow: 1;
+ height: 70vh;
+}
+
+@media (max-width: 1263px) {
+ #ontologyBrowser {
+ height: auto;
+ }
+ .tree {
+ max-height: 40vh;
+ border-bottom: 1px solid #ccc;
+ }
+}
+
+.col {
+ flex-basis: initial !important;
+}
+
+.cursor-pointer {
+ cursor: pointer !important;
+}
+
+.hover-bg:hover {
+ background-color: rgba(0, 0, 0, 0.04);
+}
+
+.chip-mimic {
+ border: 1px solid;
+ border-radius: 18px;
+ padding: 4px 12px;
+ font-size: 0.9rem;
+ line-height: 1.8;
+ display: inline-block;
+ white-space: nowrap;
+}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DocStrap Copyright © 2012-2015 The contributors to the JSDoc3 and DocStrap projects.
+
+
+
+ Documentation generated by JSDoc 4.0.5
+
+ on Fri Apr 10th 2026
+
+ using the DocStrap template .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+