diff --git a/app/assets/javascripts/admin/communication/menu_items.js b/app/assets/javascripts/admin/communication/menu_items.js index 8f09233430f66c39004a486190ba6dab578452b0..25a915265c6d4d82fe2789ca19d3d06a781b1c15 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 6f1ca68595e3a759b037f742824d81b64eb6913f..b996c1f3bced137ce73341731db2647513ac8c8b 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 07bc0ba37bf007e1ac9b8a04c349847dff78506c..c5ae967ca872d33ea276eb1046c66b9cb680681d 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 0000000000000000000000000000000000000000..cbdb12e62bd2c407a28575026cc4cb5e1c2f547c --- /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 a42948203171e607d2fc3bfbe28a97e9f8ec724d..0b94e89b9197da0d94009abb9ed40dda2e4aa77c 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