From 5c680dbb74aae64c59763e8ff7d2eb7fd3bfad02 Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Fri, 15 Nov 2019 17:54:38 -0500 Subject: [PATCH] implement more filter operators - contains - does not contain - starts with - ends with Signed-off-by: Galen Charlton --- .../src/app/staff/acq/search/acq-search.service.ts | 29 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/Open-ILS/src/eg2/src/app/staff/acq/search/acq-search.service.ts b/Open-ILS/src/eg2/src/app/staff/acq/search/acq-search.service.ts index dbad57f875..3f142c661f 100644 --- a/Open-ILS/src/eg2/src/app/staff/acq/search/acq-search.service.ts +++ b/Open-ILS/src/eg2/src/app/staff/acq/search/acq-search.service.ts @@ -62,10 +62,14 @@ const searchOptions = { }; const operatorMap = { + "!=": "__not", ">": "__gte", ">=": "__gte", "<=": "__lte", "<": "__lte", + "startswith": "__starts", + "endswith": "__ends", + "like": "__fuzzy", } @Injectable() @@ -80,11 +84,30 @@ export class AcqSearchService { generateAcqSearch(searchType, filters): any { const baseSearch = JSON.parse(JSON.stringify(defaultSearch[searchType])); // deep copy Object.keys(filters).forEach(filterField => { + const searchTerm: Object = {}; const coreRecType = Object.keys(defaultSearch[searchType])[0]; - const filterOp = Object.keys(filters[filterField][0][filterField])[0]; - const filterVal = filters[filterField][0][filterField][filterOp]; + let filterOp = "="; + let filterVal = ""; + if (Object.keys(filters[filterField][0]).some(x => x === "-not")) { + filterOp = Object.keys(filters[filterField][0]["-not"][filterField])[0]; + filterVal = filters[filterField][0]["-not"][filterField][filterOp]; + searchTerm["__not"] = true; + } else { + filterOp = Object.keys(filters[filterField][0][filterField])[0]; + filterVal = filters[filterField][0][filterField][filterOp]; + if (filterOp === "like" && filterVal.length > 1) { + if (filterVal[0] === "%" && filterVal[filterVal.length - 1] === "%") { + filterVal = filterVal.slice(1, filterVal.length - 1); + } else if (filterVal[filterVal.length - 1] === "%") { + filterVal = filterVal.slice(0, filterVal.length - 1); + filterOp = "startswith"; + } else if (filterVal[0] === "%") { + filterVal = filterVal.slice(1); + filterOp = "endswith"; + } + } + } - const searchTerm: Object = {}; searchTerm[filterField] = filterVal; if (filterOp in operatorMap) { searchTerm[operatorMap[filterOp]] = true; -- 2.11.0