From f2eac1cbeac9f2ecbb604e07b1a4d2b9842ab3da Mon Sep 17 00:00:00 2001 From: Nyan Lin Htut <47136257+eddie-nyan@users.noreply.github.com> Date: Wed, 5 Nov 2025 14:42:31 +0700 Subject: [PATCH] Merge main into development (#40) * refactor: clean up RoutingHelper by removing unused code and comments * feat: add CSV download functionality for keyword filter groups * update: api v1 --------- Co-authored-by: NangKhatMang --- .../keyword_filter_groups_controller.rb | 45 ++++++++++++++++++- app/helpers/routing_helper.rb | 9 ---- app/models/keyword_filter.rb | 2 + .../keyword_filter_groups/show.html.haml | 8 ++-- app/views/server_settings/index.html.haml | 4 ++ config/routes.rb | 4 ++ config/routes/api_v1.rb | 2 +- 7 files changed, 60 insertions(+), 14 deletions(-) diff --git a/app/controllers/keyword_filter_groups_controller.rb b/app/controllers/keyword_filter_groups_controller.rb index cf178aa2..0d1817f8 100644 --- a/app/controllers/keyword_filter_groups_controller.rb +++ b/app/controllers/keyword_filter_groups_controller.rb @@ -1,5 +1,5 @@ class KeywordFilterGroupsController < ApplicationController - before_action :set_keyword_filter_group, only: [:show, :edit, :update, :destroy, :update_is_active] + before_action :set_keyword_filter_group, only: [:show, :edit, :update, :destroy, :update_is_active, :download_csv] def index @keyword_filter_groups = KeywordFilterGroup.all @@ -58,6 +58,49 @@ def update_is_active end end + def download_csv + require 'csv' + filters = @keyword_filter_group.keyword_filters + csv_data = CSV.generate(headers: true) do |csv| + csv << ["Name", "Server Setting", "Is Active", "Keyword", "Filter Type"] + filters.each do |kf| + csv << [ + @keyword_filter_group.name, + @keyword_filter_group.server_setting&.name, + @keyword_filter_group.is_active ? 'True' : 'False', + kf.keyword, + kf.filter_type + ] + end + end + send_data csv_data, filename: "#{@keyword_filter_group.server_setting&.name&.parameterize}-#{@keyword_filter_group.name&.parameterize}.csv" + end + + def download_csv_by_server_setting + require 'csv' + server_setting_id = params[:server_setting_id] + server_setting = ServerSetting.find_by_id(server_setting_id) + keyword_filters = KeywordFilter.joins(:keyword_filter_group) + .where(keyword_filter_groups: { server_setting_id: server_setting_id }) + + csv_data = CSV.generate(headers: true) do |csv| + csv << ["Group Name", "Server Setting", "Group Active", "Keyword", "Filter Type", "Custom Group"] + keyword_filters.find_each do |kf| + group = kf.keyword_filter_group + csv << [ + group&.name, + group&.server_setting&.name, + group&.is_active ? 'True' : 'False', + kf.keyword, + kf.filter_type, + group&.is_custom ? 'True' : 'False' + ] + end + end + + send_data csv_data, filename: "#{server_setting&.name&.parameterize}.csv" + end + private def set_keyword_filter_group diff --git a/app/helpers/routing_helper.rb b/app/helpers/routing_helper.rb index 0488004b..e987279b 100644 --- a/app/helpers/routing_helper.rb +++ b/app/helpers/routing_helper.rb @@ -4,15 +4,6 @@ module RoutingHelper extend ActiveSupport::Concern include ActionView::Helpers::AssetTagHelper - # include Webpacker::Helper - - included do - include Rails.application.routes.url_helpers - - def default_url_options - ActionMailer::Base.default_url_options - end - end def full_asset_url(source, **) source = ActionController::Base.helpers.asset_url(source, **) unless use_storage? diff --git a/app/models/keyword_filter.rb b/app/models/keyword_filter.rb index fd894aca..1cda9c8f 100644 --- a/app/models/keyword_filter.rb +++ b/app/models/keyword_filter.rb @@ -19,6 +19,8 @@ class KeywordFilter < ApplicationRecord self.table_name = 'keyword_filters' validates :keyword, presence: true, uniqueness: true + belongs_to :keyword_filter_group + enum filter_type: { content: 0, hashtag: 1, both: 2 } end diff --git a/app/views/keyword_filter_groups/show.html.haml b/app/views/keyword_filter_groups/show.html.haml index 01b45b7c..7aabe0d4 100644 --- a/app/views/keyword_filter_groups/show.html.haml +++ b/app/views/keyword_filter_groups/show.html.haml @@ -6,11 +6,13 @@ .card .card-header %h3.card-title= @keyword_filter_group.name - - if @keyword_filter_group.is_custom? - .card-tools - .input-group.input-group-sm{"data-toggle" => "tooltip", "data-placement" => "top", "title"=>"Actions"} + .card-tools + .input-group.input-group-sm{"data-toggle" => "tooltip", "data-placement" => "top", "title"=>"Actions"} + - if @keyword_filter_group.is_custom? = link_to new_keyword_filter_group_keyword_filter_path(@keyword_filter_group), class: 'form-control float-right mr-2', title: 'Add new keyword' do %i.fa-solid.fa-circle-plus + = link_to download_csv_keyword_filter_group_path(@keyword_filter_group, format: :csv), class: 'form-control float-right', title: 'Download CSV', 'data-turbo' => false do + %i.fa-solid.fa-download .card-body %table#datatable.table.table-striped.table-bordered{data: {url: keyword_filter_group_url(@keyword_filter_group), type: 'keyword_filter_group_list', 'is-custom': @keyword_filter_group.is_custom?.to_s}} diff --git a/app/views/server_settings/index.html.haml b/app/views/server_settings/index.html.haml index 79f30178..5ab15569 100644 --- a/app/views/server_settings/index.html.haml +++ b/app/views/server_settings/index.html.haml @@ -65,6 +65,8 @@ %a{ href: '#', style: 'color: red;', title: 'Add custom filter', 'data-filter-type': 'content', 'data-id': option[:id], 'data-toggle': 'modal', 'data-target': '#keyFilterModal', 'data-label': 'Custom filter name' } Add custom filter %div + %a{ href: download_csv_by_server_setting_keyword_filter_groups_path(format: :csv, server_setting_id: option[:id]), title: 'Download CSV', 'data-turbo': false, style: 'color: red;' } + %i.fa-solid.fa-download.mr-1 %a{ href: "##{collapse_id}", role: "button", class: "collapse-toggle arrow-toggle", 'data-toggle': "collapse", 'aria-expanded': "false", 'aria-controls': collapse_id } %i.fa-solid.fa-caret-down.icon-arrow-down %i.fa-solid.fa-caret-up.icon-arrow-up @@ -86,6 +88,8 @@ %span.ml-2 = sub_option[:name] %div + %a{ href: download_csv_keyword_filter_group_path(sub_option[:id], format: :csv), title: 'Download CSV', 'data-turbo': false, style: 'color: red;' } + %i.fa-solid.fa-download.ml-2 %a{ href: keyword_filter_group_path(sub_option[:id]), title: 'Edit' } = image_tag("icons/edit-btn.svg", class: "ml-2", width: "16", height: "16") - if sub_option[:is_custom] diff --git a/config/routes.rb b/config/routes.rb index ccad7ee1..9b7e0147 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -78,6 +78,10 @@ resources :keyword_filter_groups do member do patch :update_is_active + get :download_csv + end + collection do + get :download_csv_by_server_setting end resources :keyword_filters end diff --git a/config/routes/api_v1.rb b/config/routes/api_v1.rb index 0dd7e4c2..46622bb9 100644 --- a/config/routes/api_v1.rb +++ b/config/routes/api_v1.rb @@ -17,7 +17,7 @@ when 'channel' { display: true, app_name: 'channel' } when 'mo-me' - { display: true, app_name: 'mo-me' } + { display: false, app_name: 'mo-me' } else { display: true, app_name: app_name } end