Skip to content

Commit bd53285

Browse files
committed
Merge branch 'dev'
2 parents b51bd62 + 4fcd77f commit bd53285

File tree

91 files changed

+1699
-361
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+1699
-361
lines changed

.github/workflows/rubyonrails.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
name: "Ruby on Rails CI"
88
on:
99
push:
10-
branches: [ "main" ]
10+
branches: [ "main", "dev" ]
1111
pull_request:
12-
branches: [ "main", "wip/new-to-nl-2" ]
12+
branches: [ "main", "dev" ]
1313
jobs:
1414
rspec:
1515
runs-on: ubuntu-latest

Dockerfile.dev

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,23 @@
22

33
FROM ruby:3.2.2
44

5+
# Add system dependencies needed for building gems, running JS, and running Chrome Headless
56
RUN apt-get update -qq \
67
&& apt-get install -y build-essential postgresql-client libpq-dev \
7-
nodejs libssl-dev apt-transport-https ca-certificates libvips42 nano
8+
nodejs libssl-dev apt-transport-https ca-certificates libvips42 nano \
9+
chromium chromium-driver
810

11+
# Create app directory
912
RUN mkdir /community-engine
1013
WORKDIR /community-engine
14+
15+
# Pre-bundle install step
1116
COPY Gemfile /community-engine/Gemfile
1217
COPY Gemfile.lock /community-engine/Gemfile.lock
1318

19+
# Use specific Bundler version (you could also lock this in your Gemfile.lock instead)
1420
RUN gem uninstall bundler
1521
RUN gem install bundler:2.4.13
1622

23+
# Copy entire app source (this assumes you're using volume mounting during development)
1724
COPY . /community-engine

Gemfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,14 @@ end
9797
group :test do
9898
# Capybara for integration testing
9999
gem 'capybara', '>= 2.15'
100+
gem 'capybara-screenshot'
100101
# Coveralls for test coverage reporting
101102
gem 'coveralls_reborn', require: false
102103
# Database cleaner for test database cleaning
103104
gem 'database_cleaner'
104105
gem 'database_cleaner-active_record'
105106
# # Easy installation and use of chromedriver to run system tests with Chrome
106-
gem 'webdrivers'
107+
# gem 'webdrivers'
107108
# RuboCop RSpec for RSpec-specific code analysis
108109
gem 'rubocop-rspec'
109110
# RSpec for unit testing

Gemfile.lock

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,11 @@ GEM
215215
rack-test (>= 0.6.3)
216216
regexp_parser (>= 1.5, < 3.0)
217217
xpath (~> 3.2)
218+
capybara-screenshot (1.0.26)
219+
capybara (>= 1.0, < 4)
220+
launchy
221+
childprocess (5.1.0)
222+
logger (~> 1.5)
218223
coderay (1.1.3)
219224
coercible (1.0.0)
220225
descendants_tracker (~> 0.0.1)
@@ -390,6 +395,10 @@ GEM
390395
jwt (2.10.1)
391396
base64
392397
language_server-protocol (3.17.0.4)
398+
launchy (3.1.1)
399+
addressable (~> 2.8)
400+
childprocess (~> 5.0)
401+
logger (~> 1.6)
393402
lint_roller (1.1.0)
394403
listen (3.9.0)
395404
rb-fsevent (~> 0.10, >= 0.10.3)
@@ -716,10 +725,6 @@ GEM
716725
activemodel (>= 6.0.0)
717726
bindex (>= 0.4.0)
718727
railties (>= 6.0.0)
719-
webdrivers (5.2.0)
720-
nokogiri (~> 1.6)
721-
rubyzip (>= 1.3.0)
722-
selenium-webdriver (~> 4.0)
723728
websocket (1.2.11)
724729
websocket-driver (0.7.7)
725730
base64
@@ -744,6 +749,7 @@ DEPENDENCIES
744749
bundler-audit
745750
byebug
746751
capybara (>= 2.15)
752+
capybara-screenshot
747753
coveralls_reborn
748754
database_cleaner
749755
database_cleaner-active_record
@@ -783,7 +789,6 @@ DEPENDENCIES
783789
storext!
784790
uglifier (>= 1.3.0)
785791
web-console (>= 3.3.0)
786-
webdrivers
787792

788793
RUBY VERSION
789794
ruby 3.2.2p53

app/controllers/better_together/application_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def extract_locale_from_accept_language_header
136136

137137
def set_locale
138138
locale = params[:locale] || # Request parameter
139-
# (current_user.preferred_locale if user_signed_in?) || # Model saved configuration
139+
current_person&.locale || # Model saved configuration
140140
extract_locale_from_accept_language_header || # Language header - browser config
141141
I18n.default_locale # Set in your config files, english by super-default
142142

app/controllers/better_together/conversations_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module BetterTogether
44
# Handles managing conversations
55
class ConversationsController < ApplicationController
66
before_action :authenticate_user!
7-
before_action :set_conversations, only: %i[index new]
7+
before_action :set_conversations, only: %i[index new show]
88
before_action :set_conversation, only: %i[show]
99

