show all languages, order by selected then english

This commit is contained in:
2026-01-22 22:03:37 +01:00
parent 35b87b5589
commit 34ab3d80ae
2 changed files with 43 additions and 17 deletions
+17 -2
View File
@@ -1,6 +1,21 @@
module EntriesHelper module EntriesHelper
def alphabet_letters def alphabet_letters(language_code)
("A".."Z").to_a return ("A".."Z").to_a if language_code.blank?
case language_code.to_s
when "ru"
%w[
А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
]
when "no"
("A".."Z").to_a + %w[Æ Ø Å]
when "sv"
("A".."Z").to_a + %w[Å Ä Ö]
when "fi"
("A".."Z").to_a + %w[Å Ä Ö]
else
("A".."Z").to_a
end
end end
def entry_translation_for(entry, language_code) def entry_translation_for(entry, language_code)
+26 -15
View File
@@ -25,10 +25,18 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" /> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
</svg> </svg>
</div> </div>
<% if @query.present? %>
<div class="absolute inset-y-0 right-0 pr-4 flex items-center">
<%= link_to "×",
entries_path(category: @category.presence, language: @language_code.presence, starts_with: @starts_with.presence),
class: "text-slate-400 hover:text-slate-600 text-2xl leading-none",
aria: { label: "Clear search" } %>
</div>
<% end %>
<%= form.text_field :q, <%= form.text_field :q,
value: @query, value: @query,
placeholder: "Search words, phrases, or biblical terms...", placeholder: "Search words, phrases, or biblical terms...",
class: "block w-full pl-11 pr-4 py-4 bg-white border border-slate-200 rounded-2xl shadow-sm focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 transition" %> class: "block w-full pl-11 pr-10 py-4 bg-white border border-slate-200 rounded-2xl shadow-sm focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 transition" %>
</div> </div>
<% end %> <% end %>
@@ -63,7 +71,7 @@
<%= link_to "All", <%= link_to "All",
entries_path(alphabet_params), entries_path(alphabet_params),
class: "px-2.5 py-1 rounded-md #{@starts_with.blank? ? 'bg-indigo-600 text-white' : 'bg-white border border-slate-200 text-slate-600 hover:border-indigo-300'}" %> class: "px-2.5 py-1 rounded-md #{@starts_with.blank? ? 'bg-indigo-600 text-white' : 'bg-white border border-slate-200 text-slate-600 hover:border-indigo-300'}" %>
<% alphabet_letters.each do |letter| %> <% alphabet_letters(@language_code).each do |letter| %>
<%= link_to letter, <%= link_to letter,
entries_path(alphabet_params.merge(starts_with: letter)), entries_path(alphabet_params.merge(starts_with: letter)),
class: "px-2.5 py-1 rounded-md #{@starts_with == letter ? 'bg-indigo-600 text-white' : 'bg-white border border-slate-200 text-slate-600 hover:border-indigo-300'}" %> class: "px-2.5 py-1 rounded-md #{@starts_with == letter ? 'bg-indigo-600 text-white' : 'bg-white border border-slate-200 text-slate-600 hover:border-indigo-300'}" %>
@@ -108,14 +116,22 @@
<table class="min-w-full text-sm border-separate border-spacing-0"> <table class="min-w-full text-sm border-separate border-spacing-0">
<thead class="sticky top-0 z-20 bg-slate-50 border-b border-slate-200"> <thead class="sticky top-0 z-20 bg-slate-50 border-b border-slate-200">
<tr> <tr>
<% preferred_language_code = @language_code.presence || "fi" %>
<% preferred_language = @display_languages.find { |language| language.code == preferred_language_code } %>
<th class="sticky left-0 z-30 bg-slate-50 text-left px-4 py-3 border-b border-slate-200"> <th class="sticky left-0 z-30 bg-slate-50 text-left px-4 py-3 border-b border-slate-200">
<div class="text-xs uppercase tracking-widest text-slate-400">Entry</div> <div class="text-xs font-semibold text-slate-700"><%= preferred_language&.name || "Finnish" %>
<span class="text-[10px] uppercase tracking-widest text-slate-400"><%= preferred_language_code.upcase %></span></div>
<div class="text-[10px] text-slate-400">Category / Status</div> <div class="text-[10px] text-slate-400">Category / Status</div>
</th> </th>
<% @display_languages.each do |language| %> <% table_languages = @display_languages.reject { |language| language.code == preferred_language_code } %>
<% if preferred_language_code != "en" %>
<% english_language, other_languages = table_languages.partition { |language| language.code == "en" } %>
<% table_languages = english_language + other_languages %>
<% end %>
<% table_languages.each do |language| %>
<th class="px-4 py-3 text-left border-b border-slate-200"> <th class="px-4 py-3 text-left border-b border-slate-200">
<div class="text-xs font-semibold text-slate-700"><%= language.name %></div> <div class="text-xs font-semibold text-slate-700"><%= language.name %>
<div class="text-[10px] uppercase tracking-widest text-slate-400"><%= language.code.upcase %></div> <span class="text-[10px] uppercase tracking-widest text-slate-400"><%= language.code.upcase %></span></div>
<div class="mt-1 text-[10px] font-semibold text-emerald-600"> <div class="mt-1 text-[10px] font-semibold text-emerald-600">
<%= @language_completion.fetch(language, 0) %>% complete <%= @language_completion.fetch(language, 0) %>% complete
</div> </div>
@@ -126,22 +142,17 @@
<tbody class="bg-white text-slate-700"> <tbody class="bg-white text-slate-700">
<% if @entries.empty? %> <% if @entries.empty? %>
<tr> <tr>
<td colspan="<%= @display_languages.size + 1 %>" class="px-6 py-6 text-slate-500"> <td colspan="<%= table_languages.size + 1 %>" class="px-6 py-6 text-slate-500">
No entries matched your filters. No entries matched your filters.
</td> </td>
</tr> </tr>
<% else %> <% else %>
<% @entries.each do |entry| %> <% @entries.each do |entry| %>
<% translation_values = @display_languages.map { |language| entry.public_send(language.code) } %> <% translation_values = table_languages.map { |language| entry.public_send(language.code) } %>
<% missing_any = translation_values.any?(&:blank?) %> <% missing_any = translation_values.any?(&:blank?) %>
<tr class="border-b border-slate-100 <%= missing_any ? 'bg-red-50/40' : '' %>"> <tr class="border-b border-slate-100 <%= missing_any ? 'bg-red-50/40' : '' %>">
<td class="sticky left-0 z-10 bg-white px-4 py-4 border-b border-slate-100 w-72"> <td class="sticky left-0 z-10 bg-white px-4 py-4 border-b border-slate-100 w-72">
<% primary_text = if @language_code.present? <% primary_text = entry.public_send(preferred_language_code).presence || "Untitled" %>
entry.public_send(@language_code)
else
translation_values.find(&:present?)
end %>
<% primary_text = primary_text.presence || "Untitled" %>
<div class="font-semibold text-slate-900"><%= primary_text %></div> <div class="font-semibold text-slate-900"><%= primary_text %></div>
<div class="mt-1 text-xs text-slate-500 flex items-center gap-2"> <div class="mt-1 text-xs text-slate-500 flex items-center gap-2">
<span class="uppercase tracking-wider"><%= format_entry_category(entry) %></span> <span class="uppercase tracking-wider"><%= format_entry_category(entry) %></span>
@@ -155,7 +166,7 @@
class: "text-indigo-600 font-semibold hover:underline" %> class: "text-indigo-600 font-semibold hover:underline" %>
</div> </div>
</td> </td>
<% @display_languages.each do |language| %> <% table_languages.each do |language| %>
<% translation = entry.public_send(language.code) %> <% translation = entry.public_send(language.code) %>
<td class="px-4 py-4 border-b border-slate-100"> <td class="px-4 py-4 border-b border-slate-100">
<% if translation.present? %> <% if translation.present? %>