Index: trunk/core/units/general/helpers/search_helper.php =================================================================== diff -u -N -r6756 -r6831 --- trunk/core/units/general/helpers/search_helper.php (.../search_helper.php) (revision 6756) +++ trunk/core/units/general/helpers/search_helper.php (.../search_helper.php) (revision 6831) @@ -150,6 +150,9 @@ if ($filter_data) { $search_filter[$search_field] = $filter_data; } + else { + unset($search_filter[$search_field]); + } } $this->Application->StoreVar($event->getPrefixSpecial().'_search_filter', serialize($search_filter) ); } @@ -213,29 +216,9 @@ break; case 'kDateFormatter': - $field_processed = true; + // if date is searched using direct filter, then do nothing here, otherwise search using LIKE clause + $field_processed = ($custom_search !== false) ? true : false; break; - - /*case 'kDateFormatter': // move to Custom Filters (by Alex) - $filter_value = Array(); - if ($field_name === false) { - $field_value = getArrayValue($custom_filter, $field_name.'_datefrom', 'submit_value'); - if ($field_value) { - $value = $this->processRangeField($event, $field_name, 'datefrom', $field_value, $formatter); - $filter_value[] = $table_name.'`'.$field_name.'` >= '.$value; - } - - $field_value = getArrayValue($custom_filter, $field_name.'_dateto', 'submit_value'); - if ($field_value) { - $value = $this->processRangeField($event, $field_name, 'dateto', $field_value, $formatter); - $filter_value[] = $table_name.'`'.$field_name.'` <= '.$value; - } - - $filter_value = $filter_value ? '('.implode(') AND (', $filter_value).')' : ''; - } - - $field_processed = true; - break;*/ default: $field_processed = false; @@ -349,10 +332,13 @@ } $object =& $event->getObject(); // don't recall it each time in getCustomFilterSearchClause + $grid_info = $this->Application->getUnitOption($event->Prefix.'.'.$grid_name, 'Grids'); foreach ($custom_filter as $field_name => $field_options) { list ($filter_type, $field_options) = each($field_options); + $field_options['grid_options'] = $grid_info['Fields'][$field_name]; $field_options = $this->getCustomFilterSearchClause($object, $field_name, $filter_type, $field_options); if ($field_options['value']) { + unset($field_options['grid_options']); $custom_filter[$field_name][$filter_type] = $field_options; } } @@ -364,6 +350,11 @@ function getCustomFilterSearchClause(&$object, $field_name, $filter_type, $field_options) { + if ($filter_type == 'date_range') { + // use timestamp field, not formatted one + $field_name = $field_options['grid_options']['sort_field']; + } + extract( $this->getFieldInformation($object, $field_name) ); // see getFieldInformation for more details $filter_value = ''; @@ -377,17 +368,31 @@ // add range filter $filter_value = $table_name.'`'.$field_name.'` >= '.$from.' AND '.$table_name.'`'.$field_name.'` <= '.$to; } - elseif ($from !== false && $to === false) { + elseif ($from !== false) { // add equals filter on $from $filter_value = $table_name.'`'.$field_name.'` = '.$from; } - elseif ($from === false && $to !== false) { + elseif ($to !== false) { // add equals filter on $to $filter_value = $table_name.'`'.$field_name.'` = '.$to; } break; case 'date_range': + $from = $this->processRangeField($object, $field_name, $field_options['submit_value'], 'from'); + $to = $this->processRangeField($object, $field_name, $field_options['submit_value'], 'to'); + + $day_seconds = 23 * 60 * 60 + 59 * 60 + 59; + if ($from !== false && $to === false) { + $to = $from + $day_seconds; + } + elseif ($from === false && $to !== false) { + $from = $to - $day_seconds; + } + + if ($from !== false && $to !== false) { + $filter_value = $table_name.'`'.$field_name.'` >= '.$from.' AND '.$table_name.'`'.$field_name.'` <= '.$to; + } break; case 'equals': @@ -415,33 +420,36 @@ /** * Enter description here... * - * @param kEvent $event + * @param kdbItem $object * @param string $search_field - * @param string $type * @param string $value - * @param string $formatter_class + * @param string $type */ - function processRangeField(&$event, $search_field, $type, $value, $formatter_class) + function processRangeField(&$object, $search_field, $value, $type) { - $field = $search_field.'_'.$type; + if (!$value[$type]) { + return false; + } + $lang_current =& $this->Application->recallObject('lang.current'); + $dt_separator = getArrayValue($object->GetFieldOptions($search_field), 'date_time_separator'); + if (!$dt_separator) { + $dt_separator = ' '; + } + + $time = ($type == 'from') ? adodb_mktime(0, 0, 0) : adodb_mktime(23, 59, 59); + $time = adodb_date($lang_current->GetDBField('InputTimeFormat'), $time); + + $full_value = $value[$type].$dt_separator.$time; - $object =& $event->getObject(); - $dt_separator = getArrayValue( $object->GetFieldOptions($search_field), 'date_time_separator' ); - if(!$dt_separator) $dt_separator = ' '; + $formatter =& $this->Application->recallObject($object->Fields[$search_field]['formatter']); - $time = ($type == 'datefrom') ? adodb_mktime(0,0,0) : adodb_mktime(23,59,59); - $time = adodb_date( $lang_current->GetDBField('InputTimeFormat'), $time); - $full_value = $value.$dt_separator.$time; - - $formatter =& $this->Application->recallObject($formatter_class); - $value_ts = $formatter->Parse($full_value, $search_field, $object); $pseudo = getArrayValue($object->FieldErrors, $search_field, 'pseudo'); - if($pseudo) - { - $this->Application->StoreVar($event->getPrefixSpecial().'_'.$field.'_error', $pseudo); - return -1; + if ($pseudo) { + unset($object->FieldErrors[$search_field]); // remove error! + // invalid format -> ignore this date in search + return false; } return $value_ts; } Index: trunk/core/admin_templates/js/calendar.js =================================================================== diff -u -N -r6656 -r6831 --- trunk/core/admin_templates/js/calendar.js (.../calendar.js) (revision 6656) +++ trunk/core/admin_templates/js/calendar.js (.../calendar.js) (revision 6831) @@ -26,11 +26,11 @@ // inputContainer.appendChild(pNode.removeChild(input)); var calendarButton = document.createElement("IMG"); - calendarButton.setAttribute("width", "24"); - calendarButton.setAttribute("height", "24"); + calendarButton.setAttribute("width", "19"); //24 + calendarButton.setAttribute("height", "15"); //24 calendarButton.setAttribute("align", "absMiddle"); - calendarButton.style.width=24 - calendarButton.style.height=24 + calendarButton.style.width=19; //24 + calendarButton.style.height=15; //24 calendarButton.style.cursor = "hand"; calendarButton.setAttribute("hspace", 2);