diff --git a/app/components/new_message_component.html.erb b/app/components/new_message_component.html.erb index 1fd9017e6..f10eb988e 100644 --- a/app/components/new_message_component.html.erb +++ b/app/components/new_message_component.html.erb @@ -1,43 +1,77 @@ -
-
-
-
Nová správa
-
- <% - 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 %> +
+
+
+
+
Nová správa
+
+ <% + 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 %> -
+

<%= @recipient_name %>

<% 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