Mattias Bodlund 1 year ago
parent
commit
a1a9e40112
16 changed files with 103 additions and 54 deletions
  1. +14
    -1
      app/assets/stylesheets/application.css
  2. +30
    -0
      app/assets/stylesheets/forms.css
  3. +7
    -2
      app/controllers/admin/admin_controller.rb
  4. +7
    -7
      app/controllers/admin/nodes_controller.rb
  5. +0
    -1
      app/javascript/application.js
  6. +1
    -1
      app/javascript/controllers/i18n_form_controller.js
  7. +2
    -1
      app/models/concerns/ancestry_with_sorted_url.rb
  8. +24
    -24
      app/models/concerns/has_tags.rb
  9. +5
    -4
      app/models/node.rb
  10. +4
    -4
      app/views/admin/nodes/_form.html.erb
  11. +3
    -3
      app/views/languages/index.html.erb
  12. +1
    -1
      app/views/material/_text_field_i18n.html.erb
  13. +1
    -1
      app/views/material/_text_field_i18n_simple.html.erb
  14. +1
    -1
      app/views/material/_tom_select_field_i18n.html.erb
  15. +1
    -1
      app/views/material/_trix_field_i18n.html.erb
  16. +2
    -2
      app/views/site/tmpl_list.html.erb

+ 14
- 1
app/assets/stylesheets/application.css View File

