2626 frozenHeader
2727 :rowAttrs =" {tabindex: 0}"
2828 @row-dblclick =" openEditDialog"
29- @filter =" onFilter"
3029 :globalFilterFields =" ['subject', 'predicate', 'object']"
3130 paginatorTemplate =" FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown"
3231 :rowsPerPageOptions =" [10, 20, 50]"
3837 <RdfTripleToolbar
3938 :hasSelection =" Boolean(selectedTriple)"
4039 :hasItems =" items.length > 0"
41- :hasFilteredRows =" filteredRows .length > 0"
40+ :hasFilteredRows =" filteredItems .length > 0"
4241 :globalFilterValue =" filters?.global?.value ?? null"
4342 :exportMenuItems =" exportMenuItems"
4443 @add =" openNewDialog"
134133import {nextTick } from ' vue' ;
135134import {ref , computed , watch } from ' vue' ;
136135import DataTable from ' primevue/datatable' ;
137- import type {DataTableFilterEvent } from ' primevue/datatable' ;
138136import Column from ' primevue/column' ;
139137import InputText from ' primevue/inputtext' ;
140138import Button from ' primevue/button' ;
@@ -166,7 +164,6 @@ import {RdfMediaType} from '../rdfEnums';
166164const settings = useSettings ();
167165const groupBySubject = computed (() => settings .value .rdf .groupBySubject );
168166
169- const filteredRows = ref <any []>([]);
170167const props = defineProps <{
171168 dataIsUnparsable: boolean ;
172169 dataIsInJsonLd: boolean ;
@@ -230,16 +227,13 @@ const initFilters = () => {
230227};
231228
232229const items = computed (() => {
233- const mappedItems = rdfStoreManager .statements .value .map ((statement , index ) => ({
230+ return rdfStoreManager .statements .value .map ((statement , index ) => ({
234231 id: index ,
235232 subject: translateIRI (statement .subject .value ),
236233 predicate: translateIRI (statement .predicate .value ),
237234 object: translateIRI (statement .object .value ),
238235 statement: statement ,
239236 }));
240-
241- loading .value = false ;
242- return mappedItems ;
243237});
244238
245239function updateGlobalFilter(value : string | null ) {
@@ -281,13 +275,41 @@ async function selectRowByIndex(index: number) {
281275 }
282276}
283277
284- function onFilter( e : DataTableFilterEvent ) {
285- filteredRows . value = e . filteredValue ?? [] ;
286- }
278+ const filteredItems = computed (() => {
279+ const currentItems = items . value ;
280+ const currentFilters = filters . value ?? {};
287281
288- const filteredStatements = computed (() =>
289- (filteredRows .value .length ? filteredRows .value : items .value ).map (row => row .statement )
290- );
282+ const globalNeedle = getFilterNeedle (currentFilters .global );
283+ const subjectNeedle = getFilterNeedle (currentFilters .subject );
284+ const predicateNeedle = getFilterNeedle (currentFilters .predicate );
285+ const objectNeedle = getFilterNeedle (currentFilters .object );
286+
287+ if (! globalNeedle && ! subjectNeedle && ! predicateNeedle && ! objectNeedle ) {
288+ return currentItems ;
289+ }
290+
291+ return currentItems .filter (row => {
292+ const subject = String (row .subject ?? ' ' );
293+ const predicate = String (row .predicate ?? ' ' );
294+ const object = String (row .object ?? ' ' );
295+
296+ if (subjectNeedle && ! matchesContains (subject , subjectNeedle )) return false ;
297+ if (predicateNeedle && ! matchesContains (predicate , predicateNeedle )) return false ;
298+ if (objectNeedle && ! matchesContains (object , objectNeedle )) return false ;
299+
300+ if (globalNeedle ) {
301+ return (
302+ matchesContains (subject , globalNeedle ) ||
303+ matchesContains (predicate , globalNeedle ) ||
304+ matchesContains (object , globalNeedle )
305+ );
306+ }
307+
308+ return true ;
309+ });
310+ });
311+
312+ const filteredStatements = computed (() => filteredItems .value .map (row => row .statement ));
291313
292314const confirmDeleteSelected = () => {
293315 deleteDialog .value = true ;
@@ -441,6 +463,13 @@ watch(
441463 }
442464);
443465
466+ watch (
467+ () => rdfStoreManager .statements .value ,
468+ () => {
469+ loading .value = false ;
470+ }
471+ );
472+
444473function onRowClick(event : any ) {
445474 const path = jsonLdNodeManager .findPath (event .data .statement );
446475 if (path ) {
@@ -452,6 +481,18 @@ function translateIRI(iriTerm: string) {
452481 return iriTerm ;
453482}
454483
484+ function getFilterNeedle(filterMeta : any ): string | null {
485+ const raw =
486+ filterMeta ?.value ??
487+ (Array .isArray (filterMeta ?.constraints ) ? filterMeta .constraints [0 ]?.value : null );
488+ const text = typeof raw === ' string' ? raw .trim () : String (raw ?? ' ' ).trim ();
489+ return text .length ? text .toLocaleLowerCase () : null ;
490+ }
491+
492+ function matchesContains(value : string , needle : string ): boolean {
493+ return value .toLocaleLowerCase ().includes (needle );
494+ }
495+
455496function exportAs(format : string ) {
456497 const serialized = rdfStoreManager .exportAs (format );
457498 downloadFile (serialized .content , format );
0 commit comments