. */ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Json; use Amount; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\ObjectGroup; use FireflyIII\Models\PiggyBank; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\ObjectGroup\ObjectGroupRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Repositories\TransactionGroup\TransactionGroupRepositoryInterface; use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; /** * Class AutoCompleteController. * * TODO autocomplete for transaction types. * */ class AutoCompleteController extends Controller { /** * Searches in the titles of all transaction journals. * The result is limited to the top 15 unique results. * * @param Request $request * * @return JsonResponse */ public function allJournals(Request $request): JsonResponse { $search = (string) $request->get('search'); /** @var JournalRepositoryInterface $repository */ $repository = app(JournalRepositoryInterface::class); $result = $repository->searchJournalDescriptions($search); // limit and unique $filtered = $result->unique('description'); $limited = $filtered->slice(0, 15); $array = $limited->toArray(); // duplicate 'description' value into 'name': $array = array_map( static function (array $journal) { $journal['name'] = $journal['description']; return $journal; }, $array ); return response()->json(array_values($array)); } /** * Searches in the titles of all transaction journals. * The result is limited to the top 15 unique results. * * If the query is numeric, it will append the journal with that particular ID. * * @param Request $request * * @return JsonResponse */ public function allJournalsWithID(Request $request): JsonResponse { $search = (string) $request->get('search'); /** @var JournalRepositoryInterface $repository */ $repository = app(JournalRepositoryInterface::class); /** @var TransactionGroupRepositoryInterface $groupRepos */ $groupRepos = app(TransactionGroupRepositoryInterface::class); $result = $repository->searchJournalDescriptions($search); $array = []; if (is_numeric($search)) { // search for group, not journal. $firstResult = $groupRepos->find((int) $search); if (null !== $firstResult) { // group may contain multiple journals, each a result: foreach ($firstResult->transactionJournals as $journal) { $array[] = $journal->toArray(); } } } // if not numeric, search ahead! // limit and unique $limited = $result->slice(0, 15); $array = array_merge($array, $limited->toArray()); foreach ($array as $index => $item) { // give another key for consistency $array[$index]['name'] = sprintf('#%d: %s', $item['transaction_group_id'], $item['description']); } return response()->json($array); } /** * @param Request $request * * @return JsonResponse * @codeCoverageIgnore */ public function transactionTypes(Request $request): JsonResponse { $query = (string) $request->get('search'); /** @var TransactionTypeRepositoryInterface $repository */ $repository = app(TransactionTypeRepositoryInterface::class); $array = $repository->searchTypes($query)->toArray(); foreach ($array as $index => $item) { // different key for consistency. $array[$index]['name'] = $item['type']; } return response()->json($array); } }