diff --git a/src/compositions/use-collection-preset/use-collection-preset.ts b/src/compositions/use-collection-preset/use-collection-preset.ts index bf932e95c8..85c0109b25 100644 --- a/src/compositions/use-collection-preset/use-collection-preset.ts +++ b/src/compositions/use-collection-preset/use-collection-preset.ts @@ -82,5 +82,18 @@ export function useCollectionPreset(collection: Ref) { }, }); - return { viewType, viewOptions, viewQuery, filters }; + const searchQuery = computed({ + get() { + return localPreset.value.search_query || null; + }, + set(val) { + localPreset.value = { + ...localPreset.value, + search_query: val, + }; + savePreset(localPreset.value); + }, + }); + + return { viewType, viewOptions, viewQuery, filters, searchQuery }; } diff --git a/src/compositions/use-items/use-items.ts b/src/compositions/use-items/use-items.ts index 8ef3aab7d0..ad10db6b4f 100644 --- a/src/compositions/use-items/use-items.ts +++ b/src/compositions/use-items/use-items.ts @@ -14,13 +14,14 @@ type Options = { sort: Ref; page: Ref; filters: Ref; + searchQuery: Ref; }; export function useItems(collection: Ref, options: Options) { const projectsStore = useProjectsStore(); const { primaryKeyField } = useCollection(collection); - const { limit, fields, sort, page, filters } = options; + const { limit, fields, sort, page, filters, searchQuery } = options; // eslint-disable-next-line @typescript-eslint/no-explicit-any const items = ref([]); @@ -79,7 +80,7 @@ export function useItems(collection: Ref, options: Options) { } }); - watch([filters, limit], async (after, before) => { + watch([filters, limit, searchQuery], async (after, before) => { if (!before || isEqual(after, before)) { return; } @@ -145,6 +146,7 @@ export function useItems(collection: Ref, options: Options) { fields: fieldsToFetch, sort: sort.value, page: page.value, + q: searchQuery.value, ...filtersToQuery(filters.value), }, }); diff --git a/src/layouts/cards/cards.vue b/src/layouts/cards/cards.vue index 04b2750e53..4de50e8ff4 100644 --- a/src/layouts/cards/cards.vue +++ b/src/layouts/cards/cards.vue @@ -176,6 +176,10 @@ export default defineComponent({ type: Object as PropType, default: null, }, + searchQuery: { + type: String, + default: null, + }, }, setup(props, { emit }) { const mainElement = inject('main-element', ref(null)); @@ -186,7 +190,7 @@ export default defineComponent({ const _viewQuery = useSync(props, 'viewQuery', emit); const _filters = useSync(props, 'filters', emit); - const { collection } = toRefs(props); + const { collection, searchQuery } = toRefs(props); const { primaryKeyField, fields: fieldsInCollection } = useCollection(collection); const availableFields = computed(() => @@ -206,6 +210,7 @@ export default defineComponent({ page, fields: fields, filters: _filters, + searchQuery, }); return { diff --git a/src/layouts/tabular/tabular.vue b/src/layouts/tabular/tabular.vue index 8243771294..f9538f70e0 100644 --- a/src/layouts/tabular/tabular.vue +++ b/src/layouts/tabular/tabular.vue @@ -162,6 +162,10 @@ export default defineComponent({ type: Array as PropType, default: () => [], }, + searchQuery: { + type: String, + default: null, + }, selectMode: { type: Boolean, default: false, @@ -182,7 +186,7 @@ export default defineComponent({ const _viewQuery = useSync(props, 'viewQuery', emit); const _filters = useSync(props, 'filters', emit); - const { collection } = toRefs(props); + const { collection, searchQuery } = toRefs(props); const { primaryKeyField, fields: fieldsInCollection } = useCollection(collection); const availableFields = computed(() => @@ -197,6 +201,7 @@ export default defineComponent({ page, fields, filters: _filters, + searchQuery, }); const { diff --git a/src/modules/collections/routes/browse/browse.vue b/src/modules/collections/routes/browse/browse.vue index d844e5b621..2331b18519 100644 --- a/src/modules/collections/routes/browse/browse.vue +++ b/src/modules/collections/routes/browse/browse.vue @@ -14,6 +14,8 @@