+
+  # if someone types something, and hits enter, assume he entered the full name.
+  # if something matches, treat that as sole match
+  # unfortunately get_models can't do more than one per package atm, so we d it
+  # the oldfashioned way.
+  if ($::form->{prefer_exact}) {
+    my $exact_matches;
+    if (1 == scalar @{ $exact_matches = SL::DB::Manager::Part->get_all(
+      query => [
+        obsolete => 0,
+        SL::DB::Manager::Part->type_filter($::form->{filter}{type}),
+        or => [
+          description => { ilike => $::form->{filter}{'all:substr:multi::ilike'} },
+          partnumber  => { ilike => $::form->{filter}{'all:substr:multi::ilike'} },
+        ]
+      ],
+      limit => 2,
+    ) }) {
+      $self->parts($exact_matches);
+    }
+  }
+
+  my @hashes = map {
+   +{
+     value       => $_->displayable_name,
+     label       => $_->displayable_name,
+     id          => $_->id,
+     partnumber  => $_->partnumber,
+     description => $_->description,
+     type        => $_->type,
+     unit        => $_->unit,
+     cvars       => { map { ($_->config->name => { value => $_->value_as_text, is_valid => $_->is_valid }) } @{ $_->cvars_by_config } },
+    }
+  } @{ $self->parts }; # neato: if exact match triggers we don't even need the init_parts
+
+  $self->render(\ SL::JSON::to_json(\@hashes), { layout => 0, type => 'json', process => 0 });