mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-24 20:26:21 +00:00
fix: lints
This commit is contained in:
parent
8992ff4dfe
commit
70528aa602
50 changed files with 492 additions and 371 deletions
|
@ -670,3 +670,16 @@ a.black {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.break-all {
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
.details-agregar {
|
||||||
|
@extend .d-flex;
|
||||||
|
@extend .border;
|
||||||
|
@extend .border-magenta;
|
||||||
|
@extend .justify-content-between;
|
||||||
|
@extend .align-items-center;
|
||||||
|
@extend .w-100;
|
||||||
|
@extend .mb-3;
|
||||||
|
}
|
|
@ -86,9 +86,7 @@ class ApplicationController < ActionController::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def site
|
def site
|
||||||
@site ||= find_site.tap do |s|
|
@site ||= find_site.tap(&:reindex_changes!)
|
||||||
s.reindex_changes!
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
|
@ -175,7 +175,7 @@ class StatsController < ApplicationController
|
||||||
locale: I18n.locale,
|
locale: I18n.locale,
|
||||||
empty: I18n.t('stats.index.empty', **please_return_at),
|
empty: I18n.t('stats.index.empty', **please_return_at),
|
||||||
loading: I18n.t('stats.index.loading'),
|
loading: I18n.t('stats.index.loading'),
|
||||||
html: %(<div id="%{id}" class="d-flex align-items-center justify-content-center" style="height: %{height}; width: %{width};">%{loading}</div>)
|
html: %(<div id="%<id>s" class="d-flex align-items-center justify-content-center" style="height: %<height>s; width: %<width>s;">%<loading>s</div>)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -30,10 +30,9 @@ module ApplicationHelper
|
||||||
if k == key
|
if k == key
|
||||||
case v
|
case v
|
||||||
when Array then [k, v - [value]]
|
when Array then [k, v - [value]]
|
||||||
else nil
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
[ k, v ]
|
[k, v]
|
||||||
end
|
end
|
||||||
end.compact.to_h
|
end.compact.to_h
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,7 +17,7 @@ class DeployDistributedPress < Deploy
|
||||||
before_create :create_remote_site!
|
before_create :create_remote_site!
|
||||||
before_destroy :delete_remote_site!
|
before_destroy :delete_remote_site!
|
||||||
|
|
||||||
DEPENDENCIES = %i[deploy_local]
|
DEPENDENCIES = %i[deploy_local].freeze
|
||||||
|
|
||||||
# Actualiza la información y luego envía los cambios
|
# Actualiza la información y luego envía los cambios
|
||||||
#
|
#
|
||||||
|
@ -32,9 +32,7 @@ class DeployDistributedPress < Deploy
|
||||||
create_remote_site! if remote_site_id.blank?
|
create_remote_site! if remote_site_id.blank?
|
||||||
save
|
save
|
||||||
|
|
||||||
if remote_site_id.blank?
|
raise DeployJob::DeployException, 'El sitio no se creó en Distributed Press' if remote_site_id.blank?
|
||||||
raise DeployJob::DeployException, 'El sitio no se creó en Distributed Press'
|
|
||||||
end
|
|
||||||
|
|
||||||
site_client.tap do |c|
|
site_client.tap do |c|
|
||||||
stdout = Thread.new(publisher.logger_out) do |io|
|
stdout = Thread.new(publisher.logger_out) do |io|
|
||||||
|
@ -54,7 +52,7 @@ class DeployDistributedPress < Deploy
|
||||||
end
|
end
|
||||||
|
|
||||||
if status
|
if status
|
||||||
self.remote_info[:distributed_press] = c.show(publishing_site).to_h
|
remote_info[:distributed_press] = c.show(publishing_site).to_h
|
||||||
save
|
save
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -123,7 +121,10 @@ class DeployDistributedPress < Deploy
|
||||||
#
|
#
|
||||||
# @return [DistributedPressPublisher::V1::Schemas::NewSite]
|
# @return [DistributedPressPublisher::V1::Schemas::NewSite]
|
||||||
def create_site
|
def create_site
|
||||||
DistributedPress::V1::Schemas::NewSite.new.call(domain: hostname, protocols: { http: true, ipfs: true, hyper: true })
|
DistributedPress::V1::Schemas::NewSite.new.call(domain: hostname,
|
||||||
|
protocols: {
|
||||||
|
http: true, ipfs: true, hyper: true
|
||||||
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
# Crea el sitio en la instancia con el hostname especificado
|
# Crea el sitio en la instancia con el hostname especificado
|
||||||
|
@ -149,7 +150,7 @@ class DeployDistributedPress < Deploy
|
||||||
# @param log [String]
|
# @param log [String]
|
||||||
# @return [nil]
|
# @return [nil]
|
||||||
def create_stat!(status, log)
|
def create_stat!(status, log)
|
||||||
build_stats.create action: publisher.to_s,log: log, seconds: time_spent_in_seconds, bytes: size, status: status
|
build_stats.create action: publisher.to_s, log: log, seconds: time_spent_in_seconds, bytes: size, status: status
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,7 @@ class DeployLocal < Deploy
|
||||||
'AIRBRAKE_PROJECT_ID' => site.id.to_s,
|
'AIRBRAKE_PROJECT_ID' => site.id.to_s,
|
||||||
'AIRBRAKE_PROJECT_KEY' => site.airbrake_api_key,
|
'AIRBRAKE_PROJECT_KEY' => site.airbrake_api_key,
|
||||||
'YARN_CACHE_FOLDER' => yarn_cache_dir,
|
'YARN_CACHE_FOLDER' => yarn_cache_dir,
|
||||||
'GEMS_SOURCE' => ENV['GEMS_SOURCE']
|
'GEMS_SOURCE' => ENV.fetch('GEMS_SOURCE', nil)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
class DeployRsync < Deploy
|
class DeployRsync < Deploy
|
||||||
store :values, accessors: %i[hostname destination host_keys], coder: JSON
|
store :values, accessors: %i[hostname destination host_keys], coder: JSON
|
||||||
|
|
||||||
DEPENDENCIES = %i[deploy_local deploy_zip]
|
DEPENDENCIES = %i[deploy_local deploy_zip].freeze
|
||||||
|
|
||||||
def deploy(output: false)
|
def deploy(output: false)
|
||||||
ssh? && rsync(output: output)
|
ssh? && rsync(output: output)
|
||||||
|
@ -39,6 +39,7 @@ class DeployRsync < Deploy
|
||||||
# @return [Boolean]
|
# @return [Boolean]
|
||||||
def ssh?
|
def ssh?
|
||||||
return true if destination.start_with? 'rsync://'
|
return true if destination.start_with? 'rsync://'
|
||||||
|
|
||||||
user, host = user_host
|
user, host = user_host
|
||||||
ssh_available = false
|
ssh_available = false
|
||||||
|
|
||||||
|
@ -66,7 +67,7 @@ class DeployRsync < Deploy
|
||||||
{
|
{
|
||||||
'HOME' => home_dir,
|
'HOME' => home_dir,
|
||||||
'PATH' => '/usr/bin',
|
'PATH' => '/usr/bin',
|
||||||
'LANG' => ENV['LANG']
|
'LANG' => ENV.fetch('LANG', nil)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -92,7 +93,8 @@ class DeployRsync < Deploy
|
||||||
#
|
#
|
||||||
# @return [Boolean]
|
# @return [Boolean]
|
||||||
def rsync(output: false)
|
def rsync(output: false)
|
||||||
run %(rsync -aviH --delete-after --timeout=5 #{Shellwords.escape source}/ #{Shellwords.escape destination}/), output: output
|
run %(rsync -aviH --delete-after --timeout=5 #{Shellwords.escape source}/ #{Shellwords.escape destination}/),
|
||||||
|
output: output
|
||||||
end
|
end
|
||||||
|
|
||||||
# El origen es el destino de la compilación
|
# El origen es el destino de la compilación
|
||||||
|
|
|
@ -38,15 +38,15 @@ class IndexedPost < ApplicationRecord
|
||||||
#
|
#
|
||||||
# @param :attribute [String,Symbol]
|
# @param :attribute [String,Symbol]
|
||||||
# @return [Array]
|
# @return [Array]
|
||||||
scope :everything_of, ->(attribute) do
|
scope :everything_of, lambda { |attribute|
|
||||||
where('front_matter ? :attribute', attribute: attribute)
|
where('front_matter ? :attribute', attribute: attribute)
|
||||||
.pluck(
|
.pluck(
|
||||||
Arel.sql(
|
Arel.sql(
|
||||||
ActiveRecord::Base::sanitize_sql(['front_matter -> :attribute', attribute: attribute])
|
ActiveRecord::Base.sanitize_sql(['front_matter -> :attribute', { attribute: attribute }])
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.flatten.uniq
|
.flatten.uniq
|
||||||
end
|
}
|
||||||
|
|
||||||
validates_presence_of :layout, :path, :locale
|
validates_presence_of :layout, :path, :locale
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,6 @@ class MetadataBelongsTo < MetadataRelatedPosts
|
||||||
private
|
private
|
||||||
|
|
||||||
def sanitize(uuid)
|
def sanitize(uuid)
|
||||||
uuid.to_s.gsub(/[^a-f0-9\-]/i, '')
|
uuid.to_s.gsub(/[^a-f0-9-]/i, '')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -53,25 +53,21 @@ class MetadataContent < MetadataTemplate
|
||||||
|
|
||||||
# Eliminar elementos sin src y comprobar su origen
|
# Eliminar elementos sin src y comprobar su origen
|
||||||
html.css(elements).each do |element|
|
html.css(elements).each do |element|
|
||||||
begin
|
raise URI::Error unless element['src'].present?
|
||||||
raise URI::Error unless element['src'].present?
|
|
||||||
|
|
||||||
uri = URI element['src']
|
uri = URI element['src']
|
||||||
|
|
||||||
# No permitimos recursos externos, solo si sabemos cuales son
|
# No permitimos recursos externos, solo si sabemos cuales son
|
||||||
# los recursos locales
|
# los recursos locales
|
||||||
if Rails.application.config.hosts.present?
|
if Rails.application.config.hosts.present? && !Rails.application.config.hosts.include?(uri.hostname)
|
||||||
unless Rails.application.config.hosts.include?(uri.hostname)
|
raise URI::Error
|
||||||
raise URI::Error
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
element['src'] = convert_src_to_internal_path uri
|
|
||||||
|
|
||||||
raise URI::Error if element['src'].blank?
|
|
||||||
rescue URI::Error
|
|
||||||
element.remove
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
element['src'] = convert_src_to_internal_path uri
|
||||||
|
|
||||||
|
raise URI::Error if element['src'].blank?
|
||||||
|
rescue URI::Error
|
||||||
|
element.remove
|
||||||
end
|
end
|
||||||
|
|
||||||
# Eliminar figure sin contenido
|
# Eliminar figure sin contenido
|
||||||
|
@ -101,11 +97,10 @@ class MetadataContent < MetadataTemplate
|
||||||
# @param style [String]
|
# @param style [String]
|
||||||
# @return [String]
|
# @return [String]
|
||||||
def sanitize_style(style)
|
def sanitize_style(style)
|
||||||
style.split(';').reduce({}) do |style_hash, style_string|
|
style.split(';').each_with_object({}) do |style_string, style_hash|
|
||||||
key, value = style_string.split(':', 2)
|
key, value = style_string.split(':', 2)
|
||||||
|
|
||||||
style_hash[key] ||= value
|
style_hash[key] ||= value
|
||||||
style_hash
|
|
||||||
end.slice(*allowed_styles).map do |style_pair|
|
end.slice(*allowed_styles).map do |style_pair|
|
||||||
style_pair.join(':')
|
style_pair.join(':')
|
||||||
end.join(';')
|
end.join(';')
|
||||||
|
@ -121,7 +116,7 @@ class MetadataContent < MetadataTemplate
|
||||||
# Convierte una ubicación local al sitio en una URL de ActiveStorage
|
# Convierte una ubicación local al sitio en una URL de ActiveStorage
|
||||||
#
|
#
|
||||||
# XXX: Por qué son tan díficiles de encontrar las rutas de AS
|
# XXX: Por qué son tan díficiles de encontrar las rutas de AS
|
||||||
#
|
#
|
||||||
# @param path [String]
|
# @param path [String]
|
||||||
# @return [String]
|
# @return [String]
|
||||||
def convert_internal_path_to_src(path)
|
def convert_internal_path_to_src(path)
|
||||||
|
|
|
@ -10,7 +10,8 @@ class MetadataRelatedPosts < MetadataArray
|
||||||
def values
|
def values
|
||||||
@values ||= posts.pluck(:title, :created_at, :layout, :post_id).to_h do |row|
|
@values ||= posts.pluck(:title, :created_at, :layout, :post_id).to_h do |row|
|
||||||
row.tap do |value|
|
row.tap do |value|
|
||||||
value[0] = "#{value[0]} #{value.delete_at(1).strftime('%F')} (#{site.layouts[value.delete_at(1)].humanized_name})"
|
value[0] =
|
||||||
|
"#{value[0]} #{value.delete_at(1).strftime('%F')} (#{site.layouts[value.delete_at(1)].humanized_name})"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -46,7 +47,7 @@ class MetadataRelatedPosts < MetadataArray
|
||||||
|
|
||||||
def sanitize(uuid)
|
def sanitize(uuid)
|
||||||
super(uuid.map do |u|
|
super(uuid.map do |u|
|
||||||
u.to_s.gsub(/[^a-f0-9\-]/i, '')
|
u.to_s.gsub(/[^a-f0-9-]/i, '')
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -132,6 +132,7 @@ class Post
|
||||||
src = element.attributes['src']
|
src = element.attributes['src']
|
||||||
|
|
||||||
next unless src&.value&.start_with? 'public/'
|
next unless src&.value&.start_with? 'public/'
|
||||||
|
|
||||||
file = MetadataFile.new(site: site, post: self, document: document, layout: layout)
|
file = MetadataFile.new(site: site, post: self, document: document, layout: layout)
|
||||||
file.value['path'] = src.value
|
file.value['path'] = src.value
|
||||||
|
|
||||||
|
@ -250,7 +251,8 @@ class Post
|
||||||
|
|
||||||
# La fecha de creación inmodificable del post
|
# La fecha de creación inmodificable del post
|
||||||
def created_at
|
def created_at
|
||||||
@metadata[:created_at] ||= MetadataCreatedAt.new(document: document, site: site, layout: layout, name: :created_at, type: :created_at, post: self, required: true)
|
@metadata[:created_at] ||= MetadataCreatedAt.new(document: document, site: site, layout: layout, name: :created_at,
|
||||||
|
type: :created_at, post: self, required: true)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Detecta si es un atributo válido o no, a partir de la tabla de la
|
# Detecta si es un atributo válido o no, a partir de la tabla de la
|
||||||
|
|
|
@ -6,7 +6,6 @@ class Post
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
included do
|
included do
|
||||||
|
|
||||||
# @return [IndexedPost,nil]
|
# @return [IndexedPost,nil]
|
||||||
def indexed_post
|
def indexed_post
|
||||||
site.indexed_posts.find_by_post_id(uuid.value)
|
site.indexed_posts.find_by_post_id(uuid.value)
|
||||||
|
|
|
@ -419,7 +419,6 @@ class Site < ApplicationRecord
|
||||||
FileUtils.rm_rf path
|
FileUtils.rm_rf path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# Sincroniza algunos atributos del sitio con su configuración y
|
# Sincroniza algunos atributos del sitio con su configuración y
|
||||||
# guarda los cambios
|
# guarda los cambios
|
||||||
#
|
#
|
||||||
|
|
|
@ -104,8 +104,8 @@ class Site
|
||||||
indexable_posts.select do |delta|
|
indexable_posts.select do |delta|
|
||||||
MODIFIED_STATUSES.include? delta.status
|
MODIFIED_STATUSES.include? delta.status
|
||||||
end.each do |delta|
|
end.each do |delta|
|
||||||
locale, _ = locale_and_path_from(delta.new_file[:path])
|
locale, = locale_and_path_from(delta.new_file[:path])
|
||||||
full_path = File.join(self.path, delta.new_file[:path])
|
full_path = File.join(path, delta.new_file[:path])
|
||||||
|
|
||||||
Post.build(path: full_path, site: self, layout: Post.find_layout(full_path), locale: locale).index!
|
Post.build(path: full_path, site: self, layout: Post.find_layout(full_path), locale: locale).index!
|
||||||
end
|
end
|
||||||
|
|
|
@ -148,7 +148,7 @@ class Site
|
||||||
# @param :rm [Array] Archivos a eliminar
|
# @param :rm [Array] Archivos a eliminar
|
||||||
# @param :usuarie [Usuarie] Quién hace el commit
|
# @param :usuarie [Usuarie] Quién hace el commit
|
||||||
# @param :message [String] Mensaje
|
# @param :message [String] Mensaje
|
||||||
def commit(add: [], rm: [], usuarie:, message:)
|
def commit(usuarie:, message:, add: [], rm: [])
|
||||||
# Cargar el árbol actual
|
# Cargar el árbol actual
|
||||||
rugged.index.read_tree rugged.head.target.tree
|
rugged.index.read_tree rugged.head.target.tree
|
||||||
|
|
||||||
|
@ -182,7 +182,7 @@ class Site
|
||||||
#
|
#
|
||||||
# @return [Boolean]
|
# @return [Boolean]
|
||||||
def gc
|
def gc
|
||||||
git_sh("git", "gc")
|
git_sh('git', 'gc')
|
||||||
end
|
end
|
||||||
|
|
||||||
# Pushea cambios al repositorio remoto
|
# Pushea cambios al repositorio remoto
|
||||||
|
@ -196,8 +196,8 @@ class Site
|
||||||
|
|
||||||
# Hace limpieza de LFS
|
# Hace limpieza de LFS
|
||||||
def lfs_cleanup
|
def lfs_cleanup
|
||||||
git_sh("git", "lfs", "prune")
|
git_sh('git', 'lfs', 'prune')
|
||||||
git_sh("git", "lfs", "dedup")
|
git_sh('git', 'lfs', 'dedup')
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -257,7 +257,7 @@ class Site
|
||||||
# @param :args [Array]
|
# @param :args [Array]
|
||||||
# @return [Boolean]
|
# @return [Boolean]
|
||||||
def git_sh(*args)
|
def git_sh(*args)
|
||||||
env = { 'PATH' => '/usr/bin', 'LANG' => ENV['LANG'], 'HOME' => path }
|
env = { 'PATH' => '/usr/bin', 'LANG' => ENV.fetch('LANG', nil), 'HOME' => path }
|
||||||
|
|
||||||
r = nil
|
r = nil
|
||||||
Open3.popen2e(env, *args, unsetenv_others: true, chdir: path) do |_, _, t|
|
Open3.popen2e(env, *args, unsetenv_others: true, chdir: path) do |_, _, t|
|
||||||
|
|
|
@ -145,9 +145,9 @@ PostService = Struct.new(:site, :usuarie, :post, :params, keyword_init: true) do
|
||||||
# Si les usuaries modifican o crean una licencia, considerarla
|
# Si les usuaries modifican o crean una licencia, considerarla
|
||||||
# personalizada en el panel.
|
# personalizada en el panel.
|
||||||
def update_site_license!
|
def update_site_license!
|
||||||
if site.usuarie?(usuarie) && post.layout.name == :license && !site.licencia.custom?
|
return unless site.usuarie?(usuarie) && post.layout.name == :license && !site.licencia.custom?
|
||||||
site.update licencia: Licencia.find_by_icons('custom')
|
|
||||||
end
|
site.update licencia: Licencia.find_by_icons('custom')
|
||||||
end
|
end
|
||||||
|
|
||||||
# @return [Set<String>]
|
# @return [Set<String>]
|
||||||
|
|
|
@ -2,5 +2,5 @@
|
||||||
- id = "#{field.object_name}_#{name}"
|
- id = "#{field.object_name}_#{name}"
|
||||||
- name = "#{field.object_name}[#{name}]"
|
- name = "#{field.object_name}[#{name}]"
|
||||||
|
|
||||||
= render 'bootstrap/custom_checkbox', id: id, name: name, content: content, required: local_assigns[:required], value: "1" do
|
= render 'bootstrap/custom_checkbox', id: id, name: name, content: content, required: local_assigns[:required], value: '1' do
|
||||||
= yield
|
= yield
|
||||||
|
|
|
@ -1,28 +1,28 @@
|
||||||
.row.align-items-center.justify-content-center.full-height
|
.row.align-items-center.justify-content-center.full-height
|
||||||
.col-12.col-lg-10.align-self-center
|
.col-12.col-lg-10.align-self-center
|
||||||
- welcome = @site.config.dig('welcome', 'message') || t('.welcome',
|
- welcome = @site.config.dig('welcome', 'message') || t('.welcome',
|
||||||
site: @site.hostname)
|
site: @site.hostname)
|
||||||
= sanitize_markdown welcome
|
= sanitize_markdown welcome
|
||||||
|
|
||||||
.col-12.col-lg-6.align-self-center
|
.col-12.col-lg-6.align-self-center
|
||||||
-# Copiado y pegado de app/views/devise/registrations/new.haml
|
-# Copiado y pegado de app/views/devise/registrations/new.haml
|
||||||
- resource = resource_name = @invitade
|
- resource = resource_name = @invitade
|
||||||
= form_for(resource, as: resource_name,
|
= form_for(resource, as: resource_name,
|
||||||
url: site_collaborate_path(@site),
|
url: site_collaborate_path(@site),
|
||||||
method: :post) do |f|
|
method: :post) do |f|
|
||||||
- unless current_usuarie
|
- unless current_usuarie
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :email
|
= f.label :email
|
||||||
= f.email_field :email, autofocus: true, autocomplete: 'email',
|
= f.email_field :email, autofocus: true, autocomplete: 'email',
|
||||||
class: 'form-control'
|
class: 'form-control'
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :password
|
= f.label :password
|
||||||
- if @minimum_password_length
|
- if @minimum_password_length
|
||||||
%em
|
%em
|
||||||
= t('devise.shared.minimum_password_length',
|
= t('devise.shared.minimum_password_length',
|
||||||
count: @minimum_password_length)
|
count: @minimum_password_length)
|
||||||
= f.password_field :password, autocomplete: 'new-password',
|
= f.password_field :password, autocomplete: 'new-password',
|
||||||
class: 'form-control'
|
class: 'form-control'
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.submit t('.submit'), class: 'btn btn-secondary btn-lg btn-block'
|
= f.submit t('.submit'), class: 'btn btn-secondary btn-lg btn-block'
|
||||||
|
|
|
@ -9,26 +9,25 @@
|
||||||
%h2= t('.resend_confirmation_instructions')
|
%h2= t('.resend_confirmation_instructions')
|
||||||
|
|
||||||
= form_for(resource,
|
= form_for(resource,
|
||||||
as: resource_name,
|
as: resource_name,
|
||||||
url: confirmation_path(resource_name),
|
url: confirmation_path(resource_name),
|
||||||
html: { method: :post }) do |f|
|
html: { method: :post }) do |f|
|
||||||
|
|
||||||
:ruby
|
:ruby
|
||||||
value = if resource.pending_reconfirmation?
|
value = if resource.pending_reconfirmation?
|
||||||
resource.unconfirmed_email
|
resource.unconfirmed_email
|
||||||
else
|
else
|
||||||
resource.email
|
resource.email
|
||||||
end
|
end
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :email, class: 'sr-only'
|
= f.label :email, class: 'sr-only'
|
||||||
= f.email_field :email,
|
= f.email_field :email,
|
||||||
autofocus: true,
|
autofocus: true,
|
||||||
autocomplete: 'email',
|
autocomplete: 'email',
|
||||||
class: 'form-control',
|
class: 'form-control',
|
||||||
value: value,
|
value: value,
|
||||||
placeholder: t('activerecord.attributes.usuarie.email')
|
placeholder: t('activerecord.attributes.usuarie.email')
|
||||||
.actions
|
.actions
|
||||||
= f.submit t('.resend_confirmation_instructions'),
|
= f.submit t('.resend_confirmation_instructions'),
|
||||||
class: 'btn btn-secondary btn-lg btn-block'
|
class: 'btn btn-secondary btn-lg btn-block'
|
||||||
= render 'devise/shared/links'
|
= render 'devise/shared/links'
|
||||||
|
|
|
@ -7,29 +7,29 @@
|
||||||
.col-12.col-lg-5.align-self-center
|
.col-12.col-lg-5.align-self-center
|
||||||
%h2= t 'devise.invitations.edit.header'
|
%h2= t 'devise.invitations.edit.header'
|
||||||
= form_for(resource,
|
= form_for(resource,
|
||||||
as: resource_name,
|
as: resource_name,
|
||||||
url: invitation_path(resource_name),
|
url: invitation_path(resource_name),
|
||||||
html: { method: :put }) do |f|
|
html: { method: :put }) do |f|
|
||||||
= f.hidden_field :invitation_token, readonly: true
|
= f.hidden_field :invitation_token, readonly: true
|
||||||
- if f.object.class.require_password_on_accepting
|
- if f.object.class.require_password_on_accepting
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :password, class: 'sr-only'
|
= f.label :password, class: 'sr-only'
|
||||||
= f.password_field :password, class: 'form-control',
|
= f.password_field :password, class: 'form-control',
|
||||||
min: @minimum_password_length,
|
min: @minimum_password_length,
|
||||||
aria: { describedby: 'minimum-password-length' },
|
aria: { describedby: 'minimum-password-length' },
|
||||||
placeholder: t('activerecord.attributes.usuarie.password')
|
placeholder: t('activerecord.attributes.usuarie.password')
|
||||||
- if @minimum_password_length
|
- if @minimum_password_length
|
||||||
%small.text-muted.form-text#minimum-password-length
|
%small.text-muted.form-text#minimum-password-length
|
||||||
= t('devise.shared.minimum_password_length',
|
= t('devise.shared.minimum_password_length',
|
||||||
count: @minimum_password_length)
|
count: @minimum_password_length)
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :password_confirmation, class: 'sr-only'
|
= f.label :password_confirmation, class: 'sr-only'
|
||||||
= f.password_field :password_confirmation,
|
= f.password_field :password_confirmation,
|
||||||
class: 'form-control',
|
class: 'form-control',
|
||||||
min: @minimum_password_length,
|
min: @minimum_password_length,
|
||||||
aria: { describedby: 'minimum-password-length' },
|
aria: { describedby: 'minimum-password-length' },
|
||||||
placeholder: t('activerecord.attributes.usuarie.password')
|
placeholder: t('activerecord.attributes.usuarie.password')
|
||||||
.actions
|
.actions
|
||||||
= f.submit t('devise.invitations.edit.submit_button'),
|
= f.submit t('devise.invitations.edit.submit_button'),
|
||||||
class: 'btn btn-secondary btn-lg btn-block'
|
class: 'btn btn-secondary btn-lg btn-block'
|
||||||
|
|
|
@ -7,13 +7,13 @@
|
||||||
.col-12.col-lg-5.align-self-center
|
.col-12.col-lg-5.align-self-center
|
||||||
%h2= t 'devise.invitations.new.header'
|
%h2= t 'devise.invitations.new.header'
|
||||||
= form_for(resource,
|
= form_for(resource,
|
||||||
as: resource_name,
|
as: resource_name,
|
||||||
url: invitation_path(resource_name),
|
url: invitation_path(resource_name),
|
||||||
html: { method: :post }) do |f|
|
html: { method: :post }) do |f|
|
||||||
- resource.class.invite_key_fields.each do |field|
|
- resource.class.invite_key_fields.each do |field|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label field
|
= f.label field
|
||||||
= f.text_field field, class: 'form-control'
|
= f.text_field field, class: 'form-control'
|
||||||
.actions
|
.actions
|
||||||
= f.submit t('devise.invitations.new.submit_button'),
|
= f.submit t('devise.invitations.new.submit_button'),
|
||||||
class: 'btn btn-secondary btn-lg btn-block'
|
class: 'btn btn-secondary btn-lg btn-block'
|
||||||
|
|
|
@ -10,35 +10,34 @@
|
||||||
%p= t('.help')
|
%p= t('.help')
|
||||||
|
|
||||||
= form_for(resource, as: resource_name,
|
= form_for(resource, as: resource_name,
|
||||||
url: password_path(resource_name),
|
url: password_path(resource_name),
|
||||||
html: { method: :put }) do |f|
|
html: { method: :put }) do |f|
|
||||||
|
|
||||||
= f.hidden_field :reset_password_token
|
= f.hidden_field :reset_password_token
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :password, t('.new_password'), class: 'sr-only'
|
= f.label :password, t('.new_password'), class: 'sr-only'
|
||||||
= f.password_field :password,
|
= f.password_field :password,
|
||||||
autofocus: true,
|
autofocus: true,
|
||||||
autocomplete: 'new-password',
|
autocomplete: 'new-password',
|
||||||
class: 'form-control', min: @minimum_password_length,
|
class: 'form-control', min: @minimum_password_length,
|
||||||
aria: { describedby: 'minimum_password_length' },
|
aria: { describedby: 'minimum_password_length' },
|
||||||
placeholder: t('.new_password')
|
placeholder: t('.new_password')
|
||||||
- if @minimum_password_length
|
- if @minimum_password_length
|
||||||
%small.form-text.text-muted
|
%small.form-text.text-muted
|
||||||
= t('devise.shared.minimum_password_length',
|
= t('devise.shared.minimum_password_length',
|
||||||
count: @minimum_password_length)
|
count: @minimum_password_length)
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :password_confirmation, t('.confirm_new_password'),
|
= f.label :password_confirmation, t('.confirm_new_password'),
|
||||||
class: 'sr-only'
|
class: 'sr-only'
|
||||||
= f.password_field :password_confirmation, autocomplete: 'off',
|
= f.password_field :password_confirmation, autocomplete: 'off',
|
||||||
class: 'form-control',
|
class: 'form-control',
|
||||||
min: @minimum_password_length,
|
min: @minimum_password_length,
|
||||||
aria: { describedby: 'minimum_password_length' },
|
aria: { describedby: 'minimum_password_length' },
|
||||||
placeholder: t('.confirm_new_password')
|
placeholder: t('.confirm_new_password')
|
||||||
|
|
||||||
.actions
|
.actions
|
||||||
= f.submit t('.change_my_password'),
|
= f.submit t('.change_my_password'),
|
||||||
class: 'btn btn-secondary btn-lg btn-block'
|
class: 'btn btn-secondary btn-lg btn-block'
|
||||||
|
|
||||||
= render 'devise/shared/links'
|
= render 'devise/shared/links'
|
||||||
|
|
|
@ -10,15 +10,15 @@
|
||||||
%p= t('.help')
|
%p= t('.help')
|
||||||
|
|
||||||
= form_for(resource,
|
= form_for(resource,
|
||||||
as: resource_name,
|
as: resource_name,
|
||||||
url: password_path(resource_name),
|
url: password_path(resource_name),
|
||||||
html: { method: :post }) do |f|
|
html: { method: :post }) do |f|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :email, class: 'sr-only'
|
= f.label :email, class: 'sr-only'
|
||||||
= f.email_field :email, autofocus: true, autocomplete: 'email',
|
= f.email_field :email, autofocus: true, autocomplete: 'email',
|
||||||
class: 'form-control',
|
class: 'form-control',
|
||||||
placeholder: t('activerecord.attributes.usuarie.email')
|
placeholder: t('activerecord.attributes.usuarie.email')
|
||||||
.actions
|
.actions
|
||||||
= f.submit t('.send_me_reset_password_instructions'),
|
= f.submit t('.send_me_reset_password_instructions'),
|
||||||
class: 'btn btn-secondary btn-lg btn-block'
|
class: 'btn btn-secondary btn-lg btn-block'
|
||||||
= render 'devise/shared/links'
|
= render 'devise/shared/links'
|
||||||
|
|
|
@ -9,58 +9,57 @@
|
||||||
.col-12.col-lg-6.align-self-center
|
.col-12.col-lg-6.align-self-center
|
||||||
%h2= t('.title')
|
%h2= t('.title')
|
||||||
= form_for(resource,
|
= form_for(resource,
|
||||||
as: resource_name,
|
as: resource_name,
|
||||||
url: registration_path(resource_name),
|
url: registration_path(resource_name),
|
||||||
html: { method: :put }) do |f|
|
html: { method: :put }) do |f|
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :email
|
= f.label :email
|
||||||
= f.email_field :email, autofocus: true, autocomplete: 'email',
|
= f.email_field :email, autofocus: true, autocomplete: 'email',
|
||||||
class: 'form-control'
|
class: 'form-control'
|
||||||
- if devise_mapping.confirmable? && resource.pending_reconfirmation?
|
- if devise_mapping.confirmable? && resource.pending_reconfirmation?
|
||||||
%div
|
%div
|
||||||
= t('.currently_waiting_confirmation_for_email',
|
= t('.currently_waiting_confirmation_for_email',
|
||||||
email: resource.unconfirmed_email)
|
email: resource.unconfirmed_email)
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :lang
|
= f.label :lang
|
||||||
= f.select :lang,
|
= f.select :lang,
|
||||||
I18n.available_locales.map { |lang| [t(lang), lang] }, {},
|
I18n.available_locales.map { |lang| [t(lang), lang] }, {},
|
||||||
class: 'form-control'
|
class: 'form-control'
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :password
|
= f.label :password
|
||||||
= f.password_field :password, autocomplete: 'new-password',
|
= f.password_field :password, autocomplete: 'new-password',
|
||||||
class: 'form-control', aria: { describedby: 'password-help' }
|
class: 'form-control', aria: { describedby: 'password-help' }
|
||||||
%small.text-muted.form-text#password-help
|
%small.text-muted.form-text#password-help
|
||||||
= t('.leave_blank_if_you_don_t_want_to_change_it')
|
= t('.leave_blank_if_you_don_t_want_to_change_it')
|
||||||
- if @minimum_password_length
|
- if @minimum_password_length
|
||||||
= t('devise.shared.minimum_password_length',
|
= t('devise.shared.minimum_password_length',
|
||||||
count: @minimum_password_length)
|
count: @minimum_password_length)
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :password_confirmation
|
= f.label :password_confirmation
|
||||||
= f.password_field :password_confirmation,
|
= f.password_field :password_confirmation,
|
||||||
autocomplete: 'new-password',
|
autocomplete: 'new-password',
|
||||||
class: 'form-control'
|
class: 'form-control'
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :current_password
|
= f.label :current_password
|
||||||
= f.password_field :current_password,
|
= f.password_field :current_password,
|
||||||
autocomplete: 'current-password',
|
autocomplete: 'current-password',
|
||||||
required: true,
|
required: true,
|
||||||
class: 'form-control',
|
class: 'form-control',
|
||||||
aria: { describedby: 'current-password-help' }
|
aria: { describedby: 'current-password-help' }
|
||||||
%small.text-muted.form-text#current-password-help
|
%small.text-muted.form-text#current-password-help
|
||||||
= t('.we_need_your_current_password_to_confirm_your_changes')
|
= t('.we_need_your_current_password_to_confirm_your_changes')
|
||||||
.actions
|
.actions
|
||||||
= f.submit t('.update'),
|
= f.submit t('.update'),
|
||||||
class: 'btn btn-secondary btn-lg btn-block'
|
class: 'btn btn-secondary btn-lg btn-block'
|
||||||
%hr/
|
%hr/
|
||||||
|
|
||||||
.sr-only
|
.sr-only
|
||||||
%h3= t('.cancel_my_account')
|
%h3= t('.cancel_my_account')
|
||||||
= button_to t('.cancel_my_account'),
|
= button_to t('.cancel_my_account'),
|
||||||
registration_path(resource_name),
|
registration_path(resource_name),
|
||||||
data: { confirm: t('.are_you_sure') },
|
data: { confirm: t('.are_you_sure') },
|
||||||
method: :delete, class: 'btn btn-secondary btn-block'
|
method: :delete, class: 'btn btn-secondary btn-block'
|
||||||
|
|
|
@ -9,36 +9,35 @@
|
||||||
%p= t('.help')
|
%p= t('.help')
|
||||||
|
|
||||||
= form_for(resource,
|
= form_for(resource,
|
||||||
as: resource_name,
|
as: resource_name,
|
||||||
url: registration_path(resource_name, params: { locale: params[:locale] })) do |f|
|
url: registration_path(resource_name, params: { locale: params[:locale] })) do |f|
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :email, class: 'sr-only'
|
= f.label :email, class: 'sr-only'
|
||||||
= f.email_field :email, autofocus: true, autocomplete: 'email',
|
= f.email_field :email, autofocus: true, autocomplete: 'email',
|
||||||
class: 'form-control',
|
class: 'form-control',
|
||||||
placeholder: t('activerecord.attributes.usuarie.email')
|
placeholder: t('activerecord.attributes.usuarie.email')
|
||||||
|
|
||||||
- password = 'activerecord.attributes.usuarie.password'
|
- password = 'activerecord.attributes.usuarie.password'
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :password, class: 'sr-only'
|
= f.label :password, class: 'sr-only'
|
||||||
= f.password_field :password, autocomplete: 'new-password',
|
= f.password_field :password, autocomplete: 'new-password',
|
||||||
class: 'form-control', min: @minimum_password_length,
|
class: 'form-control', min: @minimum_password_length,
|
||||||
aria: { describedby: 'minimum-password-length' },
|
aria: { describedby: 'minimum-password-length' },
|
||||||
placeholder: t(password)
|
placeholder: t(password)
|
||||||
- if @minimum_password_length
|
- if @minimum_password_length
|
||||||
%small.text-muted.form-text#minimum-password-length
|
%small.text-muted.form-text#minimum-password-length
|
||||||
= t('devise.shared.minimum_password_length',
|
= t('devise.shared.minimum_password_length',
|
||||||
count: @minimum_password_length)
|
count: @minimum_password_length)
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :password_confirmation, class: 'sr-only'
|
= f.label :password_confirmation, class: 'sr-only'
|
||||||
= f.password_field :password_confirmation,
|
= f.password_field :password_confirmation,
|
||||||
autocomplete: 'new-password',
|
autocomplete: 'new-password',
|
||||||
class: 'form-control',
|
class: 'form-control',
|
||||||
min: @minimum_password_length,
|
min: @minimum_password_length,
|
||||||
aria: { describedby: 'minimum-password-length' },
|
aria: { describedby: 'minimum-password-length' },
|
||||||
placeholder: t("#{password}_confirmation")
|
placeholder: t("#{password}_confirmation")
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
- Usuarie::CONSENT_FIELDS.each do |field|
|
- Usuarie::CONSENT_FIELDS.each do |field|
|
||||||
|
@ -48,7 +47,7 @@
|
||||||
- content = t(".#{field}.label")
|
- content = t(".#{field}.label")
|
||||||
- href = t(".#{field}.href", default: '')
|
- href = t(".#{field}.href", default: '')
|
||||||
- help_content = t(".#{field}.help")
|
- help_content = t(".#{field}.help")
|
||||||
= render 'bootstrap/custom_checkbox', id: id, name: name, content: content, required: required, value: "1" do
|
= render 'bootstrap/custom_checkbox', id: id, name: name, content: content, required: required, value: '1' do
|
||||||
- if href.present?
|
- if href.present?
|
||||||
= link_to help_content, href, target: '_blank', rel: 'noopener'
|
= link_to help_content, href, target: '_blank', rel: 'noopener'
|
||||||
- else
|
- else
|
||||||
|
@ -56,6 +55,6 @@
|
||||||
|
|
||||||
.actions
|
.actions
|
||||||
= f.submit t('.sign_up'),
|
= f.submit t('.sign_up'),
|
||||||
class: 'btn btn-secondary btn-lg btn-block'
|
class: 'btn btn-secondary btn-lg btn-block'
|
||||||
|
|
||||||
= render 'devise/shared/links'
|
= render 'devise/shared/links'
|
||||||
|
|
|
@ -8,29 +8,29 @@
|
||||||
%p= t('.help')
|
%p= t('.help')
|
||||||
|
|
||||||
= form_for(resource,
|
= form_for(resource,
|
||||||
as: resource_name,
|
as: resource_name,
|
||||||
url: session_path(resource_name)) do |f|
|
url: session_path(resource_name)) do |f|
|
||||||
- if @site
|
- if @site
|
||||||
= hidden_field :referer, value: site_path(@site)
|
= hidden_field :referer, value: site_path(@site)
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :email, class: 'sr-only'
|
= f.label :email, class: 'sr-only'
|
||||||
= f.email_field :email,
|
= f.email_field :email,
|
||||||
autofocus: true,
|
autofocus: true,
|
||||||
autocomplete: 'email',
|
autocomplete: 'email',
|
||||||
class: 'form-control',
|
class: 'form-control',
|
||||||
placeholder: t('login.email')
|
placeholder: t('login.email')
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :password, class: 'sr-only'
|
= f.label :password, class: 'sr-only'
|
||||||
= f.password_field :password,
|
= f.password_field :password,
|
||||||
autocomplete: 'current-password',
|
autocomplete: 'current-password',
|
||||||
class: 'form-control',
|
class: 'form-control',
|
||||||
placeholder: t('login.password')
|
placeholder: t('login.password')
|
||||||
- if devise_mapping.rememberable?
|
- if devise_mapping.rememberable?
|
||||||
.form-group
|
.form-group
|
||||||
= render 'bootstrap/custom_checkbox_for_field', field: f, name: :remember_me do
|
= render 'bootstrap/custom_checkbox_for_field', field: f, name: :remember_me do
|
||||||
= t('login.remember_me', remember_for: distance_of_time_in_words(Usuarie.remember_for))
|
= t('login.remember_me', remember_for: distance_of_time_in_words(Usuarie.remember_for))
|
||||||
.actions
|
.actions
|
||||||
= f.submit t('.sign_in'),
|
= f.submit t('.sign_in'),
|
||||||
class: 'btn btn-secondary btn-lg btn-block'
|
class: 'btn btn-secondary btn-lg btn-block'
|
||||||
= render 'devise/shared/links'
|
= render 'devise/shared/links'
|
||||||
|
|
|
@ -10,15 +10,15 @@
|
||||||
%p= t('.help')
|
%p= t('.help')
|
||||||
|
|
||||||
= form_for(resource,
|
= form_for(resource,
|
||||||
as: resource_name,
|
as: resource_name,
|
||||||
url: unlock_path(resource_name),
|
url: unlock_path(resource_name),
|
||||||
html: { method: :post }) do |f|
|
html: { method: :post }) do |f|
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :email, class: 'sr-only'
|
= f.label :email, class: 'sr-only'
|
||||||
= f.email_field :email, autofocus: true, autocomplete: 'email',
|
= f.email_field :email, autofocus: true, autocomplete: 'email',
|
||||||
class: 'form-control',
|
class: 'form-control',
|
||||||
placeholder: t('activerecord.attributes.usuarie.email')
|
placeholder: t('activerecord.attributes.usuarie.email')
|
||||||
.actions
|
.actions
|
||||||
= f.submit t('.resend_unlock_instructions'),
|
= f.submit t('.resend_unlock_instructions'),
|
||||||
class: 'btn btn-secondary btn-lg btn-block'
|
class: 'btn btn-secondary btn-lg btn-block'
|
||||||
= render 'devise/shared/links'
|
= render 'devise/shared/links'
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
%nav.navbar.flex-md-nowrap.px-0
|
%nav.navbar.flex-md-nowrap.px-0
|
||||||
%a.navbar-brand.order-0{ href: '/' }
|
%a.navbar-brand.order-0{ href: '/' }
|
||||||
= inline_svg_tag 'sutty.svg', class: 'black', aria: true,
|
= inline_svg_tag 'sutty.svg', class: 'black', aria: true,
|
||||||
title: t('svg.sutty.title'), desc: t('svg.sutty.desc')
|
title: t('svg.sutty.title'), desc: t('svg.sutty.desc')
|
||||||
|
|
||||||
- if breadcrumbs?
|
- if breadcrumbs?
|
||||||
%nav.flex-grow-1.order-2.order-md-1{ aria: { label: t('.title') } }
|
%nav.flex-grow-1.order-2.order-md-1{ aria: { label: t('.title') } }
|
||||||
|
@ -18,18 +18,19 @@
|
||||||
- if @site&.tienda?
|
- if @site&.tienda?
|
||||||
%li.nav-item
|
%li.nav-item
|
||||||
= link_to t('.tienda'), @site.tienda_url,
|
= link_to t('.tienda'), @site.tienda_url,
|
||||||
role: 'button', class: 'btn btn-secondary'
|
role: 'button', class: 'btn btn-secondary'
|
||||||
|
|
||||||
%li.nav-item
|
%li.nav-item
|
||||||
= link_to t('.contact_us'), t('.contact_us_href'),
|
= link_to t('.contact_us'), t('.contact_us_href'),
|
||||||
class: 'btn btn-secondary', rel: 'me', target: '_blank'
|
class: 'btn btn-secondary', rel: 'me', target: '_blank'
|
||||||
|
|
||||||
%li.nav-item
|
%li.nav-item
|
||||||
= link_to t('.logout'), main_app.destroy_usuarie_session_path,
|
= link_to t('.logout'), main_app.destroy_usuarie_session_path,
|
||||||
method: :delete, role: 'button', class: 'btn btn-secondary'
|
method: :delete, role: 'button', class: 'btn btn-secondary'
|
||||||
- else
|
- else
|
||||||
- params.permit!
|
- params.permit!
|
||||||
- I18n.available_locales.each do |locale|
|
- I18n.available_locales.each do |locale|
|
||||||
- next if locale == I18n.locale
|
- next if locale == I18n.locale
|
||||||
|
|
||||||
%li.nav-item
|
%li.nav-item
|
||||||
= link_to t("switch_locale.#{locale}"), params.to_h.merge(change_locale_to: locale)
|
= link_to t("switch_locale.#{locale}"), params.to_h.merge(change_locale_to: locale)
|
||||||
|
|
|
@ -7,9 +7,8 @@
|
||||||
@param :summary_class [String] Clases para el summary
|
@param :summary_class [String] Clases para el summary
|
||||||
|
|
||||||
- local_assigns[:summary_class] ||= 'h3'
|
- local_assigns[:summary_class] ||= 'h3'
|
||||||
- local_assigns[:closed] ||= '▶'.html_safe;
|
- local_assigns[:closed] ||= '▶'.html_safe
|
||||||
- local_assigns[:open] ||= '▼'.html_safe;
|
- local_assigns[:open] ||= '▼'.html_safe
|
||||||
|
|
||||||
|
|
||||||
%details.details.py-2{ id: local_assigns[:id], data: { controller: 'details', action: 'toggle->details#store' }, class: local_assigns[:details_class] }
|
%details.details.py-2{ id: local_assigns[:id], data: { controller: 'details', action: 'toggle->details#store' }, class: local_assigns[:details_class] }
|
||||||
%summary.d-flex.flex-row.align-items-center.justify-content-between{ class: local_assigns[:summary_class] }
|
%summary.d-flex.flex-row.align-items-center.justify-content-between{ class: local_assigns[:summary_class] }
|
||||||
|
|
|
@ -7,4 +7,5 @@
|
||||||
XXX: Ignorar todos los posts no encontrados (ej: fueron
|
XXX: Ignorar todos los posts no encontrados (ej: fueron
|
||||||
borrados o el uuid cambió)
|
borrados o el uuid cambió)
|
||||||
- next unless p
|
- next unless p
|
||||||
|
|
||||||
%li= link_to p.title, site_post_path(site, p.path)
|
%li= link_to p.title, site_post_path(site, p.path)
|
||||||
|
|
13
app/views/posts/attributes/_draft.haml
Normal file
13
app/views/posts/attributes/_draft.haml
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
- if !@site.invitade?(cuenta) # esto ta mal
|
||||||
|
.form-check
|
||||||
|
= hidden_field_tag "#{base}[#{attribute}]", '0', id: ''
|
||||||
|
.custom-control.custom-switch
|
||||||
|
= check_box_tag "#{base}[#{attribute}]", '1', metadata.value,
|
||||||
|
class: "custom-control-input #{invalid(post, attribute)}",
|
||||||
|
aria: { describedby: id_for_help(attribute) },
|
||||||
|
autofocus: autofocus
|
||||||
|
= label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post),
|
||||||
|
class: 'custom-control-label'
|
||||||
|
|
||||||
|
= render 'posts/attribute_feedback',
|
||||||
|
post: post, attribute: attribute, metadata: metadata
|
|
@ -2,43 +2,53 @@
|
||||||
= label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post)
|
= label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post)
|
||||||
- if metadata.static_file
|
- if metadata.static_file
|
||||||
- case metadata.static_file.blob.content_type
|
- case metadata.static_file.blob.content_type
|
||||||
- when %r{\Avideo/}
|
- when %r{\Avideo/}
|
||||||
= video_tag url_for(metadata.static_file),
|
= video_tag url_for(metadata.static_file),
|
||||||
controls: true, class: 'img-fluid',
|
controls: true, class: 'img-fluid',
|
||||||
data: { target: 'file-preview.preview' }
|
data: { target: 'file-preview.preview' }
|
||||||
- when %r{\Aaudio/}
|
- when %r{\Aaudio/}
|
||||||
= audio_tag url_for(metadata.static_file),
|
= audio_tag url_for(metadata.static_file),
|
||||||
controls: true, class: 'img-fluid',
|
controls: true, class: 'img-fluid',
|
||||||
data: { target: 'file-preview.preview' }
|
data: { target: 'file-preview.preview' }
|
||||||
- when 'application/pdf'
|
- when 'application/pdf'
|
||||||
%iframe{ src: url_for(metadata.static_file) }
|
%iframe{ src: url_for(metadata.static_file) }
|
||||||
- else
|
- else
|
||||||
= link_to t('posts.attribute_ro.file.download'),
|
= link_to t('posts.attribute_ro.file.download'),
|
||||||
url_for(metadata.static_file)
|
url_for(metadata.static_file)
|
||||||
-# Mantener el valor si no enviamos ninguna imagen
|
-# Mantener el valor si no enviamos ninguna imagen
|
||||||
= hidden_field_tag "#{base}[#{attribute}][path]", metadata.value['path']
|
= hidden_field_tag "#{base}[#{attribute}][path]", metadata.value['path']
|
||||||
-# Los archivos requeridos solo se pueden reemplazar
|
-# Los archivos requeridos solo se pueden reemplazar
|
||||||
- unless metadata.required
|
- unless metadata.required
|
||||||
.custom-control.custom-switch
|
.custom-control.custom-switch
|
||||||
= check_box_tag "#{base}[#{attribute}][path]", '', false, id: "#{base}_#{attribute}_destroy", class: 'custom-control-input'
|
= check_box_tag "#{base}[#{attribute}][path]",
|
||||||
= label_tag "#{base}_#{attribute}_destroy", t('posts.attributes.file.destroy'), class: 'custom-control-label'
|
'',
|
||||||
|
false,
|
||||||
|
id: "#{base}_#{attribute}_destroy",
|
||||||
|
class: 'custom-control-input'
|
||||||
|
= label_tag "#{base}_#{attribute}_destroy",
|
||||||
|
t('posts.attributes.file.destroy'),
|
||||||
|
class: 'custom-control-label'
|
||||||
|
|
||||||
.custom-file
|
.custom-file
|
||||||
= file_field(*field_name_for(base, attribute, :path),
|
= file_field(*field_name_for(base, attribute, :path),
|
||||||
**field_options(attribute, metadata, required: (metadata.required && !metadata.path?)),
|
**field_options(attribute,
|
||||||
class: "custom-file-input #{invalid(post, attribute)}",
|
metadata,
|
||||||
data: { target: 'file-preview.input', action: 'file-preview#update' })
|
required: (metadata.required && !metadata.path?)),
|
||||||
|
class: "custom-file-input #{invalid(post, attribute)}",
|
||||||
|
data: { target: 'file-preview.input',
|
||||||
|
action: 'file-preview#update' })
|
||||||
= label_tag "#{base}_#{attribute}_path",
|
= label_tag "#{base}_#{attribute}_path",
|
||||||
post_label_t(attribute, :path, post: post), class: 'custom-file-label'
|
post_label_t(attribute, :path, post: post),
|
||||||
|
class: 'custom-file-label'
|
||||||
= render 'posts/attribute_feedback',
|
= render 'posts/attribute_feedback',
|
||||||
post: post, attribute: [attribute, :path], metadata: metadata
|
post: post, attribute: [attribute, :path], metadata: metadata
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= label_tag "#{base}_#{attribute}_description",
|
= label_tag "#{base}_#{attribute}_description",
|
||||||
post_label_t(attribute, :description, post: post, required: false)
|
post_label_t(attribute, :description, post: post, required: false)
|
||||||
= text_field(*field_name_for(base, attribute, :description),
|
= text_field(*field_name_for(base, attribute, :description),
|
||||||
value: metadata.value['description'],
|
value: metadata.value['description'],
|
||||||
dir: dir, lang: locale,
|
dir: dir, lang: locale,
|
||||||
**field_options(attribute, metadata, required: false))
|
**field_options(attribute, metadata, required: false))
|
||||||
= render 'posts/attribute_feedback',
|
= render 'posts/attribute_feedback',
|
||||||
post: post, attribute: [attribute, :description], metadata: metadata
|
post: post, attribute: [attribute, :description], metadata: metadata
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.form-group
|
.form-group
|
||||||
= label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post)
|
= label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post)
|
||||||
= select_tag(plain_field_name_for(base, attribute),
|
= select_tag(plain_field_name_for(base, attribute),
|
||||||
options_for_select(metadata.values, metadata.value),
|
options_for_select(metadata.values, metadata.value),
|
||||||
**field_options(attribute, metadata), include_blank: t('.empty'))
|
**field_options(attribute, metadata), include_blank: t('.empty'))
|
||||||
= render 'posts/attribute_feedback',
|
= render 'posts/attribute_feedback',
|
||||||
post: post, attribute: attribute, metadata: metadata
|
post: post, attribute: attribute, metadata: metadata
|
||||||
|
|
|
@ -2,40 +2,50 @@
|
||||||
= label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post)
|
= label_tag "#{base}_#{attribute}", post_label_t(attribute, post: post)
|
||||||
- if metadata.static_file
|
- if metadata.static_file
|
||||||
= image_tag url_for(metadata.static_file),
|
= image_tag url_for(metadata.static_file),
|
||||||
alt: metadata.value['description'],
|
alt: metadata.value['description'],
|
||||||
class: 'img-fluid',
|
class: 'img-fluid',
|
||||||
data: { target: 'file-preview.preview' }
|
data: { target: 'file-preview.preview' }
|
||||||
|
|
||||||
-# Mantener el valor si no enviamos ninguna imagen
|
-# Mantener el valor si no enviamos ninguna imagen
|
||||||
= hidden_field_tag "#{base}[#{attribute}][path]", metadata.value['path']
|
= hidden_field_tag "#{base}[#{attribute}][path]", metadata.value['path']
|
||||||
-# Las imágenes requeridas solo se pueden reemplazar
|
-# Las imágenes requeridas solo se pueden reemplazar
|
||||||
- unless metadata.required
|
- unless metadata.required
|
||||||
.custom-control.custom-switch
|
.custom-control.custom-switch
|
||||||
= check_box_tag "#{base}[#{attribute}][path]", '', false, id: "#{base}_#{attribute}_destroy", class: 'custom-control-input'
|
= check_box_tag "#{base}[#{attribute}][path]",
|
||||||
= label_tag "#{base}_#{attribute}_destroy", t('posts.attributes.image.destroy'), class: 'custom-control-label'
|
'',
|
||||||
|
false,
|
||||||
|
id: "#{base}_#{attribute}_destroy",
|
||||||
|
class: 'custom-control-input'
|
||||||
|
= label_tag "#{base}_#{attribute}_destroy",
|
||||||
|
t('posts.attributes.image.destroy'),
|
||||||
|
class: 'custom-control-label'
|
||||||
- else
|
- else
|
||||||
= image_tag '',
|
= image_tag '',
|
||||||
alt: metadata.value['description'],
|
alt: metadata.value['description'],
|
||||||
class: 'img-fluid',
|
class: 'img-fluid',
|
||||||
data: { target: 'file-preview.preview' }
|
data: { target: 'file-preview.preview' }
|
||||||
|
|
||||||
.custom-file
|
.custom-file
|
||||||
= file_field(*field_name_for(base, attribute, :path),
|
= file_field(*field_name_for(base, attribute, :path),
|
||||||
**field_options(attribute, metadata, required: (metadata.required && !metadata.path?)),
|
**field_options(attribute,
|
||||||
class: "custom-file-input #{invalid(post, attribute)}",
|
metadata,
|
||||||
accept: ActiveStorage.web_image_content_types.join(','),
|
required: (metadata.required && !metadata.path?)),
|
||||||
data: { target: 'file-preview.input', action: 'file-preview#update' })
|
class: "custom-file-input #{invalid(post, attribute)}",
|
||||||
|
accept: ActiveStorage.web_image_content_types.join(','),
|
||||||
|
data: { target: 'file-preview.input',
|
||||||
|
action: 'file-preview#update' })
|
||||||
= label_tag "#{base}_#{attribute}_path",
|
= label_tag "#{base}_#{attribute}_path",
|
||||||
post_label_t(attribute, :path, post: post), class: 'custom-file-label'
|
post_label_t(attribute, :path, post: post),
|
||||||
|
class: 'custom-file-label'
|
||||||
= render 'posts/attribute_feedback',
|
= render 'posts/attribute_feedback',
|
||||||
post: post, attribute: [attribute, :path], metadata: metadata
|
post: post, attribute: [attribute, :path], metadata: metadata
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= label_tag "#{base}_#{attribute}_description",
|
= label_tag "#{base}_#{attribute}_description",
|
||||||
post_label_t(attribute, :description, post: post, required: false)
|
post_label_t(attribute, :description, post: post, required: false)
|
||||||
= text_field(*field_name_for(base, attribute, :description),
|
= text_field(*field_name_for(base, attribute, :description),
|
||||||
value: metadata.value['description'],
|
value: metadata.value['description'],
|
||||||
dir: dir, lang: locale,
|
dir: dir, lang: locale,
|
||||||
**field_options(attribute, metadata, required: false))
|
**field_options(attribute, metadata, required: false))
|
||||||
= render 'posts/attribute_feedback',
|
= render 'posts/attribute_feedback',
|
||||||
post: post, attribute: [attribute, :description], metadata: metadata
|
post: post, attribute: [attribute, :description], metadata: metadata
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
%legend= post_label_t(attribute, post: post)
|
%legend= post_label_t(attribute, post: post)
|
||||||
|
|
||||||
= render 'posts/attribute_feedback',
|
= render 'posts/attribute_feedback',
|
||||||
post: post, attribute: attribute, metadata: metadata
|
post: post, attribute: attribute, metadata: metadata
|
||||||
|
|
||||||
- site.locales.each do |locale|
|
- site.locales.each do |locale|
|
||||||
- locale_t = t("locales.#{locale}.name", default: locale.to_s.humanize)
|
- locale_t = t("locales.#{locale}.name", default: locale.to_s.humanize)
|
||||||
|
@ -14,5 +14,6 @@
|
||||||
= label_tag "#{base}_#{attribute}_#{locale}", locale_t
|
= label_tag "#{base}_#{attribute}_#{locale}", locale_t
|
||||||
|
|
||||||
= select_tag("#{plain_field_name_for(base, attribute)}[]",
|
= select_tag("#{plain_field_name_for(base, attribute)}[]",
|
||||||
options_for_select(metadata.values[locale], value),
|
options_for_select(metadata.values[locale], value),
|
||||||
**field_options(attribute, metadata), include_blank: t('.empty'))
|
**field_options(attribute, metadata),
|
||||||
|
include_blank: t('.empty'))
|
||||||
|
|
|
@ -14,56 +14,74 @@
|
||||||
= render 'sites/moderation_queue', site: @site, class: 'btn-block'
|
= render 'sites/moderation_queue', site: @site, class: 'btn-block'
|
||||||
|
|
||||||
= render 'layouts/details', summary: t('posts.filters.title') do
|
= render 'layouts/details', summary: t('posts.filters.title') do
|
||||||
|
%form{ method: :get }
|
||||||
%form{method: :get}
|
|
||||||
.border.border-magenta.p-1
|
.border.border-magenta.p-1
|
||||||
- @filter_params.each do |param, values|
|
- @filter_params.each do |param, values|
|
||||||
- next if param == :layout
|
- next if param == :layout
|
||||||
|
|
||||||
- [values].flatten.each do |value|
|
- [values].flatten.each do |value|
|
||||||
%input{ type: 'hidden', name: values.is_a?(Array) ? "#{param}[]" : param, value: value }
|
%input{ type: 'hidden',
|
||||||
|
name: values.is_a?(Array) ? "#{param}[]" : param,
|
||||||
|
value: value }
|
||||||
%legend.font-weight-bold.m-0.h6= 'Tipo de contenido'
|
%legend.font-weight-bold.m-0.h6= 'Tipo de contenido'
|
||||||
- @site.schema_organization.each do |key, _|
|
- @site.schema_organization.each do |key, _|
|
||||||
.custom-control.custom-checkbox
|
.custom-control.custom-checkbox
|
||||||
- schema = @site.layouts[key]
|
- schema = @site.layouts[key]
|
||||||
= render 'schemas/filter', site: @site, key: key, schema: schema, filter: @filter_params
|
= render 'schemas/filter', site: @site,
|
||||||
|
key: key,
|
||||||
|
schema: schema,
|
||||||
|
filter: @filter_params
|
||||||
%button.btn.btn-secondary.mt-3{ type: 'submit' }= t('posts.filters.submit')
|
%button.btn.btn-secondary.mt-3{ type: 'submit' }= t('posts.filters.submit')
|
||||||
= render 'layouts/details',
|
= render 'layouts/details',
|
||||||
summary: t('posts.new'),
|
summary: t('posts.new'),
|
||||||
summary_class: "h4 magenta font-weight-bold m-0 px-2",
|
summary_class: 'h4 magenta font-weight-bold m-0 px-2',
|
||||||
details_class: "d-flex border border-magenta justify-content-between align-items-center w-100 mb-3",
|
details_class: 'details-agregar',
|
||||||
open: "+", closed: "+",
|
open: '+', closed: '+',
|
||||||
open_class: "h1 magenta font-weight-bold m-0",
|
open_class: 'h1 magenta font-weight-bold m-0',
|
||||||
closed_class: "h1 magenta font-weight-bold m-0" do
|
closed_class: 'h1 magenta font-weight-bold m-0' do
|
||||||
%table.table-sm.w-100
|
%table.table-sm.w-100
|
||||||
%tbody
|
%tbody
|
||||||
- @site.schema_organization.each do |schema, _|
|
- @site.schema_organization.each do |schema, _|
|
||||||
- schema = @site.layouts[schema]
|
- schema = @site.layouts[schema]
|
||||||
- next if schema.hidden?
|
- next if schema.hidden?
|
||||||
= render 'schemas/row', site: @site, schema: schema, filter: @filter_params
|
|
||||||
|
|
||||||
|
= render 'schemas/row', site: @site,
|
||||||
|
schema: schema,
|
||||||
|
filter: @filter_params
|
||||||
|
|
||||||
- if policy(@site_stat).index?
|
- if policy(@site_stat).index?
|
||||||
= link_to t('stats.index.title'), site_stats_path(@site), class: 'btn btn-secondary'
|
= link_to t('stats.index.title'),
|
||||||
|
site_stats_path(@site),
|
||||||
|
class: 'btn btn-secondary'
|
||||||
|
|
||||||
- if policy(@site).edit?
|
- if policy(@site).edit?
|
||||||
= link_to t('sites.edit.btn', site: @site.title), edit_site_path(@site), class: 'btn btn-secondary'
|
= link_to t('sites.edit.btn', site: @site.title),
|
||||||
|
edit_site_path(@site),
|
||||||
|
class: 'btn btn-secondary'
|
||||||
|
|
||||||
- if policy(@site).private?
|
- if policy(@site).private?
|
||||||
= link_to t('sites.private'), '../private/' + @site.name, class: 'btn btn-secondary', target: '_blank', rel: 'noopener'
|
= link_to t('sites.private'), "../private/#{@site.name}",
|
||||||
|
class: 'btn btn-secondary',
|
||||||
|
target: '_blank',
|
||||||
|
rel: 'noopener'
|
||||||
|
|
||||||
- if policy(SiteUsuarie.new(@site, current_usuarie)).index?
|
- if policy(SiteUsuarie.new(@site, current_usuarie)).index?
|
||||||
= render 'layouts/btn_with_tooltip',
|
= render 'layouts/btn_with_tooltip',
|
||||||
tooltip: t('usuaries.index.help.self'),
|
tooltip: t('usuaries.index.help.self'),
|
||||||
text: t('usuaries.index.title'),
|
text: t('usuaries.index.title'),
|
||||||
type: 'info',
|
type: 'info',
|
||||||
link: site_usuaries_path(@site)
|
link: site_usuaries_path(@site)
|
||||||
|
|
||||||
- if @site.design.credits
|
- if @site.design.credits
|
||||||
= render 'bootstrap/alert' do
|
= render 'bootstrap/alert' do
|
||||||
= sanitize_markdown @site.design.credits
|
= sanitize_markdown @site.design.credits
|
||||||
= link_to t('sites.donations.text'), t('sites.donations.url'), class: 'btn btn-secondary'
|
= link_to t('sites.donations.text'),
|
||||||
|
t('sites.donations.url'),
|
||||||
|
class: 'btn btn-secondary'
|
||||||
- if @site.design.designer_url
|
- if @site.design.designer_url
|
||||||
= link_to t('sites.designer_url'), @site.design.designer_url, class: 'btn btn-secondary'
|
= link_to t('sites.designer_url'),
|
||||||
|
@site.design.designer_url,
|
||||||
|
class: 'btn btn-secondary'
|
||||||
|
|
||||||
%section.col
|
%section.col
|
||||||
.d-flex.justify-content-between.align-items-center.pl-2-plus.pr-2-plus.mb-2
|
.d-flex.justify-content-between.align-items-center.pl-2-plus.pr-2-plus.mb-2
|
||||||
|
@ -72,7 +90,7 @@
|
||||||
%nav#locales
|
%nav#locales
|
||||||
- @site.locales.each do |locale|
|
- @site.locales.each do |locale|
|
||||||
= link_to @site.data.dig(locale.to_s, 'locale') || locale, site_posts_path(@site, **@filter_params.merge(locale: locale)),
|
= link_to @site.data.dig(locale.to_s, 'locale') || locale, site_posts_path(@site, **@filter_params.merge(locale: locale)),
|
||||||
class: "mr-2 mt-2 mb-2 #{locale == @locale ? 'active font-weight-bold' : ''}"
|
class: "mr-2 mt-2 mb-2 #{locale == @locale ? 'active font-weight-bold' : ''}"
|
||||||
|
|
||||||
- if @posts.empty?
|
- if @posts.empty?
|
||||||
%h2= t('posts.empty')
|
%h2= t('posts.empty')
|
||||||
|
@ -86,7 +104,8 @@
|
||||||
.d-flex.flex-row.justify-content-between
|
.d-flex.flex-row.justify-content-between
|
||||||
%div
|
%div
|
||||||
- if reorder_allowed
|
- if reorder_allowed
|
||||||
= submit_tag t('posts.reorder.submit'), class: 'btn btn-secondary'
|
= submit_tag t('posts.reorder.submit'),
|
||||||
|
class: 'btn btn-secondary'
|
||||||
%button.btn.btn-secondary{ data: { action: 'reorder#unselect' } }
|
%button.btn.btn-secondary{ data: { action: 'reorder#unselect' } }
|
||||||
= t('posts.reorder.unselect')
|
= t('posts.reorder.unselect')
|
||||||
%span.badge{ data: { target: 'reorder.counter' } } 0
|
%span.badge{ data: { target: 'reorder.counter' } } 0
|
||||||
|
@ -94,12 +113,18 @@
|
||||||
%button.btn.btn-secondary{ data: { action: 'reorder#down' } }= t('posts.reorder.down')
|
%button.btn.btn-secondary{ data: { action: 'reorder#down' } }= t('posts.reorder.down')
|
||||||
%button.btn.btn-secondary{ data: { action: 'reorder#top' } }= t('posts.reorder.top')
|
%button.btn.btn-secondary{ data: { action: 'reorder#top' } }= t('posts.reorder.top')
|
||||||
%button.btn.btn-secondary{ data: { action: 'reorder#bottom' } }= t('posts.reorder.bottom')
|
%button.btn.btn-secondary{ data: { action: 'reorder#bottom' } }= t('posts.reorder.bottom')
|
||||||
%input{ type: 'hidden', name: 'post[lang]', value: @locale }
|
%input{ type: 'hidden',
|
||||||
|
name: 'post[lang]',
|
||||||
|
value: @locale }
|
||||||
|
|
||||||
- if @site.pagination
|
- if @site.pagination
|
||||||
%div
|
%div
|
||||||
= link_to_prev_page @posts, t('posts.prev'), class: 'btn btn-secondary'
|
= link_to_prev_page @posts,
|
||||||
= link_to_next_page @posts, t('posts.next'), class: 'btn btn-secondary'
|
t('posts.prev'),
|
||||||
|
class: 'btn btn-secondary'
|
||||||
|
= link_to_next_page @posts,
|
||||||
|
t('posts.next'),
|
||||||
|
class: 'btn btn-secondary'
|
||||||
%tbody
|
%tbody
|
||||||
- dir = @site.data.dig(params[:locale], 'dir')
|
- dir = @site.data.dig(params[:locale], 'dir')
|
||||||
- size = @posts.size
|
- size = @posts.size
|
||||||
|
@ -107,48 +132,61 @@
|
||||||
-#
|
-#
|
||||||
TODO: Solo les usuaries cachean porque tenemos que separar
|
TODO: Solo les usuaries cachean porque tenemos que separar
|
||||||
les botones por permisos.
|
les botones por permisos.
|
||||||
- begin
|
|
||||||
- cache_if @usuarie, [post, I18n.locale] do
|
|
||||||
- checkbox_id = "checkbox-#{post.post_id}"
|
|
||||||
%tr{ id: post.post_id, data: reorder_target }
|
|
||||||
- if reorder_allowed
|
|
||||||
%td
|
|
||||||
.custom-control.custom-checkbox
|
|
||||||
%input.custom-control-input{ id: checkbox_id, type: 'checkbox', autocomplete: 'off', data: { action: 'reorder#select' } }
|
|
||||||
%label.custom-control-label{ for: checkbox_id }
|
|
||||||
%span.sr-only= t('posts.reorder.select')
|
|
||||||
-# Orden más alto es mayor prioridad
|
|
||||||
= hidden_field 'post[reorder]', post.post_id,
|
|
||||||
value: size - i,
|
|
||||||
data: { reorder: true }
|
|
||||||
%td.w-100{ class: dir }
|
|
||||||
= link_to site_post_path(@site, post.path) do
|
|
||||||
%span{ lang: post.locale, dir: dir }= post.title
|
|
||||||
- if post.front_matter['draft'].present?
|
|
||||||
%span.badge.badge-primary= I18n.t('posts.attributes.draft.label')
|
|
||||||
%br
|
|
||||||
%small
|
|
||||||
= link_to @site.layouts[post.layout].humanized_name, site_posts_path(@site, **@filter_params.merge(layout: [post.layout]))
|
|
||||||
- post.front_matter['categories']&.each do |category|
|
|
||||||
= link_to site_posts_path(@site, **@filter_params.merge(category: category)) do
|
|
||||||
%span{ lang: post.locale, dir: dir }= category
|
|
||||||
= '/' unless post.front_matter['categories'].last == category
|
|
||||||
|
|
||||||
%td.text-nowrap
|
- cache_if @usuarie, [post, I18n.locale] do
|
||||||
= post.created_at.strftime('%F')
|
- checkbox_id = "checkbox-#{post.post_id}"
|
||||||
%br/
|
%tr{ id: post.post_id, data: reorder_target }
|
||||||
= post.order
|
- if reorder_allowed
|
||||||
%td.text-nowrap
|
%td
|
||||||
.d-flex.flex-row.align-items-start
|
.custom-control.custom-checkbox
|
||||||
- if @usuarie || policy(post).edit?
|
%input.custom-control-input{ id: checkbox_id,
|
||||||
= link_to t('posts.edit_post'), edit_site_post_path(@site, post.path), class: 'btn btn-secondary'
|
type: 'checkbox',
|
||||||
- if @usuarie || policy(post).destroy?
|
autocomplete: 'off',
|
||||||
= link_to t('posts.destroy'), site_post_path(@site, post.path), class: 'btn btn-secondary', method: :delete, data: { confirm: t('posts.confirm_destroy') }
|
data: { action: 'reorder#select' } }
|
||||||
-#
|
%label.custom-control-label{ for: checkbox_id }
|
||||||
|
%span.sr-only= t('posts.reorder.select')
|
||||||
|
-# Orden más alto es mayor prioridad
|
||||||
|
= hidden_field 'post[reorder]', post.post_id,
|
||||||
|
value: size - i,
|
||||||
|
data: { reorder: true }
|
||||||
|
%td.w-100{ class: dir }
|
||||||
|
= link_to site_post_path(@site, post.path) do
|
||||||
|
%span{ lang: post.locale, dir: dir }= post.title
|
||||||
|
- if post.front_matter['draft'].present?
|
||||||
|
%span.badge.badge-primary= I18n.t('posts.attributes.draft.label')
|
||||||
|
%br
|
||||||
|
%small
|
||||||
|
= link_to @site.layouts[post.layout].humanized_name,
|
||||||
|
site_posts_path(@site, **@filter_params.merge(layout: [post.layout]))
|
||||||
|
- post.front_matter['categories']&.each do |category|
|
||||||
|
= link_to site_posts_path(@site, **@filter_params.merge(category: category)) do
|
||||||
|
%span{ lang: post.locale, dir: dir }= category
|
||||||
|
= '/' unless post.front_matter['categories'].last == category
|
||||||
|
|
||||||
|
%td.text-nowrap
|
||||||
|
= post.created_at.strftime('%F')
|
||||||
|
%br/
|
||||||
|
= post.order
|
||||||
|
%td.text-nowrap
|
||||||
|
.d-flex.flex-row.align-items-start
|
||||||
|
- if @usuarie || policy(post).edit?
|
||||||
|
= link_to t('posts.edit_post'),
|
||||||
|
edit_site_post_path(@site, post.path),
|
||||||
|
class: 'btn btn-secondary'
|
||||||
|
- if @usuarie || policy(post).destroy?
|
||||||
|
= link_to t('posts.destroy'),
|
||||||
|
site_post_path(@site, post.path),
|
||||||
|
class: 'btn btn-secondary',
|
||||||
|
method: :delete,
|
||||||
|
data: { confirm: t('posts.confirm_destroy') }
|
||||||
|
-#
|
||||||
Rescatar cualquier error en un post, notificarlo e
|
Rescatar cualquier error en un post, notificarlo e
|
||||||
ignorar su renderización.
|
ignorar su renderización.
|
||||||
- rescue ActionView::Template::Error => e
|
- rescue ActionView::Template::Error => e
|
||||||
- ExceptionNotifier.notify_exception(e.cause, data: { site: @site.name, post: @post.path.absolute, usuarie: current_usuarie.id })
|
- ExceptionNotifier.notify_exception(e.cause,
|
||||||
|
data: { site: @site.name,
|
||||||
|
post: @post.path.absolute,
|
||||||
|
usuarie: current_usuarie.id })
|
||||||
|
|
||||||
#footnotes{ hidden: true }
|
#footnotes{ hidden: true }
|
||||||
- @filter_params.each do |param, value|
|
- @filter_params.each do |param, value|
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
.col-12.col-lg-8
|
.col-12.col-lg-8
|
||||||
%article.content.table-responsive-md
|
%article.content.table-responsive-md
|
||||||
= link_to t('posts.edit_post'),
|
= link_to t('posts.edit_post'),
|
||||||
edit_site_post_path(@site, @post.id),
|
edit_site_post_path(@site, @post.id),
|
||||||
class: 'btn btn-secondary btn-block'
|
class: 'btn btn-secondary btn-block'
|
||||||
|
|
||||||
%table.table.table-condensed
|
%table.table.table-condensed
|
||||||
%thead
|
%thead
|
||||||
|
|
|
@ -1 +1,3 @@
|
||||||
= link_to t(schema.humanized_name), new_site_post_path(site, layout: schema.value), class: 'stretched-link black text-decoration-none'
|
= link_to t(schema.humanized_name),
|
||||||
|
new_site_post_path(site, layout: schema.value),
|
||||||
|
class: 'stretched-link black text-decoration-none'
|
||||||
|
|
|
@ -1,10 +1,18 @@
|
||||||
%div
|
%div
|
||||||
%input.custom-control-input.magenta{ type: 'checkbox', id: schema, name: "layout[]", class: "", value: schema.name, checked: @filter_params[:layout]&.include?(key.to_s) }
|
%input.custom-control-input.magenta{ type: 'checkbox',
|
||||||
|
id: schema,
|
||||||
|
name: 'layout[]',
|
||||||
|
class: '',
|
||||||
|
value: schema.name,
|
||||||
|
checked: @filter_params[:layout]&.include?(key.to_s) }
|
||||||
%label.custom-control-label.font-weight-normal{ for: schema }= schema.humanized_name
|
%label.custom-control-label.font-weight-normal{ for: schema }= schema.humanized_name
|
||||||
|
|
||||||
|
|
||||||
-# XXX: Solo un nivel de recursividad
|
-# XXX: Solo un nivel de recursividad
|
||||||
- unless local_assigns[:parent_schema]
|
- unless local_assigns[:parent_schema]
|
||||||
- schema.schemas.each do |s|
|
- schema.schemas.each do |s|
|
||||||
- next if s.hidden?
|
- next if s.hidden?
|
||||||
= render 'schemas/filter', schema: s, key: s.name, site: site, filter: filter
|
|
||||||
|
= render 'schemas/filter', schema: s,
|
||||||
|
key: s.name,
|
||||||
|
site: site,
|
||||||
|
filter: filter
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
%tr.border-top.border-magenta
|
%tr.border-top.border-magenta
|
||||||
|
|
||||||
%th.font-weight-normal.w-100.position-relative{ scope: 'row' }
|
%th.font-weight-normal.w-100.position-relative{ scope: 'row' }
|
||||||
- if local_assigns[:parent_schema]
|
- if local_assigns[:parent_schema]
|
||||||
%span.text-muted —
|
%span.text-muted —
|
||||||
= render 'schemas/add', schema: schema, **local_assigns
|
= render 'schemas/add', schema: schema, **local_assigns
|
||||||
|
|
||||||
-# XXX: Solo un nivel de recursividad
|
-# XXX: Solo un nivel de recursividad
|
||||||
- unless local_assigns[:parent_schema]
|
- unless local_assigns[:parent_schema]
|
||||||
- schema.schemas.each do |s|
|
- schema.schemas.each do |s|
|
||||||
- next if s.hidden?
|
- next if s.hidden?
|
||||||
= render 'schemas/row', schema: s, site: site, filter: filter, parent_schema: schema
|
|
||||||
|
|
||||||
|
= render 'schemas/row', schema: s,
|
||||||
|
site: site,
|
||||||
|
filter: filter,
|
||||||
|
parent_schema: schema
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
- site.errors.messages.each_pair do |attr, error|
|
- site.errors.messages.each_pair do |attr, error|
|
||||||
- attr = attr.to_s
|
- attr = attr.to_s
|
||||||
- error.each do |e|
|
- error.each do |e|
|
||||||
%li= link_to t('activerecord.attributes.site.' + attr) + ' ' + e, '#' + attr
|
%li= link_to "#{t("activerecord.attributes.site.#{attr}")} #{e}", "##{attr}"
|
||||||
|
|
||||||
= form_for site, html: { class: form_class(site) } do |f|
|
= form_for site, html: { class: form_class(site) } do |f|
|
||||||
- unless site.persisted?
|
- unless site.persisted?
|
||||||
|
@ -21,11 +21,11 @@
|
||||||
No puede estar compuesto solo de números
|
No puede estar compuesto solo de números
|
||||||
|
|
||||||
= f.text_field :name,
|
= f.text_field :name,
|
||||||
class: form_control(site, :name),
|
class: form_control(site, :name),
|
||||||
required: true,
|
required: true,
|
||||||
pattern: '^([a-z0-9][a-z0-9\-]*)?[a-z0-9\.]$',
|
pattern: '^([a-z0-9][a-z0-9\-]*)?[a-z0-9\.]$',
|
||||||
minlength: 1,
|
minlength: 1,
|
||||||
maxlength: 63
|
maxlength: 63
|
||||||
- if invalid? site, :name
|
- if invalid? site, :name
|
||||||
.invalid-feedback= site.errors.messages[:name].join(', ')
|
.invalid-feedback= site.errors.messages[:name].join(', ')
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
%h2= f.label :title
|
%h2= f.label :title
|
||||||
%p.lead= t('.help.title')
|
%p.lead= t('.help.title')
|
||||||
= f.text_field :title, class: form_control(site, :title),
|
= f.text_field :title, class: form_control(site, :title),
|
||||||
required: true
|
required: true
|
||||||
- if invalid? site, :title
|
- if invalid? site, :title
|
||||||
.invalid-feedback= site.errors.messages[:title].join(', ')
|
.invalid-feedback= site.errors.messages[:title].join(', ')
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@
|
||||||
%h2= f.label :description
|
%h2= f.label :description
|
||||||
%p.lead= t('.help.description')
|
%p.lead= t('.help.description')
|
||||||
= f.text_area :description, class: form_control(site, :description),
|
= f.text_area :description, class: form_control(site, :description),
|
||||||
maxlength: 160, minlength: 10, required: true
|
maxlength: 160, minlength: 10, required: true
|
||||||
- if invalid? site, :description
|
- if invalid? site, :description
|
||||||
.invalid-feedback= site.errors.messages[:description].join(', ')
|
.invalid-feedback= site.errors.messages[:description].join(', ')
|
||||||
%hr/
|
%hr/
|
||||||
|
@ -53,29 +53,29 @@
|
||||||
- if invalid? site, :design_id
|
- if invalid? site, :design_id
|
||||||
= render 'bootstrap/alert' do
|
= render 'bootstrap/alert' do
|
||||||
= t('activerecord.errors.models.site.attributes.design_id.layout_incompatible.help',
|
= t('activerecord.errors.models.site.attributes.design_id.layout_incompatible.help',
|
||||||
layouts: site.incompatible_layouts.to_sentence)
|
layouts: site.incompatible_layouts.to_sentence)
|
||||||
.row.row-cols-1.row-cols-md-2.designs
|
.row.row-cols-1.row-cols-md-2.designs
|
||||||
-# Demasiado complejo para un f.collection_radio_buttons
|
-# Demasiado complejo para un f.collection_radio_buttons
|
||||||
- Design.all.order(priority: :desc).each do |design|
|
- Design.all.order(priority: :desc).each do |design|
|
||||||
.design.col.d-flex.flex-column
|
.design.col.d-flex.flex-column
|
||||||
.custom-control.custom-radio
|
.custom-control.custom-radio
|
||||||
= f.radio_button :design_id, design.id,
|
= f.radio_button :design_id, design.id,
|
||||||
checked: design.id == site.design_id,
|
checked: design.id == site.design_id,
|
||||||
disabled: design.disabled,
|
disabled: design.disabled,
|
||||||
required: true, class: 'custom-control-input'
|
required: true, class: 'custom-control-input'
|
||||||
= f.label "design_id_#{design.id}", design.name,
|
= f.label "design_id_#{design.id}", design.name,
|
||||||
class: 'custom-control-label'
|
class: 'custom-control-label'
|
||||||
.flex-fill
|
.flex-fill
|
||||||
= sanitize_markdown design.description,
|
= sanitize_markdown design.description,
|
||||||
tags: %w[p a strong em]
|
tags: %w[p a strong em]
|
||||||
|
|
||||||
.btn-group{ role: 'group', 'aria-label': t('.design.actions') }
|
.btn-group{ role: 'group', 'aria-label': t('.design.actions') }
|
||||||
- if design.url
|
- if design.url
|
||||||
= link_to t('.design.url'), design.url,
|
= link_to t('.design.url'), design.url,
|
||||||
target: '_blank', class: 'btn btn-secondary'
|
target: '_blank', class: 'btn btn-secondary'
|
||||||
- if design.license
|
- if design.license
|
||||||
= link_to t('.design.license'), design.license,
|
= link_to t('.design.license'), design.license,
|
||||||
target: '_blank', class: 'btn btn-secondary'
|
target: '_blank', class: 'btn btn-secondary'
|
||||||
%hr/
|
%hr/
|
||||||
|
|
||||||
.form-group.licenses#license_id
|
.form-group.licenses#license_id
|
||||||
|
@ -83,6 +83,7 @@
|
||||||
%p.lead= t('.help.licencia')
|
%p.lead= t('.help.licencia')
|
||||||
- Licencia.all.find_each do |licencia|
|
- Licencia.all.find_each do |licencia|
|
||||||
- next if licencia.custom? && site.licencia != licencia
|
- next if licencia.custom? && site.licencia != licencia
|
||||||
|
|
||||||
.row.license
|
.row.license
|
||||||
.col
|
.col
|
||||||
.media.mt-1
|
.media.mt-1
|
||||||
|
@ -91,15 +92,19 @@
|
||||||
.media-body
|
.media-body
|
||||||
.custom-control.custom-radio
|
.custom-control.custom-radio
|
||||||
= f.radio_button :licencia_id, licencia.id,
|
= f.radio_button :licencia_id, licencia.id,
|
||||||
checked: licencia.id == site.licencia_id,
|
checked: licencia.id == site.licencia_id,
|
||||||
required: true, class: 'custom-control-input'
|
required: true, class: 'custom-control-input'
|
||||||
= f.label "licencia_id_#{licencia.id}", class: 'custom-control-label' do
|
= f.label "licencia_id_#{licencia.id}", class: 'custom-control-label' do
|
||||||
= licencia.name
|
= licencia.name
|
||||||
= sanitize_markdown licencia.description,
|
= sanitize_markdown licencia.description,
|
||||||
tags: %w[p a strong em ul ol li h1 h2 h3 h4 h5 h6]
|
tags: %w[p a strong em ul ol li h1 h2 h3 h4 h5 h6]
|
||||||
|
|
||||||
- unless licencia.custom?
|
- unless licencia.custom?
|
||||||
= link_to t('.licencia.url'), licencia.url, target: '_blank', class: 'btn btn-secondary', rel: 'noopener'
|
= link_to t('.licencia.url'),
|
||||||
|
licencia.url,
|
||||||
|
target: '_blank',
|
||||||
|
class: 'btn btn-secondary',
|
||||||
|
rel: 'noopener'
|
||||||
|
|
||||||
%hr/
|
%hr/
|
||||||
|
|
||||||
|
@ -161,7 +166,7 @@
|
||||||
- site.deployment_list.each do |deploy|
|
- site.deployment_list.each do |deploy|
|
||||||
= f.fields_for :deploys, deploy do |deploy_fields|
|
= f.fields_for :deploys, deploy do |deploy_fields|
|
||||||
= render "deploys/#{deploy.type.underscore}",
|
= render "deploys/#{deploy.type.underscore}",
|
||||||
deploy: deploy_fields, site: site
|
deploy: deploy_fields, site: site
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
= f.submit submit, class: 'btn btn-secondary btn-lg btn-block'
|
= f.submit submit, class: 'btn btn-secondary btn-lg btn-block'
|
||||||
|
|
|
@ -4,12 +4,17 @@
|
||||||
%form.mb-3{ action: site_posts_path }
|
%form.mb-3{ action: site_posts_path }
|
||||||
- @filter_params.each do |param, values|
|
- @filter_params.each do |param, values|
|
||||||
- next if param == :q
|
- next if param == :q
|
||||||
|
|
||||||
- [values].flatten.each do |value|
|
- [values].flatten.each do |value|
|
||||||
%input{ type: 'hidden', name: values.is_a?(Array) ? "#{param}[]" : param, value: value }
|
%input{ type: 'hidden',
|
||||||
|
name: values.is_a?(Array) ? "#{param}[]" : param,
|
||||||
|
value: value }
|
||||||
.form-group.flex-grow-0.m-0
|
.form-group.flex-grow-0.m-0
|
||||||
%label.h3{for: 'q'}= t('posts.index.search')
|
%label.h3{ for: 'q' }= t('posts.index.search')
|
||||||
.input-group
|
.input-group
|
||||||
%input#q.form-control.border.border-magenta.border-right-0{ type: 'search', name: 'q', value: @filter_params[:q] }
|
%input.form-control.border.border-magenta.border-right-0#q{ type: 'search',
|
||||||
|
name: 'q',
|
||||||
|
value: @filter_params[:q] }
|
||||||
.input-group-append
|
.input-group-append
|
||||||
%span.input-group-text.background-white.magenta.border.border-magenta.border-top.border-left-0.border-right.border-bottom
|
%span.input-group-text.background-white.magenta.border.border-magenta.border-top.border-left-0.border-right.border-bottom
|
||||||
%i.fa.fa-fw.fa-search
|
%i.fa.fa-fw.fa-search
|
||||||
|
@ -17,9 +22,9 @@
|
||||||
- @filter_params.each do |param, values|
|
- @filter_params.each do |param, values|
|
||||||
- [values].flatten.each do |value|
|
- [values].flatten.each do |value|
|
||||||
= link_to site_posts_path(@site, **filter_params_by(@filter_params, param, value)),
|
= link_to site_posts_path(@site, **filter_params_by(@filter_params, param, value)),
|
||||||
class: 'btn btn-secondary btn-sm',
|
class: 'btn btn-secondary btn-sm',
|
||||||
title: t('posts.remove_filter_help', filter: value),
|
title: t('posts.remove_filter_help', filter: value),
|
||||||
aria: { labelledby: "help-filter-#{param}" } do
|
aria: { labelledby: "help-filter-#{param}" } do
|
||||||
- if param == :layout
|
- if param == :layout
|
||||||
= @site.layouts[value.to_sym].humanized_name
|
= @site.layouts[value.to_sym].humanized_name
|
||||||
- else
|
- else
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
resumen, cortamos por el primer salto de línea doble y obtenemos
|
resumen, cortamos por el primer salto de línea doble y obtenemos
|
||||||
todo lo demás
|
todo lo demás
|
||||||
= sanitize_markdown commit.message.split("\n\n", 2).last,
|
= sanitize_markdown commit.message.split("\n\n", 2).last,
|
||||||
tags: %w[p a h1 h2 h3 h4 h5 h6 ol ul li strong em]
|
tags: %w[p a h1 h2 h3 h4 h5 h6 ol ul li strong em]
|
||||||
|
|
||||||
%hr
|
%hr
|
||||||
|
|
||||||
|
@ -27,4 +27,4 @@
|
||||||
.row.justify-content-center
|
.row.justify-content-center
|
||||||
.col-12.col-lg-8
|
.col-12.col-lg-8
|
||||||
= link_to t('.merge.request'), site_pull_path(@site),
|
= link_to t('.merge.request'), site_pull_path(@site),
|
||||||
method: 'post', class: 'btn btn-secondary btn-lg'
|
method: 'post', class: 'btn btn-secondary btn-lg'
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
%tbody
|
%tbody
|
||||||
- @sites.each do |site|
|
- @sites.each do |site|
|
||||||
- next unless site.jekyll?
|
- next unless site.jekyll?
|
||||||
|
|
||||||
%tr
|
%tr
|
||||||
%td
|
%td
|
||||||
%h2
|
%h2
|
||||||
|
|
|
@ -11,10 +11,19 @@
|
||||||
|
|
||||||
%form.mb-5.form-inline{ method: 'get' }
|
%form.mb-5.form-inline{ method: 'get' }
|
||||||
- Stat::INTERVALS.each do |interval|
|
- Stat::INTERVALS.each do |interval|
|
||||||
= link_to t(".#{interval}"), site_stats_path(interval: interval, urls: params[:urls], period_start: params[:period_start].to_date.try(:"beginning_of_#{interval}").to_date, period_end: params[:period_end]), class: "mb-0 btn #{@interval == interval ? 'btn-primary active' : 'btn-secondary' }"
|
= link_to t(".#{interval}"),
|
||||||
|
site_stats_path(interval: interval,
|
||||||
|
urls: params[:urls],
|
||||||
|
period_start: params[:period_start].to_date.try(:"beginning_of_#{interval}").to_date,
|
||||||
|
period_end: params[:period_end]),
|
||||||
|
class: "mb-0 btn #{@interval == interval ? 'btn-primary active' : 'btn-secondary'}"
|
||||||
|
|
||||||
%input.form-control{ type: 'date', name: :period_start, value: params[:period_start] }
|
%input.form-control{ type: 'date',
|
||||||
%input.form-control{ type: 'date', name: :period_end, value: params[:period_end] }
|
name: :period_start,
|
||||||
|
value: params[:period_start] }
|
||||||
|
%input.form-control{ type: 'date',
|
||||||
|
name: :period_end,
|
||||||
|
value: params[:period_end] }
|
||||||
%button.btn.btn-secondary.mb-0{ type: 'submit' }= t('.filter')
|
%button.btn.btn-secondary.mb-0{ type: 'submit' }= t('.filter')
|
||||||
|
|
||||||
.mb-5
|
.mb-5
|
||||||
|
@ -22,17 +31,27 @@
|
||||||
%p.lead= t('.host.description')
|
%p.lead= t('.host.description')
|
||||||
= line_chart site_stats_host_path(@chart_params), **@chart_options
|
= line_chart site_stats_host_path(@chart_params), **@chart_options
|
||||||
|
|
||||||
#custom-urls.mb-5
|
.mb-5#custom-urls
|
||||||
%h2= t('.urls.title')
|
%h2= t('.urls.title')
|
||||||
%p.lead= t('.urls.description')
|
%p.lead= t('.urls.description')
|
||||||
%form{ method: 'get', action: '#custom-urls' }
|
%form{ method: 'get', action: '#custom-urls' }
|
||||||
%input{ type: 'hidden', name: 'interval', value: @interval }
|
%input{ type: 'hidden',
|
||||||
%input{ type: 'hidden', name: 'period_start', value: params[:period_start] }
|
name: 'interval',
|
||||||
%input{ type: 'hidden', name: 'period_end', value: params[:period_end] }
|
value: @interval }
|
||||||
|
%input{ type: 'hidden',
|
||||||
|
name: 'period_start',
|
||||||
|
value: params[:period_start] }
|
||||||
|
%input{ type: 'hidden',
|
||||||
|
name: 'period_end',
|
||||||
|
value: params[:period_end] }
|
||||||
.form-group
|
.form-group
|
||||||
%label{ for: 'urls' }= t('.urls.label')
|
%label{ for: 'urls' }= t('.urls.label')
|
||||||
%textarea#urls.form-control{ name: 'urls', autocomplete: 'on', required: true, rows: @normalized_urls.size + 1, aria_describedby: 'help-urls' }= @normalized_urls.join("\n")
|
%textarea.form-control#urls{ name: 'urls',
|
||||||
%small#help-urls.feedback.form-text.text-muted= t('.urls.help')
|
autocomplete: 'on',
|
||||||
|
required: true,
|
||||||
|
rows: @normalized_urls.size + 1,
|
||||||
|
aria_describedby: 'help-urls' }= @normalized_urls.join("\n")
|
||||||
|
%small.feedback.form-text.text-muted#help-urls= t('.urls.help')
|
||||||
.form-group
|
.form-group
|
||||||
%button.btn.btn-secondary{ type: 'submit' }= t('.urls.submit')
|
%button.btn.btn-secondary{ type: 'submit' }= t('.urls.submit')
|
||||||
- if @normalized_urls.present?
|
- if @normalized_urls.present?
|
||||||
|
@ -41,6 +60,7 @@
|
||||||
.row.mb-5.row-cols-1.row-cols-lg-2
|
.row.mb-5.row-cols-1.row-cols-lg-2
|
||||||
- @columns.each_pair do |column, values|
|
- @columns.each_pair do |column, values|
|
||||||
- next if values.blank?
|
- next if values.blank?
|
||||||
|
|
||||||
.col.mb-5
|
.col.mb-5
|
||||||
%h2= t(".columns.#{column}.title")
|
%h2= t(".columns.#{column}.title")
|
||||||
%p.lead= t(".columns.#{column}.description")
|
%p.lead= t(".columns.#{column}.description")
|
||||||
|
@ -57,7 +77,8 @@
|
||||||
%tbody
|
%tbody
|
||||||
- values.each_pair do |col, val|
|
- values.each_pair do |col, val|
|
||||||
%tr
|
%tr
|
||||||
%th{ scope: 'row', style: 'word-break: break-all' }= col.blank? ? t(".columns.#{column}.empty") : col
|
%th.break-all{ scope: 'row' }
|
||||||
|
= col.blank? ? t(".columns.#{column}.empty") : col
|
||||||
%td= val
|
%td= val
|
||||||
.mb-5
|
.mb-5
|
||||||
%h2= t('.resources.title')
|
%h2= t('.resources.title')
|
||||||
|
@ -67,4 +88,5 @@
|
||||||
.mb-5
|
.mb-5
|
||||||
%h3= t(".resources.#{resource}.title")
|
%h3= t(".resources.#{resource}.title")
|
||||||
%p.lead= t(".resources.#{resource}.description")
|
%p.lead= t(".resources.#{resource}.description")
|
||||||
= line_chart site_stats_resources_path(resource: resource, **@chart_params), **@chart_options.merge(StatsController::EXTRA_OPTIONS[resource])
|
= line_chart site_stats_resources_path(resource: resource, **@chart_params),
|
||||||
|
**@chart_options.merge(StatsController::EXTRA_OPTIONS[resource])
|
||||||
|
|
|
@ -8,16 +8,16 @@
|
||||||
.btn-group{ role: 'group', 'aria-label': t('.actions') }
|
.btn-group{ role: 'group', 'aria-label': t('.actions') }
|
||||||
- if @policy.invite?
|
- if @policy.invite?
|
||||||
= link_to t('.invite'),
|
= link_to t('.invite'),
|
||||||
site_usuaries_invite_path(@site, invite_as: u.to_s),
|
site_usuaries_invite_path(@site, invite_as: u.to_s),
|
||||||
class: 'btn btn-secondary',
|
class: 'btn btn-secondary',
|
||||||
data: { toggle: 'tooltip' },
|
data: { toggle: 'tooltip' },
|
||||||
title: t('.help.invite', invite_as: u.to_s)
|
title: t('.help.invite', invite_as: u.to_s)
|
||||||
- if policy(Collaboration.new(@site)).collaborate?
|
- if policy(Collaboration.new(@site)).collaborate?
|
||||||
= link_to t('.public_invite'),
|
= link_to t('.public_invite'),
|
||||||
site_collaborate_path(@site),
|
site_collaborate_path(@site),
|
||||||
class: 'btn btn-secondary',
|
class: 'btn btn-secondary',
|
||||||
data: { toggle: 'tooltip' },
|
data: { toggle: 'tooltip' },
|
||||||
title: t('.help.public_invite')
|
title: t('.help.public_invite')
|
||||||
%p.lead= t(".help.#{u}")
|
%p.lead= t(".help.#{u}")
|
||||||
%table.table.table-condensed
|
%table.table.table-condensed
|
||||||
%tbody
|
%tbody
|
||||||
|
@ -34,28 +34,28 @@
|
||||||
%span.badge.badge-info= t('.invited')
|
%span.badge.badge-info= t('.invited')
|
||||||
%td
|
%td
|
||||||
.btn-group{ role: 'group',
|
.btn-group{ role: 'group',
|
||||||
aria: { label: t('.individual_actions') } }
|
aria: { label: t('.individual_actions') } }
|
||||||
- if @policy.demote? && @site.usuarie?(cuenta)
|
- if @policy.demote? && @site.usuarie?(cuenta)
|
||||||
= link_to t('.demote.text'),
|
= link_to t('.demote.text'),
|
||||||
site_usuarie_demote_path(@site, cuenta),
|
site_usuarie_demote_path(@site, cuenta),
|
||||||
class: 'btn btn-secondary',
|
class: 'btn btn-secondary',
|
||||||
data: { toggle: 'tooltip',
|
data: { toggle: 'tooltip',
|
||||||
confirm: t('.demote.confirm') },
|
confirm: t('.demote.confirm') },
|
||||||
title: t('.help.demote'),
|
title: t('.help.demote'),
|
||||||
method: :patch
|
method: :patch
|
||||||
- if @policy.promote? && @site.invitade?(cuenta)
|
- if @policy.promote? && @site.invitade?(cuenta)
|
||||||
= link_to t('.promote.text'),
|
= link_to t('.promote.text'),
|
||||||
site_usuarie_promote_path(@site, cuenta),
|
site_usuarie_promote_path(@site, cuenta),
|
||||||
class: 'btn btn-secondary',
|
class: 'btn btn-secondary',
|
||||||
data: { toggle: 'tooltip',
|
data: { toggle: 'tooltip',
|
||||||
confirm: t('.promote.confirm') },
|
confirm: t('.promote.confirm') },
|
||||||
title: t('.help.promote'),
|
title: t('.help.promote'),
|
||||||
method: :patch
|
method: :patch
|
||||||
- if @policy.destroy?
|
- if @policy.destroy?
|
||||||
= link_to t('.destroy.text'),
|
= link_to t('.destroy.text'),
|
||||||
site_usuarie_path(@site, cuenta),
|
site_usuarie_path(@site, cuenta),
|
||||||
class: 'btn btn-secondary',
|
class: 'btn btn-secondary',
|
||||||
data: { toggle: 'tooltip',
|
data: { toggle: 'tooltip',
|
||||||
confirm: t('.destroy.confirm') },
|
confirm: t('.destroy.confirm') },
|
||||||
title: t('.help.destroy'),
|
title: t('.help.destroy'),
|
||||||
method: :delete
|
method: :delete
|
||||||
|
|
|
@ -9,8 +9,8 @@
|
||||||
.form-group
|
.form-group
|
||||||
= f.label :invitaciones do
|
= f.label :invitaciones do
|
||||||
= t('.invitaciones')
|
= t('.invitaciones')
|
||||||
%small.text-muted.form-text= t('.help.invitaciones',
|
%small.text-muted.form-text
|
||||||
invite_as: invite_as)
|
= t('.help.invitaciones', invite_as: invite_as)
|
||||||
= f.text_area :invitaciones, class: 'form-control'
|
= f.text_area :invitaciones, class: 'form-control'
|
||||||
.form-group
|
.form-group
|
||||||
= f.submit t('.submit'), class: 'btn btn-secondary'
|
= f.submit t('.submit'), class: 'btn btn-secondary'
|
||||||
|
|
|
@ -46,7 +46,7 @@ Rails.application.configure do
|
||||||
# The :test delivery method accumulates sent emails in the
|
# The :test delivery method accumulates sent emails in the
|
||||||
# ActionMailer::Base.deliveries array.
|
# ActionMailer::Base.deliveries array.
|
||||||
config.action_mailer.delivery_method = :test
|
config.action_mailer.delivery_method = :test
|
||||||
config.action_mailer.default_options = { from: ENV['DEFAULT_FROM'] }
|
config.action_mailer.default_options = { from: ENV.fetch('DEFAULT_FROM', nil) }
|
||||||
config.action_mailer.default_url_options = { host: 'localhost',
|
config.action_mailer.default_url_options = { host: 'localhost',
|
||||||
port: 3000 }
|
port: 3000 }
|
||||||
|
|
||||||
|
@ -54,8 +54,8 @@ Rails.application.configure do
|
||||||
error_grouping: true,
|
error_grouping: true,
|
||||||
email: {
|
email: {
|
||||||
email_prefix: '',
|
email_prefix: '',
|
||||||
sender_address: ENV['DEFAULT_FROM'],
|
sender_address: ENV.fetch('DEFAULT_FROM', nil),
|
||||||
exception_recipients: ENV['EXCEPTION_TO'],
|
exception_recipients: ENV.fetch('EXCEPTION_TO', nil),
|
||||||
normalize_subject: true
|
normalize_subject: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -167,9 +167,7 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'si hay algún error se recupera' do
|
test 'si hay algún error se recupera' do
|
||||||
File.open(File.join(@site.path, '_es', "#{Date.today}-#{SecureRandom.hex}.markdown"), 'w') do |f|
|
File.write(File.join(@site.path, '_es', "#{Date.today}-#{SecureRandom.hex}.markdown"), '')
|
||||||
f.write ''
|
|
||||||
end
|
|
||||||
|
|
||||||
get site_posts_url(@site), headers: @authorization
|
get site_posts_url(@site), headers: @authorization
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue