Skip to content

Commit 18c1660

Browse files
authored
Change Search Logic in RDF Triple Tab (#951)
1 parent 2977318 commit 18c1660

1 file changed

Lines changed: 55 additions & 14 deletions

File tree

meta_configurator/src/components/panels/rdf/rdf-authoring/RdfTripleTab.vue

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
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]"
@@ -38,7 +37,7 @@
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"
@@ -134,7 +133,6 @@
134133
import {nextTick} from 'vue';
135134
import {ref, computed, watch} from 'vue';
136135
import DataTable from 'primevue/datatable';
137-
import type {DataTableFilterEvent} from 'primevue/datatable';
138136
import Column from 'primevue/column';
139137
import InputText from 'primevue/inputtext';
140138
import Button from 'primevue/button';
@@ -166,7 +164,6 @@ import {RdfMediaType} from '../rdfEnums';
166164
const settings = useSettings();
167165
const groupBySubject = computed(() => settings.value.rdf.groupBySubject);
168166
169-
const filteredRows = ref<any[]>([]);
170167
const props = defineProps<{
171168
dataIsUnparsable: boolean;
172169
dataIsInJsonLd: boolean;
@@ -230,16 +227,13 @@ const initFilters = () => {
230227
};
231228
232229
const 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
245239
function 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
292314
const 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+
444473
function 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+
455496
function exportAs(format: string) {
456497
const serialized = rdfStoreManager.exportAs(format);
457498
downloadFile(serialized.content, format);

0 commit comments

Comments
 (0)