<% content_for :title, "Sanasto Wiki" %>
Sanasto Wiki
Read-only public view <%= link_to "Download XLSX", download_entries_path(format: :xlsx), class: "text-xs font-bold text-indigo-700 px-3 py-2 rounded-md border border-indigo-200 bg-indigo-50 hover:bg-indigo-100 transition" %> <%= link_to "Sign In", "#", class: "bg-indigo-600 text-white px-4 py-2 rounded-lg text-sm font-semibold hover:bg-indigo-700 transition" %>
<%= form_with url: entries_path, method: :get, local: true do |form| %>
<%= form.text_field :q, value: @query, 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" %>
<% end %>
<% base_params = { q: @query.presence, category: @category.presence, language: @language_code.presence, starts_with: @starts_with.presence }.compact %> <% all_category_params = base_params.except(:category) %> <%= link_to "All", entries_path(all_category_params), class: "px-4 py-1.5 rounded-full #{@category.blank? ? 'bg-indigo-100 text-indigo-700' : 'bg-white border border-slate-200 text-slate-600 hover:border-indigo-300'} text-xs font-bold uppercase tracking-wider" %> <% Entry.categories.keys.each do |category_name| %> <%= link_to category_name.tr('_', ' ').capitalize, entries_path(base_params.merge(category: category_name)), class: "px-4 py-1.5 rounded-full #{@category == category_name ? 'bg-indigo-100 text-indigo-700' : 'bg-white border border-slate-200 text-slate-600 hover:border-indigo-300'} text-xs font-bold uppercase tracking-wider" %> <% end %>
<% all_language_params = base_params.except(:language, :starts_with, :page) %> <%= link_to "All Languages", entries_path(all_language_params), class: "px-3 py-1.5 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" %> <% @supported_languages.each do |language| %> <%= link_to "#{language.name} (#{language.code.upcase})", entries_path(all_language_params.merge(language: language.code)), class: "px-3 py-1.5 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" %> <% end %>
<% if @language_code.present? %>
<% alphabet_params = base_params.merge(language: @language_code).except(:starts_with, :page) %> <%= link_to "All", 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'}" %> <% alphabet_letters.each do |letter| %> <%= link_to 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'}" %> <% end %>
<% end %>
Fully Translated
<%= number_with_delimiter(@complete_entries_count) %>
Needs Review
<%= number_with_delimiter(@needs_review_count) %>
Missing Translations
<%= number_with_delimiter(@missing_entries_count) %>

Translation Table

Public glossary entries with verified status and language coverage.

<%= @total_entries %> entries
<% @display_languages.each do |language| %> <% end %> <% if @entries.empty? %> <% else %> <% @entries.each do |entry| %> <% translation_values = @display_languages.map { |language| entry.public_send(language.code) } %> <% missing_any = translation_values.any?(&:blank?) %> <% @display_languages.each do |language| %> <% translation = entry.public_send(language.code) %> <% end %> <% end %> <% end %>
Entry
Category / Status
<%= language.name %>
<%= language.code.upcase %>
<%= @language_completion.fetch(language, 0) %>% complete
No entries matched your filters.
<% primary_text = if @language_code.present? entry.public_send(@language_code) else translation_values.find(&:present?) end %> <% primary_text = primary_text.presence || "Untitled" %>
<%= primary_text %>
<%= format_entry_category(entry) %> <% if entry.verified? %> Verified <% else %> Unverified <% end %> <%= link_to "View", entry_path(entry), class: "text-indigo-600 font-semibold hover:underline" %>
<% if translation.present? %> <%= translation %> <% else %> <% end %>
Page <%= @page %> of <%= [@total_pages, 1].max %>
<% previous_page = @page > 1 ? @page - 1 : nil %> <% next_page = @page < @total_pages ? @page + 1 : nil %> <% pagination_params = { q: @query.presence, category: @category.presence, language: @language_code.presence, starts_with: @starts_with.presence }.compact %> <%= link_to "Previous", previous_page ? entries_path(pagination_params.merge(page: previous_page)) : "#", class: "px-3 py-1.5 rounded-md border border-slate-200 #{previous_page ? 'hover:border-indigo-300' : 'text-slate-300 cursor-not-allowed'}" %> <%= link_to "Next", next_page ? entries_path(pagination_params.merge(page: next_page)) : "#", class: "px-3 py-1.5 rounded-md border border-slate-200 #{next_page ? 'hover:border-indigo-300' : 'text-slate-300 cursor-not-allowed'}" %>