@ -448,9 +448,22 @@ ul.card__stack {
padding: 1.142857142857143em 1em; padding: 1.142857142857143em 1em;
grid-template-rows: 1fr 4fr 1fr; grid-template-rows: 1fr 4fr 1fr;
justify-items: center; justify-items: center;
& div { & div {
text-align: center; text-align: center;
overflow: hidden;
width: 100%;
& span {
display: block;
overflow-wrap: break-word;
word-wrap: break-word;
hyphens: auto;
}
} }
svg { svg {


+ 30
- 0
app/assets/stylesheets/forms.css View File

@ -308,6 +308,7 @@ form[data-locale='da'] .i18n__input-da,
form[data-locale='nl'] .i18n__input-nl, form[data-locale='nl'] .i18n__input-nl,
form[data-locale='fi'] .i18n__input-fi, form[data-locale='fi'] .i18n__input-fi,
form[data-locale='fr'] .i18n__input-fr, form[data-locale='fr'] .i18n__input-fr,
form[data-locale='fr_ca'] .i18n__input-fr_ca,
form[data-locale='de'] .i18n__input-de, form[data-locale='de'] .i18n__input-de,
form[data-locale='hu'] .i18n__input-hu, form[data-locale='hu'] .i18n__input-hu,
form[data-locale='it'] .i18n__input-it, form[data-locale='it'] .i18n__input-it,
@ -566,6 +567,7 @@ p[role="alert"] {
margin-top: 8px;; margin-top: 8px;;
gap: 4px; gap: 4px;
& label { & label {
font-size: 1.5rem; font-size: 1.5rem;
cursor: pointer; cursor: pointer;
@ -580,7 +582,29 @@ p[role="alert"] {
line-height: 32px; line-height: 32px;
text-align: center; text-align: center;
user-select: none; user-select: none;
&:has(em:nth-child(2)) {
position: relative;
& em:nth-child(2) {
position: absolute;
right: -12px;
top: -12px;
font-size: 1rem;
width: 24px;
height: 24px;
line-height: 24px;
text-align: center;
border-radius: 50%;
font-family: var(--font-mono);
}
}
}
& em {
font-style: normal;
} }
& input { & input {
position: absolute; position: absolute;
opacity: 0; opacity: 0;
@ -590,6 +614,12 @@ p[role="alert"] {
&:checked + span { &:checked + span {
background-color: var(--clr-grey-600); background-color: var(--clr-grey-600);
color: var(--white); color: var(--white);
& em:nth-child(2) {
z-index: -1;
background-color: var(--clr-grey-500);
}
} }
} }
} }


+ 7
- 2
app/controllers/admin/admin_controller.rb View File

@ -8,7 +8,7 @@ class Admin::AdminController < ApplicationController
helper_method :current_user helper_method :current_user
helper_method :user_signed_in? helper_method :user_signed_in?
helper_method :form_locale
helper_method :form_locale, :available_locales
# DELETE admin/cache/clear # DELETE admin/cache/clear
def clear_cache def clear_cache
@ -33,7 +33,12 @@ private
def form_locale def form_locale
(params['form_locale'] || I18n.locale).to_sym
(params['form_locale'] || I18n.locale).to_s
end
def available_locales
@available_locales ||= I18n.available_locales.map(&:to_s).map(&:downcase).map{|v| v.sub('-', '_')}
end end


+ 7
- 7
app/controllers/admin/nodes_controller.rb View File

@ -140,12 +140,12 @@ private
def node_params def node_params
params.require(:node).permit( params.require(:node).permit(
:parent_id, :parent_id,
:title_en, :title_zh, :title_hr, :title_cs, :title_da, :title_nl, :title_fi, :title_fr, :title_de, :title_hu, :title_it, :title_ja, :title_ko, :title_nb, :title_pl, :title_pt, :title_ro, :title_sr, :title_sk, :title_sl, :title_es, :title_sv, :title_uk,
:page_title_en, :page_title_zh, :page_title_hr, :page_title_cs, :page_title_da, :page_title_nl, :page_title_fi, :page_title_fr, :page_title_de, :page_title_hu, :page_title_it, :page_title_ja, :page_title_ko, :page_title_nb, :page_title_pl, :page_title_pt, :page_title_ro, :page_title_sr, :page_title_sk, :page_title_sl, :page_title_es, :page_title_sv, :page_title_uk,
:page_description_en, :page_description_zh, :page_description_hr, :page_description_cs, :page_description_da, :page_description_nl, :page_description_fi, :page_description_fr, :page_description_de, :page_description_hu, :page_description_it, :page_description_ja, :page_description_ko, :page_description_nb, :page_description_pl, :page_description_pt, :page_description_ro, :page_description_sr, :page_description_sk, :page_description_sl, :page_description_es, :page_description_sv, :page_description_uk,
:slug_en, :slug_zh, :slug_hr, :slug_cs, :slug_da, :slug_nl, :slug_fi, :slug_fr, :slug_de, :slug_hu, :slug_it, :slug_ja, :slug_ko, :slug_nb, :slug_pl, :slug_pt, :slug_ro, :slug_sr, :slug_sk, :slug_sl, :slug_es, :slug_sv, :slug_uk,
:title_en, :title_zh, :title_hr, :title_cs, :title_da, :title_nl, :title_fi, :title_fr, :title_fr_ca, :title_de, :title_hu, :title_it, :title_ja, :title_ko, :title_nb, :title_pl, :title_pt, :title_ro, :title_sr, :title_sk, :title_sl, :title_es, :title_sv, :title_uk,
:page_title_en, :page_title_zh, :page_title_hr, :page_title_cs, :page_title_da, :page_title_nl, :page_title_fi, :page_title_fr, :page_title_fr_ca, :page_title_de, :page_title_hu, :page_title_it, :page_title_ja, :page_title_ko, :page_title_nb, :page_title_pl, :page_title_pt, :page_title_ro, :page_title_sr, :page_title_sk, :page_title_sl, :page_title_es, :page_title_sv, :page_title_uk,
:page_description_en, :page_description_zh, :page_description_hr, :page_description_cs, :page_description_da, :page_description_nl, :page_description_fi, :page_description_fr, :page_description_fr_ca, :page_description_de, :page_description_hu, :page_description_it, :page_description_ja, :page_description_ko, :page_description_nb, :page_description_pl, :page_description_pt, :page_description_ro, :page_description_sr, :page_description_sk, :page_description_sl, :page_description_es, :page_description_sv, :page_description_uk,
:slug_en, :slug_zh, :slug_hr, :slug_cs, :slug_da, :slug_nl, :slug_fi, :slug_fr, :slug_fr_ca, :slug_de, :slug_hu, :slug_it, :slug_ja, :slug_ko, :slug_nb, :slug_pl, :slug_pt, :slug_ro, :slug_sr, :slug_sk, :slug_sl, :slug_es, :slug_sv, :slug_uk,
:template, :template,
:href_en, :href_zh, :href_hr, :href_cs, :href_da, :href_nl, :href_fi, :href_fr, :href_de, :href_hu, :href_it, :href_ja, :href_ko, :href_nb, :href_pl, :href_pt, :href_ro, :href_sr, :href_sk, :href_sl, :href_es, :href_sv, :href_uk,
:href_en, :href_zh, :href_hr, :href_cs, :href_da, :href_nl, :href_fi, :href_fr, :href_fr_ca, :href_de, :href_hu, :href_it, :href_ja, :href_ko, :href_nb, :href_pl, :href_pt, :href_ro, :href_sr, :href_sk, :href_sl, :href_es, :href_sv, :href_uk,
:status, :status,
:page_description, :page_description,
:parent_id, :parent_id,
@ -155,10 +155,10 @@ private
:is_allowlist, :is_allowlist,
excluded_locales: [], excluded_locales: [],
settings: [], settings: [],
tags_en: [], tags_zh: [], tags_hr: [], tags_cs: [], tags_da: [], tags_nl: [], tags_fi: [], tags_fr: [], tags_de: [], tags_hu: [], tags_it: [], tags_ja: [], tags_ko: [], tags_nb: [], tags_pl: [], tags_pt: [], tags_ro: [], tags_sr: [], tags_sk: [], tags_sl: [], tags_es: [], tags_sv: [], tags_uk: [],
tags_en: [], tags_zh: [], tags_hr: [], tags_cs: [], tags_da: [], tags_nl: [], tags_fi: [], tags_fr: [], tags_fr_ca: [], tags_de: [], tags_hu: [], tags_it: [], tags_ja: [], tags_ko: [], tags_nb: [], tags_pl: [], tags_pt: [], tags_ro: [], tags_sr: [], tags_sk: [], tags_sl: [], tags_es: [], tags_sv: [], tags_uk: [],
attachments_attributes: [ attachments_attributes: [
:id, :asset_id, :id, :asset_id,
:body_en, :body_zh, :body_hr, :body_cs, :body_da, :body_nl, :body_fi, :body_fr, :body_de, :body_hu, :body_it, :body_ja, :body_ko, :body_nb, :body_pl, :body_pt, :body_ro, :body_sr, :body_sk, :body_sl, :body_es, :body_sv, :body_uk,
:body_en, :body_zh, :body_hr, :body_cs, :body_da, :body_nl, :body_fi, :body_fr, :body_fr_ca, :body_de, :body_hu, :body_it, :body_ja, :body_ko, :body_nb, :body_pl, :body_pt, :body_ro, :body_sr, :body_sk, :body_sl, :body_es, :body_sv, :body_uk,
:fg_color, :bg_color, :alignment, :template, :position, :_destroy :fg_color, :bg_color, :alignment, :template, :position, :_destroy
] ]
) )


+ 0
- 1
app/javascript/application.js View File

@ -85,7 +85,6 @@ function init() {
confirm_btn.addEventListener('click', (e) => { confirm_btn.addEventListener('click', (e) => {
// window.location.href = '/' + document.getElementById('language_select').value // window.location.href = '/' + document.getElementById('language_select').value
Turbo.visit('/' + document.getElementById('language_select').value, {advance: 'advance'}) Turbo.visit('/' + document.getElementById('language_select').value, {advance: 'advance'})
}) })
}) })


+ 1
- 1
app/javascript/controllers/i18n_form_controller.js View File

@ -16,7 +16,7 @@ export default class extends Controller {
setFormLocale(event) { setFormLocale(event) {
const locale = event.target.getAttribute('value') const locale = event.target.getAttribute('value')
this.input.value = locale this.input.value = locale
this.element.setAttribute('data-locale', locale) this.element.setAttribute('data-locale', locale)
} }


+ 2
- 1
app/models/concerns/ancestry_with_sorted_url.rb View File

@ -27,8 +27,9 @@ private
def format_slug def format_slug
I18n.available_locales.each do |l| I18n.available_locales.each do |l|
l_key = l.to_s.downcase.sub('-', '_')
v = self.root? ? l.to_s : v = self.root? ? l.to_s :
self.send("slug_#{l}").blank? ? (self.title(locale: l) || '').parameterize : self.send("slug_#{l}").parameterize
self.send("slug_#{l_key}").blank? ? (self.title(locale: l) || '').parameterize : self.send("slug_#{l_key}").parameterize
self.send(:slug=, v, locale: l) self.send(:slug=, v, locale: l)
end end


+ 24
- 24
app/models/concerns/has_tags.rb View File

@ -12,34 +12,34 @@ module HasTags
end end
def descendant_tags
return self.class.tags unless self.respond_to?(:descendants)
result = {}
I18n.available_locales.each { |l| result[l] = [] }
self.descendants.viewable.pluck(:tags).flatten.map do |tags|
tags.each do |k,v|
result[k.to_sym] += v
end
end
result.each{ |k, v| result[k] = v.flatten.uniq.sort }
end
# def descendant_tags
# return self.class.tags unless self.respond_to?(:descendants)
#
# result = {}
# I18n.available_locales.each { |l| result[l] = [] }
#
# self.descendants.viewable.pluck(:tags).flatten.map do |tags|
# tags.each do |k,v|
# result[k.to_sym] += v
# end
# end
# result.each{ |k, v| result[k] = v.flatten.uniq.sort }
# end
module ClassMethods module ClassMethods
def tags
result = {}
I18n.available_locales.each { |l| result[l] = [] }
pluck(:tags).flatten.map do |tags|
tags.each do |k,v|
result[k.to_sym] += v
end
end
result.each{ |k, v| result[k] = v.flatten.uniq.sort }
end
# def tags
# result = {}
# I18n.available_locales.map.each { |l| result[l] = [] }
#
# pluck(:tags).flatten.map do |tags|
# tags.each do |k,v|
# result[k.to_sym] += v
# end
# end
# result.each{ |k, v| result[k] = v.flatten.uniq.sort }
# end
end end


+ 5
- 4
app/models/node.rb View File

@ -13,7 +13,7 @@ class Node < ApplicationRecord
translates :slug, translates :slug,
:tags, :tags,
locale_accessors: I18n.available_locales, locale_accessors: I18n.available_locales,
fallbacks: {zh: :en, hr: :en, cs: :en, da: :en, nl: :en, fi: :en, fr: :en, de: :en, hu: :en, it: :en, ja: :en, ko: :en, nb: :en, pl: :en, pt: :en, ro: :en, sr: :en, sk: :en, sl: :en, es: :en, sv: :en, uk: :en}
fallbacks: {zh: :en, hr: :en, cs: :en, da: :en, nl: :en, fi: :en, fr: :en, fr_ca: :en, de: :en, hu: :en, it: :en, ja: :en, ko: :en, nb: :en, pl: :en, pt: :en, ro: :en, sr: :en, sk: :en, sl: :en, es: :en, sv: :en, uk: :en}
translates :title, translates :title,
:url, :url,
@ -21,7 +21,7 @@ class Node < ApplicationRecord
:page_title, :page_title,
:page_description, :page_description,
locale_accessors: I18n.available_locales, locale_accessors: I18n.available_locales,
fallbacks: {zh: :en, hr: :en, cs: :en, da: :en, nl: :en, fi: :en, fr: :en, de: :en, hu: :en, it: :en, ja: :en, ko: :en, nb: :en, pl: :en, pt: :en, ro: :en, sr: :en, sk: :en, sl: :en, es: :en, sv: :en, uk: :en}
fallbacks: {zh: :en, hr: :en, cs: :en, da: :en, nl: :en, fi: :en, fr: :en, fr_ca: :en, de: :en, hu: :en, it: :en, ja: :en, ko: :en, nb: :en, pl: :en, pt: :en, ro: :en, sr: :en, sk: :en, sl: :en, es: :en, sv: :en, uk: :en}
NODE_TEMPLATES = %w"tmpl_article tmpl_index tmpl_list" NODE_TEMPLATES = %w"tmpl_article tmpl_index tmpl_list"
@ -73,7 +73,8 @@ class Node < ApplicationRecord
def self.tags def self.tags
result = {} result = {}
I18n.available_locales.each do |locale| I18n.available_locales.each do |locale|
result[locale] = pluck(Arel.sql("tags->'#{locale}'")).flatten.compact.uniq.sort.reject{|v| v.blank?}
key = locale.to_s.downcase.sub('-','_')
result[key] = pluck(Arel.sql("tags->'#{locale}'")).flatten.compact.uniq.sort.reject{|v| v.blank?}
end end
result result
end end
@ -130,7 +131,7 @@ class Node < ApplicationRecord
private private
def remove_empty_tags def remove_empty_tags
%w"settings excluded_locales tags_en tags_zh tags_hr tags_cs tags_da tags_nl tags_fi tags_fr tags_de tags_hu tags_it tags_ja tags_ko tags_nb tags_pl tags_pt tags_ro tags_sr tags_sk tags_sl tags_es tags_sv tags_uk ".map do |k|
%w"settings excluded_locales tags_en tags_zh tags_hr tags_cs tags_da tags_nl tags_fi tags_fr tags_fr_ca tags_de tags_hu tags_it tags_ja tags_ko tags_nb tags_pl tags_pt tags_ro tags_sr tags_sk tags_sl tags_es tags_sv tags_uk ".map do |k|
self.send "#{k}=", self.send(k).reject { |v| v.blank? } unless self.send(k).blank? self.send "#{k}=", self.send(k).reject { |v| v.blank? } unless self.send(k).blank?
end end
end end


+ 4
- 4
app/views/admin/nodes/_form.html.erb View File

@ -12,11 +12,11 @@
<%= render partial: 'material/text_field_i18n_simple', locals: { f: form, attr: :title } %> <%= render partial: 'material/text_field_i18n_simple', locals: { f: form, attr: :title } %>
<% end %> <% end %>
<div class="i18n__from-ctrls">
<%- I18n.available_locales.each do |locale| %>
<div class="i18n__from-ctrls">
<%- available_locales.each do |locale| %>
<%= label_tag do %> <%= label_tag do %>
<%= radio_button_tag 'form_locale', locale, form_locale == locale, data: {action: 'change->i18n-form#setFormLocale' } %>
<%= tag.span locale %>
<%= radio_button_tag 'form_locale', locale, form_locale.to_s == locale, data: {action: 'change->i18n-form#setFormLocale' } %>
<%= tag.span locale.split('_').map{|v| tag.em v}.join.html_safe %>
<% end %> <% end %>
<% end %> <% end %>
</div> </div>


+ 3
- 3
app/views/languages/index.html.erb View File

@ -1,16 +1,16 @@
<%- content_for :title, t('project_name') %> <%- content_for :title, t('project_name') %>
<div class="msg__container msg__container-language"> <div class="msg__container msg__container-language">
<%= tag.h1 t('hello') %>
<%= tag.h1 t('hello', locale: accept_language) %>
<%= tag.div t('please_select_a_language_to_get_started') %>
<%= tag.div t('please_select_a_language_to_get_started', locale: accept_language) %>
<div class="form__container"> <div class="form__container">
<div class="language__selector-select"> <div class="language__selector-select">
<%= select_tag :language, options_for_select(languages_for_select, accept_language), id: 'language_select' %> <%= select_tag :language, options_for_select(languages_for_select, accept_language), id: 'language_select' %>
</div> </div>
<button type="button" class="button__base" id="confirm_btn"> <button type="button" class="button__base" id="confirm_btn">
<%= t 'confirm' %>
<%= t 'confirm', locale: accept_language %>
</button> </button>
</div> </div>
</div> </div>

+ 1
- 1
app/views/material/_text_field_i18n.html.erb View File

@ -4,7 +4,7 @@
</div> </div>
<div> <div>
<%- I18n.available_locales.each do |locale| %>
<%- available_locales.each do |locale| %>
<%- i18n_attr = "#{attr}_#{locale}" -%> <%- i18n_attr = "#{attr}_#{locale}" -%>
<%= f.label i18n_attr, class: "input-box i18n__input i18n__input-#{locale}" do %> <%= f.label i18n_attr, class: "input-box i18n__input i18n__input-#{locale}" do %>


+ 1
- 1
app/views/material/_text_field_i18n_simple.html.erb View File

@ -1,4 +1,4 @@
<%- I18n.available_locales.each do |locale| %>
<%- available_locales.each do |locale| %>
<%- i18n_attr = "#{attr}_#{locale}" -%> <%- i18n_attr = "#{attr}_#{locale}" -%>
<div class="i18n__input i18n__input-<%= locale %>"> <div class="i18n__input i18n__input-<%= locale %>">
<%= f.text_field i18n_attr, <%= f.text_field i18n_attr,


+ 1
- 1
app/views/material/_tom_select_field_i18n.html.erb View File

@ -4,7 +4,7 @@
</div> </div>
<div> <div>
<%- I18n.available_locales.each do |locale| %>
<%- available_locales.each do |locale| %>
<%- i18n_attr = "#{attr}_#{locale}" -%> <%- i18n_attr = "#{attr}_#{locale}" -%>
<%= f.label i18n_attr, class: "input-box i18n__input i18n__input-#{locale}" do %> <%= f.label i18n_attr, class: "input-box i18n__input i18n__input-#{locale}" do %>


+ 1
- 1
app/views/material/_trix_field_i18n.html.erb View File

@ -1,6 +1,6 @@
<%= content_tag :div, class: 'trix__field-i18n' do %> <%= content_tag :div, class: 'trix__field-i18n' do %>
<%- I18n.available_locales.each do |locale| %>
<%- available_locales.each do |locale| %>
<%- i18n_attr = "#{attr}_#{locale}" -%> <%- i18n_attr = "#{attr}_#{locale}" -%>
<%= render partial: 'material/trix_field', <%= render partial: 'material/trix_field',
locals: { locals: {


+ 2
- 2
app/views/site/tmpl_list.html.erb View File

@ -17,9 +17,9 @@
<%= svg "ico-arrow-updown" %> <%= svg "ico-arrow-updown" %>
</div> </div>
<div class="card-front"> <div class="card-front">
<%= tag.div node.tags[0] %>
<%= tag.div tag.span(node.tags[0]) %>
<%= svg "ico-arrow-updown" %> <%= svg "ico-arrow-updown" %>
<%= tag.div node.tags[1] %>
<%= tag.div tag.span(node.tags[1]) %>
</div> </div>
</div> </div>
</div> </div>


Loading…
Cancel
Save