|
|
@@ -23,7 +23,6 @@ Champs autocomplete dédié à la recherche des Accesses d'une structure
|
|
|
:variant="variant"
|
|
|
:readonly="readonly"
|
|
|
:clearable="true"
|
|
|
- :class="pending || pageStore.loading ? 'hide-selection' : ''"
|
|
|
@update:model-value="onUpdateModelValue"
|
|
|
@update:search="onUpdateSearch"
|
|
|
/>
|
|
|
@@ -44,11 +43,17 @@ import SearchFilter from '~/services/data/Filters/SearchFilter'
|
|
|
import type ApiModel from "~/models/ApiModel";
|
|
|
|
|
|
const props = defineProps({
|
|
|
+ /**
|
|
|
+ * Valeur actives (tableau si multiple ou ID seule si choix unique)
|
|
|
+ */
|
|
|
modelValue: {
|
|
|
type: [Array, Number],
|
|
|
required: false,
|
|
|
default: null,
|
|
|
},
|
|
|
+ /**
|
|
|
+ * API Resource qui sera fetch
|
|
|
+ */
|
|
|
model: {
|
|
|
type: Function as PropType<() => typeof ApiModel>,
|
|
|
required: true,
|
|
|
@@ -155,32 +160,36 @@ interface ListItem {
|
|
|
|
|
|
const { fetchCollection } = useEntityFetch()
|
|
|
const i18n = useI18n()
|
|
|
-const pageStore = usePageStore()
|
|
|
+
|
|
|
+
|
|
|
+const activeIds = computed(() => {
|
|
|
+ if (Array.isArray(props.modelValue)) {
|
|
|
+ return props.modelValue
|
|
|
+ }
|
|
|
+ if (props.modelValue !== null && typeof props.modelValue === 'object') {
|
|
|
+ return [props.modelValue]
|
|
|
+ }
|
|
|
+ return []
|
|
|
+})
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
- * Génère un AccessListItem à partir d'un Access
|
|
|
- * @param searchItem
|
|
|
+ * Query transmise à l'API lors de l'initialisation afin de récupérer les items actifs
|
|
|
*/
|
|
|
-const item = (searchItem: any): ListItem => {
|
|
|
- return {
|
|
|
- id: searchItem[props.listValue],
|
|
|
- title: searchItem[props.listLabel]
|
|
|
- ? searchItem[props.listLabel]
|
|
|
- : `(${i18n.t('missing_value')})`,
|
|
|
- }
|
|
|
-}
|
|
|
const queryActive = new Query(
|
|
|
- new OrderBy(props.listLabel, ORDER_BY_DIRECTION.ASC),
|
|
|
- new PageFilter(ref(1), ref(20)),
|
|
|
- new InArrayFilter(props.listValue, [props.modelValue]),
|
|
|
-)
|
|
|
+ new OrderBy(props.listLabel, ORDER_BY_DIRECTION.ASC),
|
|
|
+ new PageFilter(ref(1), ref(20)),
|
|
|
+ new InArrayFilter(props.listValue, activeIds),
|
|
|
+ )
|
|
|
|
|
|
+/**
|
|
|
+ * On commence par fetcher les models déjà actifs, pour affichage des labels correspondant
|
|
|
+ */
|
|
|
const {
|
|
|
data: collectionActive,
|
|
|
status: statusActive
|
|
|
} = fetchCollection(props.model, null, queryActive)
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* Saisie de l'utilisateur utilisée pour filtrer la recherche
|
|
|
*/
|
|
|
@@ -194,9 +203,8 @@ const querySearch = new Query(
|
|
|
new PageFilter(ref(1), ref(20)),
|
|
|
new SearchFilter(props.listLabel, searchFilter, SEARCH_STRATEGY.IPARTIAL),
|
|
|
)
|
|
|
-
|
|
|
/**
|
|
|
- * On commence par fetcher les accesses déjà actifs, pour affichage des noms
|
|
|
+ * On fetch les résultats correspondants à la recherche faite par l'utilisateur
|
|
|
*/
|
|
|
const {
|
|
|
data: collectionSearch,
|
|
|
@@ -204,10 +212,24 @@ const {
|
|
|
refresh: refreshSearch,
|
|
|
} = fetchCollection(props.model, null, querySearch)
|
|
|
|
|
|
+//Le pending global dépend des deux recherche (actif, et globale)
|
|
|
const pending = computed(() => statusSearch.value == FETCHING_STATUS.PENDING || statusActive.value == FETCHING_STATUS.PENDING)
|
|
|
|
|
|
/**
|
|
|
- * Contenu de la liste autocomplete
|
|
|
+ * Génère un ListItem à partir des props
|
|
|
+ * @param searchItem
|
|
|
+ */
|
|
|
+const item = (searchItem: any): ListItem => {
|
|
|
+ return {
|
|
|
+ id: searchItem[props.listValue],
|
|
|
+ title: searchItem[props.listLabel]
|
|
|
+ ? searchItem[props.listLabel]
|
|
|
+ : `(${i18n.t('missing_value')})`,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Contenu de la liste autocomplete : Les items actifs + les items correspondants à la recherche
|
|
|
*/
|
|
|
const items: ComputedRef<Array<ListItem>> = computed(() => {
|
|
|
if (pending.value || !(collectionActive.value && collectionSearch.value)) {
|
|
|
@@ -257,6 +279,10 @@ const onUpdateSearch = (event: string) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Quand un item est sélectionné
|
|
|
+ * @param event
|
|
|
+ */
|
|
|
const onUpdateModelValue = (event: Array<number>) => {
|
|
|
if (props.clearSearchAfterUpdate) {
|
|
|
searchFilter.value = ''
|
|
|
@@ -278,14 +304,4 @@ onBeforeUnmount(() => {
|
|
|
.v-autocomplete {
|
|
|
min-width: 350px;
|
|
|
}
|
|
|
-
|
|
|
-.hide-selection {
|
|
|
- /**
|
|
|
- On cache le contenu au chargement en attendant de résoudre le bug qui fait
|
|
|
- que ce sont les ids ou les IRIs qui s'affichent le temps du chargement
|
|
|
- */
|
|
|
- :deep(.v-chip__content) {
|
|
|
- color: transparent !important;
|
|
|
- }
|
|
|
-}
|
|
|
</style>
|