DRY supported_languages
This commit is contained in:
@@ -22,8 +22,7 @@ class Admin::DashboardController < Admin::BaseController
|
|||||||
.where("invitation_sent_at > ?", 14.days.ago)
|
.where("invitation_sent_at > ?", 14.days.ago)
|
||||||
.count
|
.count
|
||||||
|
|
||||||
@supported_languages = SupportedLanguage.where(active: true).order(:sort_order)
|
@language_completion = supported_languages.index_with do |language|
|
||||||
@language_completion = @supported_languages.index_with do |language|
|
|
||||||
next 0 if @entry_count.zero?
|
next 0 if @entry_count.zero?
|
||||||
|
|
||||||
(Entry.where.not(language.code => [ nil, "" ]).count * 100.0 / @entry_count).round
|
(Entry.where.not(language.code => [ nil, "" ]).count * 100.0 / @entry_count).round
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
class ApplicationController < ActionController::Base
|
class ApplicationController < ActionController::Base
|
||||||
|
|
||||||
# Changes to the importmap will invalidate the etag for HTML responses
|
# Changes to the importmap will invalidate the etag for HTML responses
|
||||||
stale_when_importmap_changes
|
stale_when_importmap_changes
|
||||||
|
|
||||||
helper_method :current_user, :logged_in?, :admin?, :reviewer_or_admin?, :contributor_or_above?, :setup_completed?
|
helper_method :supported_languages, :current_user, :logged_in?, :admin?, :reviewer_or_admin?,
|
||||||
|
:contributor_or_above?, :setup_completed?
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def supported_languages
|
||||||
|
@supported_languages ||= SupportedLanguage.where(active: true).order(:sort_order, :name)
|
||||||
|
end
|
||||||
|
|
||||||
def current_user
|
def current_user
|
||||||
@current_user ||= User.find_by(id: session[:user_id]) if session[:user_id]
|
@current_user ||= User.find_by(id: session[:user_id]) if session[:user_id]
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ class EntriesController < ApplicationController
|
|||||||
before_action :set_entry, only: [ :show ]
|
before_action :set_entry, only: [ :show ]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@supported_languages = SupportedLanguage.where(active: true).order(:sort_order, :name)
|
|
||||||
@language_code = params[:language].presence
|
@language_code = params[:language].presence
|
||||||
@category = params[:category].presence
|
@category = params[:category].presence
|
||||||
@query = params[:q].to_s.strip
|
@query = params[:q].to_s.strip
|
||||||
@@ -24,21 +23,21 @@ class EntriesController < ApplicationController
|
|||||||
@entry_count = Entry.count
|
@entry_count = Entry.count
|
||||||
@verified_count = Entry.where(verified: true).count
|
@verified_count = Entry.where(verified: true).count
|
||||||
@needs_review_count = @entry_count - @verified_count
|
@needs_review_count = @entry_count - @verified_count
|
||||||
@complete_entries_count = @supported_languages.reduce(Entry.all) do |scope, language|
|
@complete_entries_count = supported_languages.reduce(Entry.all) do |scope, language|
|
||||||
scope.where.not(language.code => [ nil, "" ])
|
scope.where.not(language.code => [ nil, "" ])
|
||||||
end.count
|
end.count
|
||||||
@missing_entries_count = @entry_count - @complete_entries_count
|
@missing_entries_count = @entry_count - @complete_entries_count
|
||||||
@language_completion = @supported_languages.index_with do |language|
|
@language_completion = supported_languages.index_with do |language|
|
||||||
next 0 if @entry_count.zero?
|
next 0 if @entry_count.zero?
|
||||||
|
|
||||||
(Entry.where.not(language.code => [ nil, "" ]).count * 100.0 / @entry_count).round
|
(Entry.where.not(language.code => [ nil, "" ]).count * 100.0 / @entry_count).round
|
||||||
end
|
end
|
||||||
|
|
||||||
if @language_code.present?
|
if @language_code.present?
|
||||||
primary_language, other_languages = @supported_languages.partition { |language| language.code == @language_code }
|
primary_language, other_languages = supported_languages.partition { |language| language.code == @language_code }
|
||||||
@display_languages = primary_language + other_languages
|
@display_languages = primary_language + other_languages
|
||||||
else
|
else
|
||||||
@display_languages = @supported_languages
|
@display_languages = supported_languages
|
||||||
end
|
end
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
@@ -48,7 +47,6 @@ class EntriesController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@supported_languages = SupportedLanguage.where(active: true).order(:sort_order, :name)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def download
|
def download
|
||||||
|
|||||||
@@ -1,2 +1,5 @@
|
|||||||
module ApplicationHelper
|
module ApplicationHelper
|
||||||
|
def language_name(code)
|
||||||
|
supported_languages.find { |l| l.code == code }&.name
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -115,7 +115,7 @@
|
|||||||
<h3 class="text-lg leading-6 font-medium text-gray-900">Language Completion</h3>
|
<h3 class="text-lg leading-6 font-medium text-gray-900">Language Completion</h3>
|
||||||
<div class="mt-5">
|
<div class="mt-5">
|
||||||
<div class="space-y-4">
|
<div class="space-y-4">
|
||||||
<% @supported_languages.each do |language| %>
|
<% supported_languages.each do |language| %>
|
||||||
<div>
|
<div>
|
||||||
<div class="flex items-center justify-between">
|
<div class="flex items-center justify-between">
|
||||||
<span class="text-sm font-medium text-gray-700"><%= language.native_name %></span>
|
<span class="text-sm font-medium text-gray-700"><%= language.native_name %></span>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
entries_path(all_language_params),
|
entries_path(all_language_params),
|
||||||
class: "px-3 py-1 rounded-full #{@language_code.blank? ? 'bg-slate-900 text-white' : 'bg-white border border-slate-200 text-slate-600 hover:border-slate-300'} text-xs font-semibold uppercase tracking-wider",
|
class: "px-3 py-1 rounded-full #{@language_code.blank? ? 'bg-slate-900 text-white' : 'bg-white border border-slate-200 text-slate-600 hover:border-slate-300'} text-xs font-semibold uppercase tracking-wider",
|
||||||
data: { turbo_stream: true } %>
|
data: { turbo_stream: true } %>
|
||||||
<% @supported_languages.each do |language| %>
|
<% supported_languages.each do |language| %>
|
||||||
<%= link_to "#{language.name} (#{language.code.upcase})",
|
<%= link_to "#{language.name} (#{language.code.upcase})",
|
||||||
entries_path(all_language_params.merge(language: language.code)),
|
entries_path(all_language_params.merge(language: language.code)),
|
||||||
class: "px-3 py-1 rounded-full #{@language_code == language.code ? 'bg-slate-900 text-white' : 'bg-white border border-slate-200 text-slate-600 hover:border-slate-300'} text-xs font-semibold uppercase tracking-wider",
|
class: "px-3 py-1 rounded-full #{@language_code == language.code ? 'bg-slate-900 text-white' : 'bg-white border border-slate-200 text-slate-600 hover:border-slate-300'} text-xs font-semibold uppercase tracking-wider",
|
||||||
|
|||||||
@@ -33,12 +33,19 @@
|
|||||||
|
|
||||||
<div class="p-6">
|
<div class="p-6">
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-y-6 gap-x-12">
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-y-6 gap-x-12">
|
||||||
<% @supported_languages.each do |language| %>
|
<% supported_languages.each do |language| %>
|
||||||
<% translation = entry_translation_for(@entry, language.code) %>
|
<% translation = entry_translation_for(@entry, language.code) %>
|
||||||
<% next if translation.blank? %>
|
<% next if translation.blank? %>
|
||||||
<div class="space-y-1">
|
<div class="space-y-2">
|
||||||
<span class="text-[10px] font-bold text-slate-400 uppercase tracking-tight"><%= "#{language.name} (#{language.code.upcase})" %></span>
|
<div class="grid grid-cols-2">
|
||||||
|
<span class="text-[10px] font-bold text-slate-400 uppercase tracking-tight"><%= "#{language.name} (#{language.code.upcase})" %></span>
|
||||||
|
</div>
|
||||||
<p class="text-2xl font-semibold text-slate-800"><%= translation %></p>
|
<p class="text-2xl font-semibold text-slate-800"><%= translation %></p>
|
||||||
|
<% if current_user %>
|
||||||
|
<div id="comment-details-<%= language.code %>">
|
||||||
|
<%= render "entries/language_comment_details", entry: @entry, language_code: language.code %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,29 +1,41 @@
|
|||||||
require "test_helper"
|
require "test_helper"
|
||||||
|
|
||||||
class CommentTest < ActiveSupport::TestCase
|
class CommentTest < ActiveSupport::TestCase
|
||||||
test "should be valid with a user, body, and commentable" do
|
test "should be valid with a user, body, commentable, and language code" do
|
||||||
user = users(:admin_user)
|
user = users(:contributor_user)
|
||||||
entry = entries(:one)
|
entry = entries(:one)
|
||||||
comment = Comment.new(user: user, body: "This is a comment.", commentable: entry)
|
language = supported_languages(:one)
|
||||||
|
comment = Comment.new(user: user, body: "This is a comment.", commentable: entry, language: language)
|
||||||
|
assert comment.valid?
|
||||||
|
end
|
||||||
|
|
||||||
|
test "should be valid without a language code" do
|
||||||
|
user = users(:contributor_user)
|
||||||
|
entry = entries(:one)
|
||||||
|
comment = Comment.new(user: user, body: "General note.", commentable: entry, language_code: nil)
|
||||||
assert comment.valid?
|
assert comment.valid?
|
||||||
end
|
end
|
||||||
|
|
||||||
test "should be invalid without a body" do
|
test "should be invalid without a body" do
|
||||||
user = users(:admin_user)
|
user = users(:contributor_user)
|
||||||
entry = entries(:one)
|
entry = entries(:one)
|
||||||
comment = Comment.new(user: user, commentable: entry)
|
language = supported_languages(:one)
|
||||||
|
comment = Comment.new(user: user, commentable: entry, language: language)
|
||||||
assert_not comment.valid?
|
assert_not comment.valid?
|
||||||
end
|
end
|
||||||
|
|
||||||
test "should be invalid without a user" do
|
test "should be invalid without a user" do
|
||||||
entry = entries(:one)
|
entry = entries(:one)
|
||||||
comment = Comment.new(body: "This is a comment.", commentable: entry)
|
language = supported_languages(:one)
|
||||||
|
comment = Comment.new(body: "This is a comment.", commentable: entry, language: language)
|
||||||
assert_not comment.valid?
|
assert_not comment.valid?
|
||||||
end
|
end
|
||||||
|
|
||||||
test "should be invalid without a commentable" do
|
test "should be invalid without a commentable" do
|
||||||
user = users(:admin_user)
|
user = users(:contributor_user)
|
||||||
comment = Comment.new(user: user, body: "This is a comment.")
|
language = supported_languages(:one)
|
||||||
|
comment = Comment.new(user: user, body: "This is a comment.", language: language)
|
||||||
assert_not comment.valid?
|
assert_not comment.valid?
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user