1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-19 13:19:39 +02:00

Add tag filtering (#1240)

This commit is contained in:
Zach Gollwitzer 2024-10-04 09:17:48 -04:00 committed by GitHub
parent 73d61fc990
commit e8d7ee3270
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 40 additions and 6 deletions

View file

@ -94,7 +94,7 @@ class TransactionsController < ApplicationController
def search_params def search_params
params.fetch(:q, {}) 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 end
def transaction_entry_params def transaction_entry_params

View file

@ -3,9 +3,10 @@ module TransactionsHelper
[ [
{ key: "account_filter", icon: "layers" }, { key: "account_filter", icon: "layers" },
{ key: "date_filter", icon: "calendar" }, { key: "date_filter", icon: "calendar" },
{ key: "type_filter", icon: "shapes" }, { key: "type_filter", icon: "tag" },
{ key: "amount_filter", icon: "hash" }, { 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" } { key: "merchant_filter", icon: "store" }
] ]
end end

View file

@ -13,8 +13,15 @@ class Account::Transaction < ApplicationRecord
class << self class << self
def search(params) def search(params)
query = all 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(:category).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(: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 query
end end
@ -25,7 +32,7 @@ class Account::Transaction < ApplicationRecord
private private
def searchable_keys def searchable_keys
%i[categories merchants] %i[categories merchants tags]
end end
end end

View 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>

View file

@ -70,6 +70,7 @@ en:
clear_filters: Clear filters clear_filters: Clear filters
date_filter: Date date_filter: Date
merchant_filter: Merchant merchant_filter: Merchant
tag_filter: Tag
type_filter: Type type_filter: Type
search: search:
equal_to: equal to equal_to: equal to