1010
helper_method :available_participants
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
# frozen_string_literal: true
2+
3+
module BetterTogether
4+
module Metrics
5+
# rubocop:todo Layout/LineLength
6+
# Manage LinkClickReport records tracking instances of reports run against the BetterTogether::Metrics::LinkClick records
7+
# rubocop:enable Layout/LineLength
8+
class LinkClickReportsController < ApplicationController
9+
before_action :set_link_click_report, only: [:download]
10+
11+
# GET /metrics/link_click_reports
12+
def index
13+
@link_click_reports = BetterTogether::Metrics::LinkClickReport.order(created_at: :desc)
14+
if request.headers['Turbo-Frame'].present?
15+
render partial: 'better_together/metrics/link_click_reports/index',
16+
locals: { link_click_reports: @link_click_reports }, layout: false
17+
else
18+
render :index
19+
end
20+
end
21+
22+
# GET /metrics/link_click_reports/new
23+
def new
24+
@link_click_report = BetterTogether::Metrics::LinkClickReport.new
25+
# For LinkClick reports, you might want to let users filter by internal or external clicks.
26+
# For example, providing a selection list for internal (true) or external (false) clicks.
27+
@internal_options = [true, false]
28+
end
29+
30+
# POST /metrics/link_click_reports
31+
def create # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
32+
opts = {
33+
from_date: link_click_report_params.dig(:filters, :from_date),
34+
to_date: link_click_report_params.dig(:filters, :to_date),
35+
filter_internal: link_click_report_params.dig(:filters, :filter_internal),
36+
sort_by_total_clicks: link_click_report_params[:sort_by_total_clicks],
37+
file_format: link_click_report_params[:file_format]
38+
}
39+
40+
@link_click_report = BetterTogether::Metrics::LinkClickReport.create_and_generate!(**opts)
41+
42+
respond_to do |format| # rubocop:todo Metrics/BlockLength
43+
if @link_click_report.persisted?
44+
flash[:notice] = 'Report was successfully created.'
45+
format.html { redirect_to metrics_link_click_reports_path, notice: flash[:notice] }
46+
format.turbo_stream do
47+
render turbo_stream: [
48+
turbo_stream.prepend('link_click_reports_table_body',
49+
partial: 'better_together/metrics/link_click_reports/link_click_report',
50+
locals: { link_click_report: @link_click_report }),
51+
turbo_stream.replace('flash_messages',
52+
partial: 'layouts/better_together/flash_messages',
53+
locals: { flash: flash }),
54+
turbo_stream.replace('new_report', '<turbo-frame id="new_report"></turbo-frame>')
55+
]
56+
end
57+
else
58+
flash.now[:alert] = 'Error creating report.'
59+
format.html { render :new, status: :unprocessable_entity }
60+
format.turbo_stream do
61+
render turbo_stream: [
62+
turbo_stream.update('form_errors',
63+
partial: 'layouts/errors',
64+
locals: { object: @link_click_report }),
65+
turbo_stream.replace('flash_messages',
66+
partial: 'layouts/better_together/flash_messages',
67+
locals: { flash: flash })
68+
]
69+
end
70+
end
71+
end
72+
end
73+
74+
# GET /metrics/link_click_reports/:id/download
75+
# rubocop:todo Metrics/MethodLength
76+
def download # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
77+
report = @link_click_report
78+
if report.report_file.attached?
79+
# Log the download via a background job.
80+
BetterTogether::Metrics::TrackDownloadJob.perform_later(
81+
report, # Fully namespaced model
82+
report.report_file.filename.to_s, # Filename
83+
report.report_file.content_type, # Content type
84+
report.report_file.byte_size, # File size
85+
I18n.locale.to_s # Locale
86+
)
87+
88+
send_data report.report_file.download,
89+
filename: report.report_file.filename.to_s,
90+
type: report.report_file.content_type,
91+
disposition: 'attachment'
92+
else
93+
redirect_to metrics_link_click_reports_path, alert: t('resources.download_failed')
94+
end
95+
end
96+
# rubocop:enable Metrics/MethodLength
97+
98+
private
99+
100+
def set_link_click_report
101+
@link_click_report = BetterTogether::Metrics::LinkClickReport.find(params[:id])
102+
end
103+
104+
def link_click_report_params
105+
params.require(:metrics_link_click_report).permit(
106+
:sort_by_total_clicks, :file_format,
107+
filters: %i[from_date to_date filter_internal]
108+
)
109+
end
110+
end
111+
end
112+
end
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# frozen_string_literal: true
2+
3+
module BetterTogether
4+
module Metrics
5+
# rubocop:todo Layout/LineLength
6+
# Manage PageViewReport records tracking instances of reports run against the BetterTogether::Metrics::PageView records
7+
# rubocop:enable Layout/LineLength
8+
class PageViewReportsController < ApplicationController
9+
before_action :set_page_view_report, only: [:download]
10+
11+
# GET /metrics/page_view_reports
12+
def index
13+
@page_view_reports = BetterTogether::Metrics::PageViewReport.order(created_at: :desc)
14+
if request.headers['Turbo-Frame'].present?
15+
render partial: 'better_together/metrics/page_view_reports/index',
16+
locals: { page_view_reports: @page_view_reports }, layout: false
17+
else
18+
render :index
19+
end
20+
end
21+
22+
# GET /metrics/page_view_reports/new
23+
def new
24+
@page_view_report = BetterTogether::Metrics::PageViewReport.new
25+
@pageable_types = BetterTogether::Metrics::PageView.distinct.pluck(:pageable_type).sort
26+
end
27+
28+
# POST /metrics/page_view_reports
29+
def create # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
30+
opts = {
31+
from_date: page_view_report_params.dig(:filters, :from_date),
32+
to_date: page_view_report_params.dig(:filters, :to_date),
33+
filter_pageable_type: page_view_report_params.dig(:filters, :filter_pageable_type),
34+
sort_by_total_views: page_view_report_params[:sort_by_total_views],
35+
file_format: page_view_report_params[:file_format]
36+
}
37+
38+
@page_view_report = BetterTogether::Metrics::PageViewReport.create_and_generate!(**opts)
39+
40+
respond_to do |format| # rubocop:todo Metrics/BlockLength
41+
if @page_view_report.persisted?
42+
flash[:notice] = 'Report was successfully created.'
43+
format.html { redirect_to metrics_page_view_reports_path, notice: flash[:notice] }
44+
format.turbo_stream do
45+
render turbo_stream: [
46+
turbo_stream.prepend('page_view_reports_table_body',
47+
partial: 'better_together/metrics/page_view_reports/page_view_report',
48+
locals: { page_view_report: @page_view_report }),
49+
turbo_stream.replace('flash_messages',
50+
partial: 'layouts/better_together/flash_messages',
51+
locals: { flash: flash }),
52+
# rubocop:todo Layout/LineLength
53+
turbo_stream.replace('new_report', '<turbo-frame id="new_report"></turbo-frame>') # Clear the new report form frame
54+
# rubocop:enable Layout/LineLength
55+
]
56+
end
57+
else
58+
flash.now[:alert] = 'Error creating report.'
59+
format.html { render :new, status: :unprocessable_entity }
60+
format.turbo_stream do
61+
render turbo_stream: [
62+
turbo_stream.update('form_errors',
63+
partial: 'layouts/errors',
64+
locals: { object: @page_view_report }),
65+
turbo_stream.replace('flash_messages',
66+
partial: 'layouts/better_together/flash_messages',
67+
locals: { flash: flash })
68+
]
69+
end
70+
end
71+
end
72+
end
73+
74+
# GET /metrics/page_view_reports/:id/download
75+
def download # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
76+
report = @page_view_report
77+
if report.report_file.attached?
78+
# Log the download via a background job.
79+
BetterTogether::Metrics::TrackDownloadJob.perform_later(
80+
report, # Full namespaced model
81+
report.report_file.filename.to_s, # Filename
82+
report.report_file.content_type, # Content type
83+
report.report_file.byte_size, # File size
84+
I18n.locale.to_s # Locale
85+
)
86+
87+
send_data report.report_file.download,
88+
filename: report.report_file.filename.to_s,
89+
type: report.report_file.content_type,
90+
disposition: 'attachment'
91+
else
92+
redirect_to metrics_page_view_reports_path, alert: t('resources.download_failed')
93+
end
94+
end
95+
96+
private
97+
98+
def set_page_view_report
99+
@page_view_report = BetterTogether::Metrics::PageViewReport.find(params[:id])
100+
end
101+
102+
def page_view_report_params
103+
params.require(:metrics_page_view_report).permit(
104+
:sort_by_total_views, :file_format,
105+
filters: %i[from_date to_date filter_pageable_type]
106+
)
107+
end
108+
end
109+
end
110+
end

app/controllers/better_together/metrics/reports_controller.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ def index # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
2323
.limit(20)
2424
.count
2525

26+
# Use group_by_day from groupdate to group daily Link Clicks, and sort them automatically by date
27+
@link_clicks_daily = BetterTogether::Metrics::LinkClick
28+
.group_by_day(:clicked_at)
29+
.count
30+
2631
# Group Link Clicks by internal/external, sorted by internal status first
2732
@internal_vs_external = BetterTogether::Metrics::LinkClick
2833
.group(:internal)

app/controllers/concerns/better_together/wizard_methods.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def determine_wizard_outcome # rubocop:todo Metrics/AbcSize
1616

1717
if wizard.completed?
1818
flash[:notice] = wizard.success_message
19+
# TODO: This needs to be adjusted for private platforms. Flash message is not retained after wizard completion
1920
redirect_to wizard.success_path
2021
else
2122
next_step_path, flash_key, message = wizard_next_step_info

0 commit comments

Comments
 (0)