5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-06-17 10:42:20 +00:00

Merge branch 'production.panel.sutty.nl' into panel.testing.sutty.nl

This commit is contained in:
f 2024-03-26 11:44:56 -03:00
commit 8a8de8ac9d
No known key found for this signature in database
31 changed files with 97 additions and 76 deletions

View file

@ -79,6 +79,7 @@ gem 'webpacker'
gem 'yaml_db', git: 'https://0xacab.org/sutty/yaml_db.git' gem 'yaml_db', git: 'https://0xacab.org/sutty/yaml_db.git'
gem 'kaminari' gem 'kaminari'
gem 'device_detector' gem 'device_detector'
gem 'htmlbeautifier'
gem 'rubanok' gem 'rubanok'
gem 'after_commit_everywhere', '~> 1.0' gem 'after_commit_everywhere', '~> 1.0'

View file

@ -270,6 +270,7 @@ GEM
hiredis (0.6.3-x86_64-linux-musl) hiredis (0.6.3-x86_64-linux-musl)
hiredis-client (0.14.1-x86_64-linux-musl) hiredis-client (0.14.1-x86_64-linux-musl)
redis-client (= 0.14.1) redis-client (= 0.14.1)
htmlbeautifier (1.4.2)
http_parser.rb (0.8.0-x86_64-linux-musl) http_parser.rb (0.8.0-x86_64-linux-musl)
httparty (0.21.0) httparty (0.21.0)
mini_mime (>= 1.0.0) mini_mime (>= 1.0.0)
@ -659,6 +660,7 @@ DEPENDENCIES
hamlit-rails hamlit-rails
hiredis hiredis
hiredis-client hiredis-client
htmlbeautifier
httparty httparty
icalendar icalendar
image_processing image_processing

View file

@ -0,0 +1,19 @@
import { Controller } from 'stimulus'
import bsCustomFileInput from "bs-custom-file-input";
document.addEventListener("turbolinks:load", () => {
bsCustomFileInput.init();
});
export default class extends Controller {
static targets = ["preview", "input"];
connect() {
}
update(event = undefined) {
if (!this.hasPreviewTarget) return;
this.previewTarget.src = window.URL.createObjectURL(this.inputTarget.files[0])
}
}

View file

@ -1,11 +0,0 @@
document.addEventListener('turbolinks:load', () => {
document.querySelectorAll('input[type=file]').forEach(file => {
if (!file.dataset.preview) return
file.addEventListener('change', event => {
if (file.files.length === 0) return
document.querySelector('#' + file.dataset.preview).src = window.URL.createObjectURL(file.files[0])
})
})
})

View file

@ -1,5 +1,4 @@
import './external_links' import './external_links'
import './image_preview'
import './input-date' import './input-date'
import './input-tag' import './input-tag'
import './prosemirror' import './prosemirror'

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'htmlbeautifier'
# Se encarga del contenido del artículo y quizás otros campos que # Se encarga del contenido del artículo y quizás otros campos que
# requieran texto largo. # requieran texto largo.
class MetadataContent < MetadataTemplate class MetadataContent < MetadataTemplate
@ -91,7 +93,7 @@ class MetadataContent < MetadataTemplate
end end
end end
html.to_s.html_safe HtmlBeautifier.beautify(html.to_s).html_safe
end end
# Limpia estilos en base a una lista de permitidos # Limpia estilos en base a una lista de permitidos

View file

@ -36,8 +36,7 @@ class SiteUsuariePolicy
end end
def accept_invitation? def accept_invitation?
su = site_usuarie !!site_usuarie.usuarie.rol_for_site(site_usuarie.site)&.temporal
(usuarie? || invitade?) && su.usuarie.rol_for_site(su.site).temporal
end end
def reject_invitation? def reject_invitation?

View file

@ -1,12 +1,14 @@
.form-group .form-group{ data: { controller: 'file-preview' } }
- 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' }
- 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' }
- when 'application/pdf' - when 'application/pdf'
%iframe{ src: url_for(metadata.static_file) } %iframe{ src: url_for(metadata.static_file) }
- else - else
@ -24,7 +26,7 @@
= 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, metadata, required: (metadata.required && !metadata.path?)),
class: "custom-file-input #{invalid(post, attribute)}", class: "custom-file-input #{invalid(post, attribute)}",
data: { preview: "#{attribute}-preview" }) 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',

View file

@ -1,9 +1,9 @@
.form-group .form-group{ data: { controller: 'file-preview' } }
- 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',
id: "#{attribute}-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']
@ -16,13 +16,14 @@
= image_tag '', = image_tag '',
alt: metadata.value['description'], alt: metadata.value['description'],
class: 'img-fluid', class: 'img-fluid',
id: "#{attribute}-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, metadata, required: (metadata.required && !metadata.path?)),
class: "custom-file-input #{invalid(post, attribute)}", class: "custom-file-input #{invalid(post, attribute)}",
accept: ActiveStorage.web_image_content_types.join(','), data: { preview: "#{attribute}-preview" }) 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',

View file

