@@ -10,7 +10,7 @@ const props = defineProps<BlockProps>();
10
10
const { data : block } = await useAsyncData (props .uuid , () =>
11
11
$directus .request (
12
12
$readItem (' block_directory' , props .uuid , {
13
- fields: [' style' , ' grid' , ' collection' , ' filter' , ' title_size' ],
13
+ fields: [' style' , ' grid' , ' collection' , ' filter' , ' title_size' , ' group_by ' ],
14
14
}),
15
15
),
16
16
);
@@ -73,6 +73,19 @@ const dirConfig = computed(() => {
73
73
href : (item : Project ) => ` /built-with-directus/${item .slug } ` ,
74
74
},
75
75
};
76
+ } else if (context .collection === ' features' ) {
77
+ return {
78
+ searchFields: [' title' , ' description' ],
79
+ facetFields: [' module' ],
80
+ fieldMapping: {
81
+ title: ' title' ,
82
+ image: ' thumbnail' ,
83
+ description: ' description' ,
84
+ href : (item : any ) => ` /features/${item .slug } ` ,
85
+ module: ' module' ,
86
+ },
87
+ groupBy: ' module' ,
88
+ };
76
89
}
77
90
});
78
91
@@ -82,6 +95,7 @@ const { searchQuery, selectedFacets, facets, filteredItems, isFilterActive, clea
82
95
searchFields: unref (dirConfig )?.searchFields ?? [],
83
96
facetFields: unref (dirConfig )?.facetFields ?? [],
84
97
fieldMapping: unref (dirConfig )?.fieldMapping ?? undefined ,
98
+ groupBy: unref (dirConfig )?.groupBy ?? undefined ,
85
99
});
86
100
87
101
// Mobile filter state
@@ -130,23 +144,52 @@ const toggleFilter = () => {
130
144
</div >
131
145
</aside >
132
146
<main >
133
- <BaseCardGroup v-auto-animate :grid =" block.grid" >
134
- <BaseCard
135
- v-for =" card in filteredItems"
136
- :key =" card.title"
137
- :title =" card.title"
138
- :image =" card.image ?? undefined"
139
- :media-style =" block.style"
140
- :description =" card.description ?? undefined"
141
- :description-avatar =" card.avatar ?? undefined"
142
- layout =" vertical"
143
- :to =" card.href"
144
- :badge =" card.badge ?? undefined"
145
- :title-size =" block.title_size"
146
- />
147
- </BaseCardGroup >
148
-
149
- <p v-if =" filteredItems?.length === 0" >No items were found. Try changing the search criteria.</p >
147
+ <template v-if =" Array .isArray (filteredItems )" >
148
+ <BaseCardGroup v-auto-animate :grid =" block.grid" >
149
+ <BaseCard
150
+ v-for =" card in filteredItems"
151
+ :key =" card.title"
152
+ :title =" card.title"
153
+ :image =" card.image ?? undefined"
154
+ :media-style =" block.style"
155
+ :description =" card.description ?? undefined"
156
+ :description-avatar =" card.avatar ?? undefined"
157
+ layout =" vertical"
158
+ :to =" card.href"
159
+ :badge =" card.badge ?? undefined"
160
+ :title-size =" block.title_size"
161
+ />
162
+ </BaseCardGroup >
163
+ </template >
164
+ <template v-else >
165
+ <div v-for =" (group, groupName) in filteredItems" :key =" groupName" class =" group-container" >
166
+ <h2 v-if =" groupName" class =" group-title" >{{ formatTitle(groupName as string) }}</h2 >
167
+ <BaseCardGroup v-auto-animate :grid =" block.grid" >
168
+ <BaseCard
169
+ v-for =" card in group"
170
+ :key =" card.title"
171
+ :title =" card.title"
172
+ :image =" card.image ?? undefined"
173
+ :media-style =" block.style"
174
+ :description =" card.description ?? undefined"
175
+ :description-avatar =" card.avatar ?? undefined"
176
+ layout =" vertical"
177
+ :to =" card.href"
178
+ :badge =" card.badge ?? undefined"
179
+ :title-size =" block.title_size"
180
+ />
181
+ </BaseCardGroup >
182
+ </div >
183
+ </template >
184
+
185
+ <p
186
+ v-if ="
187
+ (Array.isArray(filteredItems) && filteredItems.length === 0) ||
188
+ (!Array.isArray(filteredItems) && Object.keys(filteredItems).length === 0)
189
+ "
190
+ >
191
+ No items were found. Try changing the search criteria.
192
+ </p >
150
193
<!-- @TODO: Pagination -->
151
194
</main >
152
195
</div >
@@ -231,4 +274,15 @@ const toggleFilter = () => {
231
274
justify-self : end ;
232
275
}
233
276
}
277
+
278
+ .group-container {
279
+ margin-bottom : var (--space-8 );
280
+ }
281
+
282
+ .group-title {
283
+ font-size : var (--text-lg );
284
+ font-weight : var (--weight-bold );
285
+ margin-bottom : var (--space-4 );
286
+ border-bottom : 1px solid var (--gray-200 );
287
+ }
234
288
</style >
0 commit comments