feat(messages): use trix editor in messages
This commit is contained in:
parent
c4a53caf52
commit
ef6d6aa368
14 changed files with 83 additions and 5 deletions
9
app/views/active_storage/blobs/_blob.html.haml
Normal file
9
app/views/active_storage/blobs/_blob.html.haml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
%figure{class: "attachment attachment--#{blob.representable? ? "preview" : "file"} attachment--#{blob.filename.extension}"}
|
||||||
|
- if blob.representable?
|
||||||
|
= image_tag blob.representation(resize_to_limit: local_assigns[:in_gallery] ? [ 800, 600 ] : [ 1024, 768 ])
|
||||||
|
%figcaption.attachment__caption
|
||||||
|
- if caption = blob.try(:caption)
|
||||||
|
= caption
|
||||||
|
- else
|
||||||
|
%span.attachment__name= link_to blob.filename, blob
|
||||||
|
%span.attachment__size= number_to_human_size blob.byte_size
|
12
app/views/layouts/email.html.haml
Normal file
12
app/views/layouts/email.html.haml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
= yield
|
||||||
|
\
|
||||||
|
%hr
|
||||||
|
%ul
|
||||||
|
%li
|
||||||
|
%a{href: root_url} Foodsoft
|
||||||
|
- if FoodsoftConfig[:homepage]
|
||||||
|
%li
|
||||||
|
%a{href: FoodsoftConfig[:homepage]} Foodcoop
|
||||||
|
- if FoodsoftConfig[:help_url]
|
||||||
|
%li
|
||||||
|
%a{href: FoodsoftConfig[:help_url]}= t '.help'
|
|
@ -0,0 +1,32 @@
|
||||||
|
class MigrateMessageBodyToActionText < ActiveRecord::Migration[7.0]
|
||||||
|
include ActionView::Helpers::TextHelper
|
||||||
|
|
||||||
|
class Message < ApplicationRecord
|
||||||
|
has_rich_text :body
|
||||||
|
end
|
||||||
|
|
||||||
|
def change
|
||||||
|
reversible do |dir|
|
||||||
|
dir.up do
|
||||||
|
rename_column :messages, :body, :body_old
|
||||||
|
Message.all.each do |message|
|
||||||
|
message.update(body: simple_format(message.body_old))
|
||||||
|
message.body.update(record_type: :Message) # action_text_rich_texts uses STI record_type field and has to be set to the real model
|
||||||
|
end
|
||||||
|
remove_column :messages, :body_old, :text
|
||||||
|
end
|
||||||
|
dir.down do
|
||||||
|
execute "ALTER TABLE `messages` ADD `body_old` text"
|
||||||
|
execute "UPDATE `messages` m
|
||||||
|
INNER JOIN `action_text_rich_texts` a
|
||||||
|
ON m.id = a.record_id
|
||||||
|
set m.body_old = a.body"
|
||||||
|
Message.all.each do |message|
|
||||||
|
message.update(body_old: strip_tags(message.body_old))
|
||||||
|
end
|
||||||
|
execute "DELETE FROM `action_text_rich_texts` WHERE `action_text_rich_texts`.`record_type` = 'Message'"
|
||||||
|
execute "ALTER TABLE `messages` CHANGE `body_old` `body` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL;"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -292,7 +292,6 @@ ActiveRecord::Schema[7.0].define(version: 2023_02_15_085312) do
|
||||||
create_table "messages", id: :integer, charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t|
|
create_table "messages", id: :integer, charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t|
|
||||||
t.integer "sender_id"
|
t.integer "sender_id"
|
||||||
t.string "subject", null: false
|
t.string "subject", null: false
|
||||||
t.text "body"
|
|
||||||
t.boolean "private", default: false
|
t.boolean "private", default: false
|
||||||
t.datetime "created_at", precision: nil
|
t.datetime "created_at", precision: nil
|
||||||
t.integer "reply_to"
|
t.integer "reply_to"
|
||||||
|
|
|
@ -21,7 +21,8 @@ class MessagesController < ApplicationController
|
||||||
@message.subject = I18n.t('messages.model.reply_subject', subject: original_message.subject)
|
@message.subject = I18n.t('messages.model.reply_subject', subject: original_message.subject)
|
||||||
@message.body = I18n.t('messages.model.reply_header', user: original_message.sender.display,
|
@message.body = I18n.t('messages.model.reply_header', user: original_message.sender.display,
|
||||||
when: I18n.l(original_message.created_at, format: :short)) + "\n"
|
when: I18n.l(original_message.created_at, format: :short)) + "\n"
|
||||||
original_message.body.each_line { |l| @message.body += I18n.t('messages.model.reply_indent', line: l) }
|
@message.body = I18n.t('messages.model.reply_header', user: original_message.sender.display, when: I18n.l(original_message.created_at, format: :short)) + "\n" \
|
||||||
|
+ "<blockquote>" + original_message.body.to_trix_html + "</blockquote>"
|
||||||
else
|
else
|
||||||
redirect_to new_message_url, alert: I18n.t('messages.new.error_private')
|
redirect_to new_message_url, alert: I18n.t('messages.new.error_private')
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,7 @@ module MessagesHelper
|
||||||
body = ''
|
body = ''
|
||||||
else
|
else
|
||||||
subject = message.subject
|
subject = message.subject
|
||||||
body = truncate(message.body, length: length - subject.length)
|
body = truncate(message.body.to_plain_text, length: length - subject.length)
|
||||||
end
|
end
|
||||||
"<b>#{link_to(h(subject), message)}</b> <span style='color:grey'>#{h(body)}</span>".html_safe
|
"<b>#{link_to(h(subject), message)}</b> <span style='color:grey'>#{h(body)}</span>".html_safe
|
||||||
end
|
end
|
||||||
|
|
|
@ -22,6 +22,8 @@ class Message < ApplicationRecord
|
||||||
validates_presence_of :message_recipients, :subject, :body
|
validates_presence_of :message_recipients, :subject, :body
|
||||||
validates_length_of :subject, in: 1..255
|
validates_length_of :subject, in: 1..255
|
||||||
|
|
||||||
|
has_rich_text :body
|
||||||
|
|
||||||
after_initialize do
|
after_initialize do
|
||||||
@recipients_ids ||= []
|
@recipients_ids ||= []
|
||||||
@send_method ||= 'recipients'
|
@send_method ||= 'recipients'
|
||||||
|
|
|
@ -110,7 +110,7 @@
|
||||||
= f.input :recipient_tokens, :input_html => { 'data-pre' => User.where(id: @message.recipients_ids).map(&:token_attributes).to_json }
|
= f.input :recipient_tokens, :input_html => { 'data-pre' => User.where(id: @message.recipients_ids).map(&:token_attributes).to_json }
|
||||||
= f.input :private, inline_label: t('.hint_private')
|
= f.input :private, inline_label: t('.hint_private')
|
||||||
= f.input :subject, input_html: {class: 'input-xxlarge'}
|
= f.input :subject, input_html: {class: 'input-xxlarge'}
|
||||||
= f.input :body, input_html: {class: 'input-xxlarge', rows: 13}
|
= f.rich_text_area :body, input_html: {class: 'input-xxlarge', rows: 13}
|
||||||
.form-actions
|
.form-actions
|
||||||
= f.submit class: 'btn btn-primary'
|
= f.submit class: 'btn btn-primary'
|
||||||
= link_to t('ui.or_cancel'), :back
|
= link_to t('ui.or_cancel'), :back
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
- if @message.can_toggle_private?(current_user)
|
- if @message.can_toggle_private?(current_user)
|
||||||
= link_to t('.change_visibility'), toggle_private_message_path(@message), method: :post, class: 'btn btn-mini'
|
= link_to t('.change_visibility'), toggle_private_message_path(@message), method: :post, class: 'btn btn-mini'
|
||||||
%hr/
|
%hr/
|
||||||
%p= simple_format(h(@message.body))
|
.trix-content= @message.body
|
||||||
%hr/
|
%hr/
|
||||||
%p
|
%p
|
||||||
= link_to t('.reply'), new_message_path(:message => {:reply_to => @message.id}), class: 'btn'
|
= link_to t('.reply'), new_message_path(:message => {:reply_to => @message.id}), class: 'btn'
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
= raw @message.body
|
||||||
|
%hr
|
||||||
|
%ul
|
||||||
|
- if @message.group
|
||||||
|
%li= t '.footer_group', group: @message.group.name
|
||||||
|
%li
|
||||||
|
%a{href: new_message_url('message[reply_to]' => @message.id)}= t '.reply'
|
||||||
|
%li
|
||||||
|
%a{href: message_url(@message)}= t '.see_message_online'
|
||||||
|
%li
|
||||||
|
%a{href: my_profile_url}= t '.messaging_options'
|
|
@ -138,6 +138,9 @@ de:
|
||||||
Antworten: %{reply_url}
|
Antworten: %{reply_url}
|
||||||
Nachricht online einsehen: %{msg_url}
|
Nachricht online einsehen: %{msg_url}
|
||||||
Nachrichten-Einstellungen: %{profile_url}
|
Nachrichten-Einstellungen: %{profile_url}
|
||||||
|
reply: Antworten
|
||||||
|
see_message_online: Nachricht online einsehen
|
||||||
|
messaging_options: Nachrichten-Einstellungen
|
||||||
footer_group: |
|
footer_group: |
|
||||||
Gesendet an Gruppe: %{group}
|
Gesendet an Gruppe: %{group}
|
||||||
navigation:
|
navigation:
|
||||||
|
|
|
@ -140,6 +140,9 @@ en:
|
||||||
Reply: %{reply_url}
|
Reply: %{reply_url}
|
||||||
See message online: %{msg_url}
|
See message online: %{msg_url}
|
||||||
Messaging options: %{profile_url}
|
Messaging options: %{profile_url}
|
||||||
|
reply: Reply
|
||||||
|
see_message_online: See message online
|
||||||
|
messaging_options: Messaging options
|
||||||
footer_group: |
|
footer_group: |
|
||||||
Sent to group: %{group}
|
Sent to group: %{group}
|
||||||
navigation:
|
navigation:
|
||||||
|
|
|
@ -67,6 +67,9 @@ fr:
|
||||||
Répondre: %{reply_url}
|
Répondre: %{reply_url}
|
||||||
Afficher ce message dans ton navigateur: %{msg_url}
|
Afficher ce message dans ton navigateur: %{msg_url}
|
||||||
Préférences des messages: %{profile_url}
|
Préférences des messages: %{profile_url}
|
||||||
|
reply: Répondre
|
||||||
|
see_message_online: Afficher ce message dans ton navigateur
|
||||||
|
messaging_options: Préférences des messages
|
||||||
simple_form:
|
simple_form:
|
||||||
labels:
|
labels:
|
||||||
settings:
|
settings:
|
||||||
|
|
|
@ -140,6 +140,9 @@ nl:
|
||||||
Antwoorden: %{reply_url}
|
Antwoorden: %{reply_url}
|
||||||
Bericht online lezen: %{msg_url}
|
Bericht online lezen: %{msg_url}
|
||||||
Berichtinstellingen: %{profile_url}
|
Berichtinstellingen: %{profile_url}
|
||||||
|
reply: Antwoorden
|
||||||
|
see_message_online: Bericht online lezen
|
||||||
|
messaging_options: Berichtinstellingen
|
||||||
footer_group: |
|
footer_group: |
|
||||||
Verzenden aan groep: %{group}
|
Verzenden aan groep: %{group}
|
||||||
navigation:
|
navigation:
|
||||||
|
|
Loading…
Reference in a new issue