@ -24,30 +24,31 @@
= site.title = site.title
%p.lead= site.description %p.lead= site.description
%br %br
= link_to t('.visit'), site.url, class: 'btn btn-secondary' .d-flex.flex-row
- if current_usuarie.rol_for_site(site).temporal? = link_to t('.visit'), site.url, class: 'btn btn-secondary'
= render 'components/btn_base', - if current_usuarie.rol_for_site(site).temporal?
text: t('sites.invitations.accept'), = render 'components/btn_base',
path: site_usuaries_accept_invitation_path(site), text: t('sites.invitations.accept'),
title: t('help.sites.invitations.accept'), path: site_usuaries_accept_invitation_path(site),
class: 'btn-secondary' title: t('help.sites.invitations.accept'),
= render 'components/btn_base', class: 'btn-secondary'
text: t('sites.invitations.reject'), = render 'components/btn_base',
path: site_usuaries_reject_invitation_path(site), text: t('sites.invitations.reject'),
title: t('help.sites.invitations.reject'), path: site_usuaries_reject_invitation_path(site),
class: 'btn-secondary' title: t('help.sites.invitations.reject'),
- else class: 'btn-secondary'
- if policy(site).show? - else
= render 'layouts/btn_with_tooltip', - if policy(site).show?
tooltip: t('help.sites.edit_posts'), = render 'layouts/btn_with_tooltip',
type: 'success', tooltip: t('help.sites.edit_posts'),
link: site_path(site), type: 'success',
text: t('sites.posts') link: site_path(site),
= render 'sites/build', site: site text: t('sites.posts')
= render 'sites/moderation_queue', site: site = render 'sites/build', site: site
- if policy(SiteUsuarie.new(site, current_usuarie)).index? = render 'sites/moderation_queue', site: site
= render 'layouts/btn_with_tooltip', - if policy(SiteUsuarie.new(site, current_usuarie)).index?
tooltip: t('usuaries.index.help.self'), = render 'layouts/btn_with_tooltip',
text: t('usuaries.index.title'), tooltip: t('usuaries.index.help.self'),
type: 'info', text: t('usuaries.index.title'),
link: site_usuaries_path(site) type: 'info',
link: site_usuaries_path(site)

View file

@ -7,7 +7,7 @@
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
Rails.application.config.content_security_policy do |policy| Rails.application.config.content_security_policy do |policy|
policy.default_src :self policy.default_src :self, :blob
# XXX: Varios scripts generan estilos en línea # XXX: Varios scripts generan estilos en línea
policy.style_src :self, :unsafe_inline, :https policy.style_src :self, :unsafe_inline, :https
# Repetimos la default para poder saber cuál es la política en falta # Repetimos la default para poder saber cuál es la política en falta

View file

@ -15,6 +15,7 @@
"@rails/webpacker": "5.4.4", "@rails/webpacker": "5.4.4",
"@suttyweb/editor": "^0.1.25", "@suttyweb/editor": "^0.1.25",
"babel-loader": "^8.2.2", "babel-loader": "^8.2.2",
"bs-custom-file-input": "^1.3.4",
"chart.js": "^3.5.1", "chart.js": "^3.5.1",
"chartkick": "^4.0.5", "chartkick": "^4.0.5",
"circular-dependency-plugin": "^5.2.2", "circular-dependency-plugin": "^5.2.2",

BIN
public/packs/js/application-59000072ac88ea7cfdf0.js (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
public/packs/js/application-59000072ac88ea7cfdf0.js.br (Stored with Git LFS) Normal file

Binary file not shown.

BIN
public/packs/js/application-59000072ac88ea7cfdf0.js.gz (Stored with Git LFS) Normal file

Binary file not shown.

BIN
public/packs/js/application-59000072ac88ea7cfdf0.js.map (Stored with Git LFS) Normal file

Binary file not shown.

BIN
public/packs/js/application-59000072ac88ea7cfdf0.js.map.br (Stored with Git LFS) Normal file

Binary file not shown.

BIN
public/packs/js/application-59000072ac88ea7cfdf0.js.map.gz (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
public/packs/manifest.json (Stored with Git LFS)

Binary file not shown.

BIN
public/packs/manifest.json.br (Stored with Git LFS)

Binary file not shown.

BIN
public/packs/manifest.json.gz (Stored with Git LFS)

Binary file not shown.

View file

@ -2677,6 +2677,11 @@ browserslist@^4.22.2:
node-releases "^2.0.14" node-releases "^2.0.14"
update-browserslist-db "^1.0.13" update-browserslist-db "^1.0.13"
bs-custom-file-input@^1.3.4:
version "1.3.4"
resolved "https://registry.yarnpkg.com/bs-custom-file-input/-/bs-custom-file-input-1.3.4.tgz#c275cb8d4f1c02ba026324292509fa9a747dbda8"
integrity sha512-NBsQzTnef3OW1MvdKBbMHAYHssCd613MSeJV7z2McXznWtVMnJCy7Ckyc+PwxV6Pk16cu6YBcYWh/ZE0XWNKCA==
buffer-from@^1.0.0: buffer-from@^1.0.0:
version "1.1.1" version "1.1.1"
resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz"