blob: 8391a28eddce164c412ed1378801ea74b5bd57ad [file] [log] [blame]
/*
* 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
}
}