- <%
- sender_element_id = "sender"
- template_element_id = "message_template"
- recipient_name_element_id = "recipient_name"
- recipient_id_element_id = "recipient_uri"
- %>
-
- <% if @boxes.count > 1 %>
-
- <%= select_tag(sender_element_id, options_for_select(@boxes, [Current.box&.name, Current.box&.id]), required: true, prompt: "Zvoľte odosielateľa", class: "mb-4 bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5") %>
- <% else %>
- <%= hidden_field sender_element_id, @boxes.first %>
- <% end %>
+
+
+
+
+ <%
+ form_id = "create_draft"
+ sender_element_id = "sender_id"
+ template_element_id = "message_template_id"
+ %>
- <%= content_tag(:div, { "data-controller": "message-drafts", class: "w-full" }) do %>
-
- <%= select_tag(template_element_id, options_for_select(@templates_list), required: true, prompt: "Zvoľte typ správy", "data-action": "change->message-drafts#loadTemplateRecipients", class: "mb-4 bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5") %>
- <% end %>
+ <%= form_with url: message_drafts_path, id: form_id, class: 'w-full' do |f| %>
+
+
+ <% if @boxes.count > 1 %>
+
+ <%= select_tag(sender_element_id, options_for_select(@boxes, ([Current.box&.name, Current.box&.id] if Current.box) || [@selected_box&.name, @selected_box&.id]), prompt: "Zvoľte odosielateľa", class: "text-sm rounded-lg block w-full p-2.5 #{@message.errors[:sender_name].any? && !@selected_box ? ERROR_CLASSES : DEFAULT_CLASSES}") %>
+ <% if @message.errors[:sender_name].any? && !@selected_box %>
+
+ <%= @message.errors.full_messages_for(:sender_name).to_sentence %>
+
+ <% end %>
+ <% else %>
+ <%= hidden_field_tag sender_element_id, @boxes.first %>
+ <% end %>
+
-
+ <%= content_tag(:div, { "data-controller": "message-drafts", class: "mb-4 w-full" }) do %>
+
+ <%= select_tag(template_element_id, options_for_select(@templates_list, [@selected_message_template&.name, @selected_message_template&.id]), prompt: "Zvoľte typ správy", "data-action": "change->message-drafts#loadTemplateRecipients", class: "text-sm rounded-lg block w-full p-2.5 #{@message.errors[:metadata].any? ? ERROR_CLASSES : DEFAULT_CLASSES}") %>
+ <% if @message.errors[:metadata].any? %>
+
+ <%= @message.errors[:metadata].to_sentence %>
+
+ <% end %>
+ <% end %>
- <%= content_tag(:div, {
- "data-controller": "message-drafts",
- "data-message-drafts-submit-path": message_drafts_path,
- "data-message-drafts-sender-element-id": sender_element_id,
- "data-message-drafts-template-element-id": template_element_id,
- "data-message-drafts-recipient-name-element-id": recipient_name_element_id,
- "data-message-drafts-recipient-uri-element-id": recipient_id_element_id,
- "data-message-drafts-authenticity-token": form_authenticity_token,
- class: "gap-2 border-t-0 border-r-0 border-b-0 border-l-0 border-gray-200 w-full"
- }) do %>
-
+
+ <%= hidden_field_tag 'recipient_name', params[:recipient_name] %>
+ <%= hidden_field_tag 'recipient_uri', params[:recipient_uri] %>
+
+
<% end %>
+
+
+
+ <% if @recipients_list && @recipients_list.count > 1 %>
+
+
+
+ <%= button_to message_template_recipient_selector_path(@selected_message_template), method: 'get', data: { turbo_frame: "modal" }, class: "text-gray-500 hover:text-gray-900 w-full" do %>
+
+
<%= params[:recipient_name].presence || 'Zvoľte príjemateľa' %>
+
+ <% if @message.errors[:recipient_name].any? %>
+
+ <%= @message.errors.full_messages_for(:recipient_name).to_sentence %>
+
+ <% end %>
+ <% end %>
+ <% end %>
+
+
+ <%= content_tag(:div, {
+ "data-controller": "message-drafts",
+ "data-message-drafts-form-id": form_id,
+ class: "gap-2 border-t-0 border-r-0 border-b-0 border-l-0 border-gray-200 w-full"
+ }) do %>
+
+ <% end %>
+
diff --git a/app/components/new_message_component.rb b/app/components/new_message_component.rb
index 3e28b29ff..a2ba18327 100644
--- a/app/components/new_message_component.rb
+++ b/app/components/new_message_component.rb
@@ -1,6 +1,13 @@
class NewMessageComponent < ViewComponent::Base
- def initialize(templates_list:, boxes:)
+ DEFAULT_CLASSES = 'bg-gray-50 border border-gray-300 text-gray-900 focus:ring-blue-500 focus:border-blue-500'
+ ERROR_CLASSES = 'bg-red-50 border border-red-500 text-red-900 placeholder-red-700 focus:ring-red-500 focus:border-red-500'
+
+ def initialize(message:, templates_list:, boxes:, recipients_list: nil, selected_box: nil, selected_message_template: nil)
+ @message = message
@templates_list = templates_list
@boxes = boxes
+ @recipients_list = recipients_list
+ @selected_box = selected_box
+ @selected_message_template = selected_message_template
end
end
diff --git a/app/controllers/message_drafts_controller.rb b/app/controllers/message_drafts_controller.rb
index f99b102a6..ea3b1401b 100644
--- a/app/controllers/message_drafts_controller.rb
+++ b/app/controllers/message_drafts_controller.rb
@@ -33,6 +33,15 @@ def create
recipient_uri: new_message_draft_params[:recipient_uri]
)
+ unless @message.valid?(:create)
+ @templates_list = MessageTemplate.tenant_templates_list(Current.tenant)
+ @boxes = Current.tenant.boxes.pluck(:name, :id)
+
+ @recipients_list = @message_template&.recipients&.pluck(:institution_name, :institution_uri)&.map { |name, uri| { uri: uri, name: name }}
+
+ render :update_new and return
+ end
+
redirect_to message_thread_path(@message.thread)
end
diff --git a/app/javascript/controllers/message_drafts_controller.js b/app/javascript/controllers/message_drafts_controller.js
index bb3732941..780544b12 100644
--- a/app/javascript/controllers/message_drafts_controller.js
+++ b/app/javascript/controllers/message_drafts_controller.js
@@ -10,36 +10,14 @@ export default class extends Controller {
}
async loadTemplateRecipients() {
- const messageTemplateId = document.getElementById("message_template").value;
+ const messageTemplateId = document.getElementById("message_template_id").value;
const templateRecipientsPath = `/message_templates/${messageTemplateId}/recipients_list`;
await get(templateRecipientsPath, { responseKind: "turbo-stream" })
}
async create() {
- const submitPath = this.data.get("submitPath");
- const authenticityToken = this.data.get("authenticityToken");
-
- const senderElementId = this.data.get("senderElementId");
- const templateElementId = this.data.get("templateElementId");
- const recipientNameElementId = this.data.get("recipientNameElementId");
- const recipientUriElementId = this.data.get("recipientUriElementId");
-
- await fetch(submitPath, {
- method: "POST",
- headers: {"Content-Type": "application/json"},
- redirect: 'follow',
- body: JSON.stringify({
- authenticity_token: authenticityToken,
- sender_id: document.getElementById(senderElementId).value,
- message_template_id: document.getElementById(templateElementId).value,
- recipient_name: document.getElementById(recipientNameElementId).value,
- recipient_uri: document.getElementById(recipientUriElementId).value
- })
- }).then(response => {
- if (response.redirected) {
- window.location.href = response.url;
- }
- })
+ const formId = this.data.get("formId");
+ document.getElementById(formId).requestSubmit();
}
async update() {
diff --git a/app/models/message_draft.rb b/app/models/message_draft.rb
index 42f0f5637..d93e1e2fc 100644
--- a/app/models/message_draft.rb
+++ b/app/models/message_draft.rb
@@ -39,6 +39,12 @@ class MessageDraft < Message
end
end
+ with_options on: :create do |message_draft|
+ message_draft.validates :sender_name, presence: true
+ message_draft.validates :recipient_name, presence: true
+ message_draft.validate :validate_metadata_with_template
+ end
+
with_options on: :validate_data do |message_draft|
message_draft.validates :uuid, format: { with: Utils::UUID_PATTERN }, allow_blank: false
message_draft.validate :validate_metadata
@@ -161,6 +167,10 @@ def validate_metadata
errors.add(:metadata, "Correlation ID must be UUID") unless all_message_metadata["correlation_id"]&.match?(Utils::UUID_PATTERN)
end
+ def validate_metadata_with_template
+ errors.add(:metadata, :no_template) unless metadata&.dig("template_id").present?
+ end
+
def validate_form
forms = objects.select { |o| o.form? }
diff --git a/app/models/upvs/message_template.rb b/app/models/upvs/message_template.rb
index 22364aae0..08792257b 100644
--- a/app/models/upvs/message_template.rb
+++ b/app/models/upvs/message_template.rb
@@ -47,17 +47,20 @@ def create_message(message, author:, box:, recipient_name:, recipient_uri:)
status: 'created'
}
- message.thread = box.message_threads.find_or_create_by_merge_uuid!(
+ message.thread = box&.message_threads&.find_or_create_by_merge_uuid!(
box: box,
merge_uuid: message.metadata['correlation_id'],
title: self.name,
delivered_at: message.delivered_at
)
- message.save!
- message.add_cascading_tag(author.draft_tag)
+ message.save
- create_form_object(message)
+ if message.valid?(:create)
+ message.add_cascading_tag(author.draft_tag)
+
+ create_form_object(message)
+ end
end
def create_message_reply(message, original_message:, author:)
diff --git a/app/views/message_drafts/new.html.erb b/app/views/message_drafts/new.html.erb
index f418c5724..3072d4a65 100644
--- a/app/views/message_drafts/new.html.erb
+++ b/app/views/message_drafts/new.html.erb
@@ -1 +1,5 @@
-<%= render NewMessageComponent.new(templates_list: @templates_list, boxes: @boxes) %>
+<%= render NewMessageComponent.new(
+ message: @message,
+ templates_list: @templates_list,
+ boxes: @boxes)
+%>
diff --git a/app/views/message_drafts/update_new.turbo_stream.erb b/app/views/message_drafts/update_new.turbo_stream.erb
new file mode 100644
index 000000000..bc257f0d3
--- /dev/null
+++ b/app/views/message_drafts/update_new.turbo_stream.erb
@@ -0,0 +1,10 @@
+<%= turbo_stream.replace "new_message" do %>
+ <%= render NewMessageComponent.new(
+ message: @message,
+ templates_list: @templates_list,
+ boxes: @boxes,
+ recipients_list: @recipients_list,
+ selected_box: @box,
+ selected_message_template: @message_template
+ )%>
+<% end %>
diff --git a/app/views/message_templates/recipient_selected.turbo_stream.erb b/app/views/message_templates/recipient_selected.turbo_stream.erb
index 96e2cde3a..49a762c38 100644
--- a/app/views/message_templates/recipient_selected.turbo_stream.erb
+++ b/app/views/message_templates/recipient_selected.turbo_stream.erb
@@ -1,13 +1,15 @@
+<%= turbo_stream.update "selected_recipient" do %>
+ <%= hidden_field_tag 'recipient_name', @recipient_name %>
+ <%= hidden_field_tag 'recipient_uri', @recipient_uri %>
+<% end %>
+
<%= turbo_stream.update "recipients_list" do %>
-
+
-
-
-
<%= button_to message_template_recipient_selector_path, method: :get, data: { turbo_frame: "modal" }, class: "text-gray-500 hover:text-gray-900 w-full" do %>
-
+
<% end %>
diff --git a/app/views/message_templates/recipient_selector.html.erb b/app/views/message_templates/recipient_selector.html.erb
index be1cc34fa..c51fb61a7 100644
--- a/app/views/message_templates/recipient_selector.html.erb
+++ b/app/views/message_templates/recipient_selector.html.erb
@@ -1,3 +1,3 @@
-<%= tag.turbo_frame id: 'modal' do %>
+<%= tag.turbo_frame id: "modal" do %>
<%= render MessageTemplateRecipientsComponent.new(recipients_list: @recipients_list) %>
<% end %>
diff --git a/app/views/message_templates/recipients_list.turbo_stream.erb b/app/views/message_templates/recipients_list.turbo_stream.erb
index af782af88..23abd84b1 100644
--- a/app/views/message_templates/recipients_list.turbo_stream.erb
+++ b/app/views/message_templates/recipients_list.turbo_stream.erb
@@ -1,15 +1,18 @@
-<%= turbo_stream.update "recipients_list" do %>
- <% if @recipients_list.count > 1 %>
+<% if @recipients_list.count > 1 %>
+ <%= turbo_stream.update "recipients_list" do %>
-
+
+
<%= button_to message_template_recipient_selector_path, method: :get, data: { turbo_frame: "modal" }, class: "text-gray-500 hover:text-gray-900 w-full" do %>
-
Zvoľte príjemcu
+
Zvoľte príjímateľa
<% end %>
- <% else %>
-
-
+ <% end %>
+<% else %>
+ <%= turbo_stream.update "selected_recipient" do %>
+ <%= hidden_field_tag 'recipient_name', @recipients_list.first[:name] %>
+ <%= hidden_field_tag 'recipient_uri', @recipients_list.first[:uri] %>
<% end %>
<% end %>
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index aa1cd527a..3b9e7982e 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -1,6 +1,9 @@
sk:
activerecord:
attributes:
+ message:
+ sender_name: 'Odosielateľ'
+ recipient_name: 'Prijímateľ'
message_thread:
title: "Názov"
errors:
@@ -13,6 +16,10 @@ sk:
base:
restrict_dependent_destroy:
has_many: "Štítok je použitý v automatizačných pravidlách, nie je ho možné vymazať. Upravte najskôr pravidlá"
+ message_draft:
+ attributes:
+ metadata:
+ no_template: "Typ správy je povinná položka"
date:
abbr_day_names:
- Ne