mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-19 05:09:38 +02:00
Add tag filtering (#1240)
This commit is contained in:
parent
73d61fc990
commit
e8d7ee3270
5 changed files with 40 additions and 6 deletions
|
@ -94,7 +94,7 @@ class TransactionsController < ApplicationController
|
|||
|
||||
def search_params
|
||||
params.fetch(:q, {})
|
||||
.permit(:start_date, :end_date, :search, :amount, :amount_operator, accounts: [], account_ids: [], categories: [], merchants: [], types: [])
|
||||
.permit(:start_date, :end_date, :search, :amount, :amount_operator, accounts: [], account_ids: [], categories: [], merchants: [], types: [], tags: [])
|
||||
end
|
||||
|
||||
def transaction_entry_params
|
||||
|
|
|
@ -3,9 +3,10 @@ module TransactionsHelper
|
|||
[
|
||||
{ key: "account_filter", icon: "layers" },
|
||||
{ key: "date_filter", icon: "calendar" },
|
||||
{ key: "type_filter", icon: "shapes" },
|
||||
{ key: "type_filter", icon: "tag" },
|
||||
{ key: "amount_filter", icon: "hash" },
|
||||
{ key: "category_filter", icon: "tag" },
|
||||
{ key: "category_filter", icon: "shapes" },
|
||||
{ key: "tag_filter", icon: "tags" },
|
||||
{ key: "merchant_filter", icon: "store" }
|
||||
]
|
||||
end
|
||||
|
|
|
@ -13,8 +13,15 @@ class Account::Transaction < ApplicationRecord
|
|||
class << self
|
||||
def search(params)
|
||||
query = all
|
||||
query = query.joins("LEFT JOIN categories ON categories.id = account_transactions.category_id").where(categories: { name: params[:categories] }) if params[:categories].present?
|
||||
query = query.joins("LEFT JOIN merchants ON merchants.id = account_transactions.merchant_id").where(merchants: { name: params[:merchants] }) if params[:merchants].present?
|
||||
query = query.joins(:category).where(categories: { name: params[:categories] }) if params[:categories].present?
|
||||
query = query.joins(:merchant).where(merchants: { name: params[:merchants] }) if params[:merchants].present?
|
||||
|
||||
if params[:tags].present?
|
||||
query = query.joins(:tags)
|
||||
.where(tags: { name: params[:tags] })
|
||||
.distinct
|
||||
end
|
||||
|
||||
query
|
||||
end
|
||||
|
||||
|
@ -25,7 +32,7 @@ class Account::Transaction < ApplicationRecord
|
|||
private
|
||||
|
||||
def searchable_keys
|
||||
%i[categories merchants]
|
||||
%i[categories merchants tags]
|
||||
end
|
||||
end
|
||||
|
||||
|
|
25
app/views/transactions/searches/filters/_tag_filter.html.erb
Normal file
25
app/views/transactions/searches/filters/_tag_filter.html.erb
Normal file
|
@ -0,0 +1,25 @@
|
|||
<%# locals: (form:) %>
|
||||
<div data-controller="list-filter">
|
||||
<div class="relative">
|
||||
<input type="search" autocomplete="off" placeholder="Filter tags" data-list-filter-target="input" data-action="input->list-filter#filter" class="block w-full border border-gray-200 rounded-md py-2 pl-10 pr-3 focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm">
|
||||
<%= lucide_icon("search", class: "w-5 h-5 text-gray-500 absolute inset-y-0 left-2 top-1/2 transform -translate-y-1/2") %>
|
||||
</div>
|
||||
<div class="my-2" id="list" data-list-filter-target="list">
|
||||
<% Current.family.tags.alphabetically.each do |tag| %>
|
||||
<div class="filterable-item flex items-center gap-2 p-2" data-filter-name="<%= tag.name %>">
|
||||
<%= form.check_box :tags,
|
||||
{
|
||||
multiple: true,
|
||||
checked: @q[:tags]&.include?(tag.name),
|
||||
class: "maybe-checkbox maybe-checkbox--light"
|
||||
},
|
||||
tag.name,
|
||||
nil %>
|
||||
<%= form.label :tags, value: tag.name, class: "text-sm text-gray-900 flex items-center gap-2" do %>
|
||||
<%= circle_logo(tag.name, hex: tag.color || Tag::UNCATEGORIZED_COLOR, size: "sm") %>
|
||||
<%= tag.name %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
|
@ -70,6 +70,7 @@ en:
|
|||
clear_filters: Clear filters
|
||||
date_filter: Date
|
||||
merchant_filter: Merchant
|
||||
tag_filter: Tag
|
||||
type_filter: Type
|
||||
search:
|
||||
equal_to: equal to
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue