| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| import org.apache.ofbiz.base.util.StringUtil |
| import org.apache.ofbiz.base.util.UtilDateTime |
| import org.apache.ofbiz.base.util.Debug |
| import org.apache.ofbiz.entity.util.EntityFindOptions |
| import org.apache.ofbiz.entity.condition.EntityCondition |
| import org.apache.ofbiz.entity.condition.EntityConditionList |
| import org.apache.ofbiz.entity.condition.EntityExpr |
| import org.apache.ofbiz.entity.condition.EntityFieldValue |
| import org.apache.ofbiz.entity.condition.EntityFunction |
| import org.apache.ofbiz.entity.condition.EntityOperator |
| import org.apache.ofbiz.entity.util.EntityUtilProperties |
| |
| def mainAndConds = [] |
| def orExprs = [] |
| def entityName = context.entityName |
| def searchFields = context.searchFields |
| def displayFields = context.displayFields ?: searchFields |
| def searchDistinct = Boolean.valueOf(context.searchDistinct ?: false) |
| |
| def searchValueFieldName = parameters.term |
| def fieldValue = null |
| if (searchValueFieldName) { |
| fieldValue = searchValueFieldName |
| } else if (parameters.searchValueFieldName) { // This is to find the description of a lookup value on initialization. |
| fieldValue = parameters.get(parameters.searchValueFieldName) |
| context.description = "true" |
| } |
| |
| def searchType = context.searchType |
| def displayFieldsSet = null |
| |
| def conditionDates = context.conditionDates |
| def fromDateName = null |
| def thruDateName = null |
| def filterByDateValue = null |
| |
| //If conditionDates is present on context, resolve values use add condition date to the condition search |
| if (conditionDates) { |
| filterByDateValue = conditionDates.filterByDateValue ?: UtilDateTime.nowTimestamp() |
| fromDateName = conditionDates.fromDateName ?: null |
| thruDateName = conditionDates.thruDateName ?: null |
| //if the field filterByDate is present, init default value for fromDate and thruDate |
| if (!fromDateName && !thruDateName) { |
| fromDateName = "fromDate" |
| thruDateName = "thruDate" |
| } |
| } |
| |
| if (searchFields && fieldValue) { |
| def searchFieldsList = StringUtil.toList(searchFields) |
| displayFieldsSet = StringUtil.toSet(displayFields) |
| if (context.description && fieldValue instanceof java.lang.String) { |
| returnField = parameters.searchValueFieldName |
| } else { |
| returnField = searchFieldsList[0] //default to first element of searchFields |
| displayFieldsSet.add(returnField) //add it to select fields, in case it is missing |
| } |
| context.returnField = returnField |
| context.displayFieldsSet = displayFieldsSet |
| if ("STARTS_WITH".equals(searchType)) { |
| searchValue = fieldValue.toUpperCase() + "%" |
| } else if ("EQUALS".equals(searchType)) { |
| searchValue = fieldValue |
| } else {//default is CONTAINS |
| searchValue = "%" + fieldValue.toUpperCase() + "%" |
| } |
| searchFieldsList.each { fieldName -> |
| if ("EQUALS".equals(searchType)) { |
| orExprs.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(searchFieldsList[0]), EntityOperator.EQUALS, searchValue)) |
| return //in case of EQUALS, we search only a match for the returned field |
| } else { |
| orExprs.add(EntityCondition.makeCondition(EntityFunction.UPPER(EntityFieldValue.makeFieldValue(fieldName)), EntityOperator.LIKE, searchValue)) |
| } |
| } |
| } |
| |
| /* the following is part of an attempt to handle additional parameters that are passed in from other form fields at run-time, |
| * but that is not supported by the Jquery Autocompleter, but this is still useful to pass parameters from the |
| * lookup screen definition: |
| */ |
| def conditionFields = context.conditionFields |
| if (conditionFields) { |
| // these fields are for additonal conditions, this is a Map of name/value pairs |
| for (conditionFieldEntry in conditionFields.entrySet()) { |
| if (conditionFieldEntry.getValue() instanceof java.util.List) { |
| def orCondFields = [] |
| for (entry in conditionFieldEntry.getValue()) { |
| orCondFields.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(conditionFieldEntry.getKey()), EntityOperator.EQUALS, entry)) |
| } |
| mainAndConds.add(EntityCondition.makeCondition(orCondFields, EntityOperator.OR)) |
| } else { |
| mainAndConds.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(conditionFieldEntry.getKey()), EntityOperator.EQUALS, conditionFieldEntry.getValue())) |
| } |
| } |
| } |
| |
| if (orExprs && entityName && displayFieldsSet) { |
| mainAndConds.add(EntityCondition.makeCondition(orExprs, EntityOperator.OR)) |
| |
| //if there is an extra condition, add it to main condition list |
| if (context.andCondition && context.andCondition instanceof EntityCondition) { |
| mainAndConds.add(context.andCondition) |
| } |
| if (conditionDates) { |
| def condsDateList = [] |
| if (thruDateName) { |
| def condsByThruDate = [] |
| condsByThruDate.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(thruDateName), EntityOperator.GREATER_THAN, filterByDateValue)) |
| condsByThruDate.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(thruDateName), EntityOperator.EQUALS, null)) |
| condsDateList.add(EntityCondition.makeCondition(condsByThruDate, EntityOperator.OR)) |
| } |
| |
| if (fromDateName) { |
| def condsByFromDate = [] |
| condsByFromDate.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(fromDateName), EntityOperator.LESS_THAN_EQUAL_TO, filterByDateValue)) |
| condsByFromDate.add(EntityCondition.makeCondition(EntityFieldValue.makeFieldValue(fromDateName), EntityOperator.EQUALS, null)) |
| condsDateList.add(EntityCondition.makeCondition(condsByFromDate, EntityOperator.OR)) |
| } |
| |
| mainAndConds.add(EntityCondition.makeCondition(condsDateList, EntityOperator.AND)) |
| } |
| |
| def entityConditionList = EntityCondition.makeCondition(mainAndConds, EntityOperator.AND) |
| |
| String viewSizeStr = context.autocompleterViewSize |
| if (viewSizeStr == null) { |
| viewSizeStr = EntityUtilProperties.getPropertyValue("widget", "widget.autocompleter.defaultViewSize", delegator) |
| } |
| Integer autocompleterViewSize = Integer.valueOf(viewSizeStr ?: 10) |
| EntityFindOptions findOptions = new EntityFindOptions() |
| findOptions.setMaxRows(autocompleterViewSize) |
| findOptions.setDistinct(searchDistinct) |
| |
| autocompleteOptions = delegator.findList(entityName, entityConditionList, displayFieldsSet, StringUtil.toList(displayFields), findOptions, false) |
| if (autocompleteOptions) { |
| context.autocompleteOptions = autocompleteOptions |
| } |
| } |