mirror of
https://github.com/firefly-iii/firefly-iii.git
synced 2025-09-05 04:03:26 +00:00
New features for rules in search.
This commit is contained in:
@@ -92,14 +92,7 @@ class IndexController extends Controller
|
||||
public function search(Rule $rule): RedirectResponse
|
||||
{
|
||||
$route = route('search.index');
|
||||
$params = [];
|
||||
/** @var RuleTrigger $trigger */
|
||||
foreach ($rule->ruleTriggers as $trigger) {
|
||||
if ('user_action' !== $trigger->trigger_type) {
|
||||
$params[] = sprintf('%s:"%s"', OperatorQuerySearch::getRootOperator($trigger->trigger_type), $trigger->trigger_value);
|
||||
}
|
||||
}
|
||||
$query = implode(' ', $params);
|
||||
$query = $this->ruleRepos->getSearchQuery($rule);
|
||||
$route = sprintf('%s?%s', $route, http_build_query(['search' => $query, 'rule' => $rule->id]));
|
||||
|
||||
return redirect($route);
|
||||
|
@@ -189,4 +189,51 @@ class SelectController extends Controller
|
||||
return response()->json(['html' => $view, 'warning' => $warning]);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method allows the user to test a certain set of rule triggers. The rule triggers are grabbed from
|
||||
* the rule itself.
|
||||
*
|
||||
* @param Rule $rule
|
||||
*
|
||||
* @return JsonResponse
|
||||
*
|
||||
*/
|
||||
public function testTriggersByRule(Rule $rule): JsonResponse
|
||||
{
|
||||
$triggers = $rule->ruleTriggers;
|
||||
|
||||
if (0 === count($triggers)) {
|
||||
return response()->json(['html' => '', 'warning' => (string) trans('firefly.warning_no_valid_triggers')]); // @codeCoverageIgnore
|
||||
}
|
||||
|
||||
|
||||
// create new rule engine:
|
||||
$newRuleEngine = app(RuleEngineInterface::class);
|
||||
|
||||
// set rules:
|
||||
$newRuleEngine->setRules(new Collection([$rule]));
|
||||
$collection = $newRuleEngine->find();
|
||||
$collection = $collection->slice(0, 20);
|
||||
|
||||
$warning = '';
|
||||
if (0 === count($collection)) {
|
||||
$warning = (string) trans('firefly.warning_no_matching_transactions'); // @codeCoverageIgnore
|
||||
}
|
||||
|
||||
// Return json response
|
||||
$view = 'ERROR, see logs.';
|
||||
try {
|
||||
$view = view('list.journals-array-tiny', ['groups' => $collection])->render();
|
||||
// @codeCoverageIgnoreStart
|
||||
} catch (Throwable $exception) {
|
||||
Log::error(sprintf('Could not render view in testTriggersByRule(): %s', $exception->getMessage()));
|
||||
Log::error($exception->getTraceAsString());
|
||||
}
|
||||
|
||||
// @codeCoverageIgnoreEnd
|
||||
|
||||
return response()->json(['html' => $view, 'warning' => $warning]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -22,6 +22,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace FireflyIII\Http\Controllers;
|
||||
|
||||
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
|
||||
use FireflyIII\Support\Search\SearchInterface;
|
||||
use Illuminate\Contracts\View\Factory;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@@ -62,15 +63,33 @@ class SearchController extends Controller
|
||||
*/
|
||||
public function index(Request $request, SearchInterface $searcher)
|
||||
{
|
||||
$fullQuery = (string) $request->get('search');
|
||||
$page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
|
||||
// search params:
|
||||
$fullQuery = (string) $request->get('search');
|
||||
$page = 0 === (int) $request->get('page') ? 1 : (int) $request->get('page');
|
||||
$ruleId = (int) $request->get('rule');
|
||||
$rule = null;
|
||||
$ruleChanged = false;
|
||||
|
||||
// find rule, check if query is different, offer to update.
|
||||
$ruleRepository = app(RuleRepositoryInterface::class);
|
||||
$rule = $ruleRepository->find($ruleId);
|
||||
if (null !== $rule) {
|
||||
$originalQuery = $ruleRepository->getSearchQuery($rule);
|
||||
if ($originalQuery !== $fullQuery) {
|
||||
$ruleChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
// parse search terms:
|
||||
$searcher->parseQuery($fullQuery);
|
||||
$query = $searcher->getWordsAsString();
|
||||
$modifiers = $searcher->getModifiers();
|
||||
$subTitle = (string) trans('breadcrumbs.search_result', ['query' => $query]);
|
||||
|
||||
return view('search.index', compact('query', 'modifiers', 'page', 'fullQuery', 'subTitle'));
|
||||
// words from query and operators:
|
||||
$query = $searcher->getWordsAsString();
|
||||
$operators = $searcher->getOperators();
|
||||
|
||||
$subTitle = (string) trans('breadcrumbs.search_result', ['query' => $fullQuery]);
|
||||
|
||||
return view('search.index', compact('query', 'operators', 'page', 'rule', 'fullQuery', 'subTitle', 'ruleId', 'ruleChanged'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -27,6 +27,7 @@ use FireflyIII\Models\Rule;
|
||||
use FireflyIII\Models\RuleAction;
|
||||
use FireflyIII\Models\RuleGroup;
|
||||
use FireflyIII\Models\RuleTrigger;
|
||||
use FireflyIII\Support\Search\OperatorQuerySearch;
|
||||
use FireflyIII\User;
|
||||
use Illuminate\Support\Collection;
|
||||
use Log;
|
||||
@@ -119,7 +120,7 @@ class RuleRepository implements RuleRepositoryInterface
|
||||
*/
|
||||
public function getHighestOrderInRuleGroup(RuleGroup $ruleGroup): int
|
||||
{
|
||||
return (int)$ruleGroup->rules()->max('order');
|
||||
return (int) $ruleGroup->rules()->max('order');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -461,8 +462,8 @@ class RuleRepository implements RuleRepositoryInterface
|
||||
*/
|
||||
public function duplicate(Rule $rule): Rule
|
||||
{
|
||||
$newRule = $rule->replicate();
|
||||
$newRule->title = (string)trans('firefly.rule_copy_of', ['title' => $rule->title]);
|
||||
$newRule = $rule->replicate();
|
||||
$newRule->title = (string) trans('firefly.rule_copy_of', ['title' => $rule->title]);
|
||||
$newRule->save();
|
||||
|
||||
// replicate all triggers
|
||||
@@ -503,13 +504,13 @@ class RuleRepository implements RuleRepositoryInterface
|
||||
*/
|
||||
public function getStoreRules(): Collection
|
||||
{
|
||||
$collection = $this->user->rules()->with(['ruleGroup','ruleTriggers'])->get();
|
||||
$filtered = new Collection;
|
||||
$collection = $this->user->rules()->with(['ruleGroup', 'ruleTriggers'])->get();
|
||||
$filtered = new Collection;
|
||||
/** @var Rule $rule */
|
||||
foreach($collection as $rule) {
|
||||
foreach ($collection as $rule) {
|
||||
/** @var RuleTrigger $ruleTrigger */
|
||||
foreach($rule->ruleTriggers as $ruleTrigger) {
|
||||
if('user_action' === $ruleTrigger->trigger_type && 'store-journal' === $ruleTrigger->trigger_value) {
|
||||
foreach ($rule->ruleTriggers as $ruleTrigger) {
|
||||
if ('user_action' === $ruleTrigger->trigger_type && 'store-journal' === $ruleTrigger->trigger_value) {
|
||||
$filtered->push($rule);
|
||||
}
|
||||
}
|
||||
@@ -522,17 +523,33 @@ class RuleRepository implements RuleRepositoryInterface
|
||||
*/
|
||||
public function getUpdateRules(): Collection
|
||||
{
|
||||
$collection = $this->user->rules()->with(['ruleGroup','ruleTriggers'])->get();
|
||||
$filtered = new Collection;
|
||||
$collection = $this->user->rules()->with(['ruleGroup', 'ruleTriggers'])->get();
|
||||
$filtered = new Collection;
|
||||
/** @var Rule $rule */
|
||||
foreach($collection as $rule) {
|
||||
foreach ($collection as $rule) {
|
||||
/** @var RuleTrigger $ruleTrigger */
|
||||
foreach($rule->ruleTriggers as $ruleTrigger) {
|
||||
if('user_action' === $ruleTrigger->trigger_type && 'update-journal' === $ruleTrigger->trigger_value) {
|
||||
foreach ($rule->ruleTriggers as $ruleTrigger) {
|
||||
if ('user_action' === $ruleTrigger->trigger_type && 'update-journal' === $ruleTrigger->trigger_value) {
|
||||
$filtered->push($rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $filtered;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getSearchQuery(Rule $rule): string
|
||||
{
|
||||
$params = [];
|
||||
/** @var RuleTrigger $trigger */
|
||||
foreach ($rule->ruleTriggers as $trigger) {
|
||||
if ('user_action' !== $trigger->trigger_type) {
|
||||
$params[] = sprintf('%s:"%s"', OperatorQuerySearch::getRootOperator($trigger->trigger_type), $trigger->trigger_value);
|
||||
}
|
||||
}
|
||||
return implode(' ', $params);
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -39,6 +39,14 @@ interface RuleRepositoryInterface
|
||||
*/
|
||||
public function count(): int;
|
||||
|
||||
/**
|
||||
* Return search query for rule.
|
||||
*
|
||||
* @param Rule $rule
|
||||
* @return string
|
||||
*/
|
||||
public function getSearchQuery(Rule $rule): string;
|
||||
|
||||
/**
|
||||
* @param Rule $rule
|
||||
* @param RuleGroup $ruleGroup
|
||||
|
Reference in New Issue
Block a user