diff --git a/include/ajax.search.php b/include/ajax.search.php index 23e4a6bec9cef6ff24b535c4bcb7f15674186330..4013d27e4290e3a5ffa3187069a6fa04c1c8fcf4 100644 --- a/include/ajax.search.php +++ b/include/ajax.search.php @@ -29,10 +29,7 @@ class SearchAjaxAPI extends AjaxController { Http::response(403, 'Agent login required'); $search = SavedSearch::create(); - // Don't send the state as the souce because it is not in the - // ::parse format (it's in ::to_php format) - $form = $search->getFormFromSession('advsearch'); - $form->loadState($_SESSION['advsearch']); + $form = $search->getFormFromSession('advsearch') ?: $search->getForm(); $matches = self::_getSupportedTicketMatches(); include STAFFINC_DIR . 'templates/advanced-search.tmpl.php'; @@ -64,8 +61,6 @@ class SearchAjaxAPI extends AjaxController { break; default: - // The "extended" fields are build automatically and rooted from - // the base of the ID numbers $extended = SavedSearch::getExtendedTicketFields(); if (isset($extended[$name])) { @@ -205,11 +200,12 @@ class SearchAjaxAPI extends AjaxController { Http::response(404, 'No such saved search'); } - $form = $search->getForm(); - if ($state = JsonDataParser::parse($search->config)) + if ($state = JsonDataParser::parse($search->config)) { + $form = $search->loadFromState($state); $form->loadState($state); - + } $matches = self::_getSupportedTicketMatches(); + include STAFFINC_DIR . 'templates/advanced-search.tmpl.php'; } diff --git a/include/class.search.php b/include/class.search.php index 1236d14bb415f11e92d836764163f06b92721a38..b68a0d3ed37c6cf92e712987c141c36e4ff0f378 100644 --- a/include/class.search.php +++ b/include/class.search.php @@ -621,22 +621,25 @@ class SavedSearch extends VerySimpleModel { ))); } - function getFormFromSession($key, $source=false) { - if (isset($_SESSION[$key])) { - $source = $source ?: array(); - $state = $_SESSION[$key]; - // Pull out 'other' fields from the state so the fields will be - // added to the form. The state will be loaded below - foreach ($state as $k=>$v) { - $info = array(); - if (!preg_match('/^:(\w+)(?:!(\d+))?\+search/', $k, $info)) { - continue; - } - list($k,) = explode('+', $k, 2); - $source['fields'][] = $k; + function loadFromState($source=false) { + // Pull out 'other' fields from the state so the fields will be + // added to the form. The state will be loaded below + $state = $source ?: array(); + foreach ($state as $k=>$v) { + $info = array(); + if (!preg_match('/^:(\w+)(?:!(\d+))?\+search/', $k, $info)) { + continue; } + list($k,) = explode('+', $k, 2); + $state['fields'][] = $k; + } + return $this->getForm($state); + } + + function getFormFromSession($key) { + if (isset($_SESSION[$key])) { + return $this->loadFromState($_SESSION[$key]); } - return $this->getForm($source); } function getForm($source=false) { @@ -660,7 +663,10 @@ class SavedSearch extends VerySimpleModel { $fields = array_merge($fields, self::getSearchField($field, $name)); } - $form = new SimpleForm($fields, $source); + // Don't send the state as the souce because it is not in the + // ::parse format (it's in ::to_php format). Instead, source is set + // via ::loadState() below + $form = new AdvancedSearchForm($fields, $source); $form->addValidator(function($form) { $selected = 0; foreach ($form->getFields() as $F) { @@ -673,6 +679,8 @@ class SavedSearch extends VerySimpleModel { if (!$selected) $form->addError(__('No fields selected for searching')); }); + if ($source) + $form->loadState($source); return $form; } @@ -704,10 +712,9 @@ class SavedSearch extends VerySimpleModel { )), ); - $extended = self::getExtendedTicketFields(); - // Add 'other' fields added dynamically if (is_array($source) && isset($source['fields'])) { + $extended = self::getExtendedTicketFields(); foreach ($source['fields'] as $f) { $info = array(); if (isset($extended[$f])) { @@ -788,7 +795,7 @@ class SavedSearch extends VerySimpleModel { function mangleQuerySet(QuerySet $qs, $form=false) { $form = $form ?: $this->getForm(); - $searchable = $this->getCurrentSearchFields($form->getSource()); + $searchable = $this->getCurrentSearchFields($form->state); $qs = clone $qs; // Figure out fields to search on @@ -888,6 +895,15 @@ class SavedSearch extends VerySimpleModel { } } +class AdvancedSearchForm extends SimpleForm { + var $state; + + function __construct($fields, $state) { + parent::__construct($fields); + $this->state = $state; + } +} + // Advanced search special fields class HelpTopicChoiceField extends ChoiceField { diff --git a/include/staff/templates/advanced-search-field.tmpl.php b/include/staff/templates/advanced-search-field.tmpl.php index 40712cc18cbf18a639437b3331a71ead5828a7b7..5191a0cf4dac8217e664798d76d925e4623e6e08 100644 --- a/include/staff/templates/advanced-search-field.tmpl.php +++ b/include/staff/templates/advanced-search-field.tmpl.php @@ -1,7 +1,8 @@ <input type="hidden" name="fields[]" value="<?php echo $name; ?>"/> <?php foreach ($fields as $F) { ?> <fieldset id="field<?php echo $F->getWidget()->id; - ?>" <?php if (!$F->isVisible()) echo 'style="display:none;"'; ?>> + ?>" <?php if (!$F->isVisible()) echo 'style="display:none;"'; ?> + <?php if (substr($F->get('name'), -7) === '+search') echo 'class="advanced-search-field"'; ?>> <?php echo $F->render(); ?> <?php foreach ($F->errors() as $E) { ?><div class="error"><?php echo $E; ?></div><?php diff --git a/include/staff/templates/advanced-search.tmpl.php b/include/staff/templates/advanced-search.tmpl.php index 9ce8ff2dca0baecbd775c9802195f85b9ce09f26..94d193b598e851fff60469cadcf5e2706b23c32c 100644 --- a/include/staff/templates/advanced-search.tmpl.php +++ b/include/staff/templates/advanced-search.tmpl.php @@ -16,7 +16,8 @@ foreach ($form->errors(true) ?: array() as $message) { foreach ($form->getFields() as $name=>$field) { ?> <fieldset id="field<?php echo $field->getWidget()->id; - ?>" <?php if (!$field->isVisible()) echo 'class="hidden"'; ?>> + ?>" <?php if (!$field->isVisible()) echo 'class="hidden"'; ?> + <?php if (substr($field->get('name'), -7) === '+search') echo 'class="advanced-search-field"'; ?>> <?php echo $field->render(); ?> <?php foreach ($field->errors() as $E) { ?><div class="error"><?php echo $E; ?></div><?php diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php index ff8b36ffdcae657b0ffc3c3e0f903d45345a9db4..32d556b3f7bb66191337103b82322ac45a834842 100644 --- a/include/staff/tickets.inc.php +++ b/include/staff/tickets.inc.php @@ -105,9 +105,7 @@ case 'search': } break; } elseif (isset($_SESSION['advsearch'])) { - // XXX: De-duplicate and simplify this code $form = $search->getFormFromSession('advsearch'); - $form->loadState($_SESSION['advsearch']); $tickets = $search->mangleQuerySet($tickets, $form); $view_all_tickets = $thisstaff->getRole()->hasPerm(SearchBackend::PERM_EVERYTHING); $results_type=__('Advanced Search') diff --git a/scp/css/scp.css b/scp/css/scp.css index 5bd0cf2ffb60593fc49e16a9ea5af2972df3ce6a..ad7c976ade5c91a161e2b1e345801a253f5fa85d 100644 --- a/scp/css/scp.css +++ b/scp/css/scp.css @@ -1613,10 +1613,6 @@ time.faq { width:100%; } -#advanced-search div.closed_by, #advanced-search span.spinner { - display:none; -} - .dialog fieldset { margin:0; padding:0 0; @@ -1672,42 +1668,14 @@ time.faq { vertical-align: top; } -#advanced-search .query input { - width:100%; - padding: 4px; - margin-bottom: 10px; -} - -#advanced-search .date_range { - margin-bottom: 5px; -} -#advanced-search .date_range input { - width:227px; - width: calc(49% - 73px); -} - -#advanced-search .date_range i { - display:inline-block; - margin-left:3px; - position:relative; - top:5px; - width:16px; - height:16px; - background:url(../images/cal.png) bottom left no-repeat; -} - -#advanced-search fieldset.sorting select { - width:130px; -} - -#advanced-search p { - text-align:center; -} - .search-dropdown { padding-left: 19px; } +.advanced-search-field { + margin-top: 5px !important; +} + .dialog input[type="submit"], .dialog input[type="reset"], .dialog input[type="button"], diff --git a/scp/tickets.php b/scp/tickets.php index 3f1882217e412bffdb6f770d3bccd7e05cc5a5f8..8c1f84047c82f21330b73bb3569e8ba7b680fc28 100644 --- a/scp/tickets.php +++ b/scp/tickets.php @@ -473,7 +473,6 @@ if (isset($_SESSION['advsearch'])) { // XXX: De-duplicate and simplify this code $search = SavedSearch::create(); $form = $search->getFormFromSession('advsearch'); - $form->loadState($_SESSION['advsearch']); $tickets = TicketModel::objects(); $tickets = $search->mangleQuerySet($tickets, $form); $count = $tickets->count();