From f6057ee3be35bb8b957366a82ea81ed96d98c81e Mon Sep 17 00:00:00 2001
From: pabois <pierreandre.boissinot@noesya.coop>
Date: Fri, 10 Dec 2021 17:53:59 +0100
Subject: [PATCH] wip menu

---
 .../admin/communication/menu_items.js         | 47 ++++---------------
 .../website/menu/items_controller.rb          |  6 +++
 .../website/menu/items/_form.html.erb         | 13 +++--
 .../website/menu/items/kind_switch.js.erb     | 31 ++++++++++++
 config/routes/admin/communication.rb          |  1 +
 5 files changed, 55 insertions(+), 43 deletions(-)
 create mode 100644 app/views/admin/communication/website/menu/items/kind_switch.js.erb

diff --git a/app/assets/javascripts/admin/communication/menu_items.js b/app/assets/javascripts/admin/communication/menu_items.js
index 8f0923343..25a915265 100644
--- a/app/assets/javascripts/admin/communication/menu_items.js
+++ b/app/assets/javascripts/admin/communication/menu_items.js
@@ -1,16 +1,13 @@
+/* global $ */
 window.osuny.communication.menuItems = {
     init: function () {
         'use strict';
-        this.kindInput = document.querySelector('form #communication_website_menu_item_kind');
+        this.kindInput = document.querySelector('form .js-kind-input');
         if (this.kindInput === null) {
             return;
         }
 
-        this.elementsForKindUrl = document.querySelectorAll('.kind-url');
-        this.requiredInputsForKindUrl = document.querySelectorAll('.kind-url .required select, .kind-url .required input');
-
-        this.elementsForKindPage = document.querySelectorAll('.kind-page');
-        this.requiredInputsForKindPage = document.querySelectorAll('.kind-page .required select, .kind-page .required input');
+        this.switchUrl = this.kindInput.dataset.url;
 
         this.kindInput.addEventListener('change', this.onKindChange.bind(this));
         this.onKindChange();
@@ -20,38 +17,12 @@ window.osuny.communication.menuItems = {
         'use strict';
         var kind = this.kindInput.value;
 
-        if (kind === 'url') {
-            this.showElements(this.elementsForKindUrl, this.requiredInputsForKindUrl);
-            this.hideElements(this.elementsForKindPage, this.requiredInputsForKindPage);
-        } else if (kind === 'page') {
-            this.showElements(this.elementsForKindPage, this.requiredInputsForKindPage);
-            this.hideElements(this.elementsForKindUrl, this.requiredInputsForKindUrl);
-        } else if (kind === 'blank') {
-            this.hideElements(this.elementsForKindPage, this.requiredInputsForKindPage);
-            this.hideElements(this.elementsForKindUrl, this.requiredInputsForKindUrl);
-        }
-    },
-
-    showElements: function (elements, requiredInputs) {
-        'use strict';
-        var i;
-        for (i = 0; i < elements.length; i += 1) {
-            elements[i].classList.remove('d-none');
-        }
-        for (i = 0; i < requiredInputs.length; i += 1) {
-            requiredInputs[i].setAttribute('required', 'required');
-        }
-    },
-
-    hideElements: function (elements, requiredInputs) {
-        'use strict';
-        var i;
-        for (i = 0; i < elements.length; i += 1) {
-            elements[i].classList.add('d-none');
-        }
-        for (i = 0; i < requiredInputs.length; i += 1) {
-            requiredInputs[i].removeAttribute('required');
-        }
+        $.ajax(this.switchUrl, {
+            method: 'GET',
+            data: 'kind=' + kind,
+            processData: false,
+            contentType: false
+        });
     },
 
     invoke: function () {
diff --git a/app/controllers/admin/communication/website/menu/items_controller.rb b/app/controllers/admin/communication/website/menu/items_controller.rb
index 6f1ca6859..b996c1f3b 100644
--- a/app/controllers/admin/communication/website/menu/items_controller.rb
+++ b/app/controllers/admin/communication/website/menu/items_controller.rb
@@ -25,6 +25,12 @@ class Admin::Communication::Website::Menu::ItemsController < Admin::Communicatio
     @children = @item.children.ordered
   end
 
+  def kind_switch
+    return unless request.xhr?
+    @kind = params[:kind]
+    return if @kind.blank?
+  end
+
   def new
     @item.menu = @menu
     @item.website = @website
diff --git a/app/views/admin/communication/website/menu/items/_form.html.erb b/app/views/admin/communication/website/menu/items/_form.html.erb
index 07bc0ba37..c5ae967ca 100644
--- a/app/views/admin/communication/website/menu/items/_form.html.erb
+++ b/app/views/admin/communication/website/menu/items/_form.html.erb
@@ -11,13 +11,16 @@
           <%= f.input :kind,
                       include_blank: false,
                       label_method: -> (p) { I18n.t(p[1], scope: 'enums.communication/website/menu/item.kind') },
-                      class: 'js-kind-input' %>
-          <div class="kind-url">
+                      input_html: {
+                        class: 'js-kind-input',
+                        data: { url: kind_switch_admin_communication_website_menu_items_path }
+                       } %>
+          <div class="d-none js-url-field">
             <%= f.input :url, as: :string %>
           </div>
-          <div class="kind-page">
-            <%= f.input :about_type, as: :hidden, input_html: { value: 'Communication::Website::Page' } %>
-            <%= f.association :about, collection: @website.list_of_pages, label_method: ->(p) { sanitize p[:label] }, value_method: ->(p) { p[:id] } %>
+          <div class="d-none js-about-fields">
+            <%= f.input :about_type, as: :hidden, input_html: { class: 'js-about-id' } %>
+            <%= f.association :about, collection: @website.list_of_pages, label_method: ->(p) { sanitize p[:label] }, value_method: ->(p) { p[:id] }, input_html: { class: 'js-about-id' } %>
           </div>
         </div>
       </div>
diff --git a/app/views/admin/communication/website/menu/items/kind_switch.js.erb b/app/views/admin/communication/website/menu/items/kind_switch.js.erb
new file mode 100644
index 000000000..cbdb12e62
--- /dev/null
+++ b/app/views/admin/communication/website/menu/items/kind_switch.js.erb
@@ -0,0 +1,31 @@
+function displayAbout(options) {
+    $('.js-url-field').addClass('d-none');
+    $('.js-about-fields').removeClass('d-none');
+    $('.js-about-id').html(options);
+}
+
+function hideAbout() {
+    $('.js-about-fields').addClass('d-none');
+}
+
+<% if @kind == 'url' %>
+    $('.js-url-field').removeClass('d-none');
+    hideAbout();
+<% elsif @kind == 'page' %>
+    <%
+        options = ['<option value="" label=" "></option>']
+        @website.list_of_pages.each do |page|
+            options << "<option value=\"#{page[:id]}\">#{page[:label]}</option>"
+        end
+    %>
+    displayAbout("<%= j(raw(options.join(''))) %>");
+<% elsif @kind == 'program' %>
+    displayAbout();
+<% elsif @kind == 'news_category' %>
+    displayAbout();
+<% elsif @kind == 'news_article' %>
+    displayAbout();
+<% else %>
+    $('.js-url-field').addClass('d-none');
+    hideAbout();
+<% end %>
diff --git a/config/routes/admin/communication.rb b/config/routes/admin/communication.rb
index a42948203..0b94e89b9 100644
--- a/config/routes/admin/communication.rb
+++ b/config/routes/admin/communication.rb
@@ -39,6 +39,7 @@ namespace :communication do
     resources :menus, controller: 'website/menus' do
       resources :items, controller: 'website/menu/items', except: :index do
         collection do
+          get :kind_switch
           post :reorder
         end
         member do
-- 
GitLab