13 changed files with 70 additions and 230 deletions
@ -1,10 +1,35 @@
|
||||
class SubjectAccordionComponent < BaseComponent |
||||
attr_reader :parent, :subjects, :opts |
||||
with_collection_parameter :search_result |
||||
attr_reader :search_result, :opts |
||||
|
||||
def initialize(search_result:, current_user:, opts: {}) |
||||
@search_result = search_result |
||||
@opts = opts |
||||
end |
||||
|
||||
def initialize(current_user:, parent:, subjects: nil, opts: {}) |
||||
@parent = parent |
||||
@subjects = subjects |
||||
@opts = opts |
||||
end |
||||
def parent_accordion_id |
||||
return "subjectsAccordion" if search_result["parent_id"].blank? |
||||
|
||||
["subjectsAccordion", search_result["parent_id"]].join |
||||
end |
||||
|
||||
def children_accordion_id |
||||
["subjectsAccordion", search_result["id"]].join |
||||
end |
||||
|
||||
def accordion_id |
||||
["subjectsAccordion", search_result["id"]].join |
||||
end |
||||
|
||||
def accordion_body_id |
||||
["subjectsAccordionBody", search_result["id"]].join |
||||
end |
||||
|
||||
def custom_url |
||||
return search_doctrines_path(subject_ids: [search_result["id"]], is_index_table: false) if opts[:accordionFor].present? && opts[:accordionFor].to_s.eql?("subjects") |
||||
return search_doctrines_path(subject_ids: [search_result["id"]], is_index_table: true) if opts[:accordionFor].present? && opts[:accordionFor].to_s.eql?("doctrines") |
||||
|
||||
return subject_index_path(search_result["id"]).blank? |
||||
end |
||||
end |
||||
|
||||
@ -1,168 +1,21 @@
|
||||
<% if opts[:is_offcanvas].present? %> |
||||
<% Cdao::Subject.roots.order(name: :asc).each do |root| %> |
||||
<div class="accordion accordion-flash" id="mainPanel<%= root.id %>"> |
||||
<div class="accordion-item"> |
||||
<div class="accordion-header d-flex justify-content-between"> |
||||
<% if root.children.present? %> |
||||
<div class="accordion-button collapsed m-0 p-0" data-bs-toggle="collapse" data-bs-target="#<%= ["rootLevel", root.id].join %>"> |
||||
<%= link_to root.name, subject_index_path(root.id), class: "accordion-link text-decoration-none text-dark d-block sub1 clickable-link" %> |
||||
</div> |
||||
<% else %> |
||||
<%= link_to root.name, subject_index_path(root.id), class: "accordion-link text-decoration-none text-dark d-block sub1 clickable-link" %> |
||||
<% end %> |
||||
<div class="accordion accordion-flash" id="<%= parent_accordion_id %>"> |
||||
<div class="accordion-item"> |
||||
<div class="accordion-header d-flex justify-content-between"> |
||||
<% if search_result["parent_id"].present? %> |
||||
<div class="accordion-button collapsed m-0 p-0" data-bs-toggle="collapse" data-bs-target="#<%= children_accordion_id %>" |
||||
data-accordion-id="<%= children_accordion_id %>" data-accordion-for="<%= opts[:accordionFor] %>" |
||||
data-parent-id="<%= search_result["parent_id"] %>" data-accordion-target="#<%= accordion_body_id %>" |
||||
data-action="click->subjects#loadSubjectsAccordion"> |
||||
<%= link_to search_result["name"], custom_url, class: "accordion-link text-decoration-none text-dark d-block sub1 clickable-link" %> |
||||
</div> |
||||
|
||||
<div class="accordion-collapse collapse" id="<%= ["rootLevel", root.id].join %>" data-bs-parent="#mainPanel<%= root.id %>"> |
||||
<div class="accordion-body pt-1 pb-1"> |
||||
<% root.children.order(name: :asc).each do |sub1| %> |
||||
<div class="accordion accordion-flush ps-20" id="#secondLevelPanel<%= sub1.id %>"> |
||||
<div class="accordion-item"> |
||||
<div class="accordion-header d-flex justify-content-between"> |
||||
<% if sub1.children.present? %> |
||||
<div class="accordion-button collapsed" data-bs-toggle="collapse" data-bs-target="#<%= ["secondLevel", sub1.id].join %>"> |
||||
<%= link_to sub1.name, subject_index_path(sub1.id), class: "accordion-link text-decoration-none text-dark d-block sub2 clickable-link" %> |
||||
</div> |
||||
<% else %> |
||||
<%= link_to sub1.name, subject_index_path(sub1.id), class: "accordion-link text-decoration-none text-dark d-block sub2 clickable-link" %> |
||||
<% end %> |
||||
</div> |
||||
|
||||
<div class="accordion-collapse collapse" id="<%= ["secondLevel", sub1.id].join %>" data-bs-parent="#secondLevelPanel<%= sub1.id %>"> |
||||
<div class="accordion-body pt-1"> |
||||
<% sub1.children.order(name: :asc).each do |sub2| %> |
||||
<div class="accordion accordion-flush ps-20" id="thirdLevelPanel<%= sub2.id %>"> |
||||
<div class="accordion-item"> |
||||
<div class="accordion-header d-flex justify-content-between"> |
||||
<% if sub1.children.present? %> |
||||
<div class="accordion-button collapsed" data-bs-toggle="collapse" data-bs-target="#<%= ["thirdLevel", sub2.id].join %>"> |
||||
<%= link_to sub2.name, subject_index_path(sub2.id), class: "accordion-link text-decoration-none text-dark d-block sub3 clickable-link" %> |
||||
</div> |
||||
<% else %> |
||||
<%= link_to sub2.name, subject_index_path(sub2.id), class: "accordion-link text-decoration-none text-dark d-block sub3 clickable-link" %> |
||||
<% end %> |
||||
</div> |
||||
|
||||
<div class="accordion-collapse collapse" id="<%= ["thirdLevel", sub2.id].join %>" data-bs-parent="#thirdLevelPanel<%= sub2.id %>"> |
||||
<div class="accordion-body pt-1"> |
||||
<% sub2.children.order(name: :asc).each do |sub3| %> |
||||
<div class="accordion accordion-flush ps-20" id="fourthLevelPanel<%= sub3.id %>"> |
||||
<div class="accordion-item"> |
||||
<div class="accordion-header d-flex justify-content-between"> |
||||
<% if sub3.children.present? %> |
||||
<div class="<%= sub3.children.present? ? 'accordion-button' : '' %> collapsed" data-bs-toggle="collapse" data-bs-target="#<%= ["fourthLevel", sub3.id].join %>"> |
||||
<%= link_to sub3.name, subject_index_path(sub3.id), class: "accordion-link text-decoration-none text-dark d-block sub4 clickable-link" %> |
||||
</div> |
||||
<% else %> |
||||
<%= link_to sub3.name, subject_index_path(sub3.id), class: "accordion-link text-decoration-none text-dark d-block sub4 clickable-link" %> |
||||
<% end %> |
||||
</div> |
||||
|
||||
<div class="accordion-collapse collapse" id="<%= ["fourthLevel", sub3.id].join %>" data-bs-parent="#fourthLevelPanel<%= sub3.id %>"> |
||||
<div class="accordion-body pt-1"> |
||||
<% sub3.children.order(name: :asc).each do |sub4| %> |
||||
<div class="accordion accordion-flush ps-20"> |
||||
<div class="accordion-item d-flex justify-content-between"> |
||||
<div> |
||||
<%= link_to sub4.name, subject_index_path(sub4.id), class: "accordion-link text-decoration-none text-dark d-block sub5 clickable-link" %> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<% end %> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<% end %> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<% end %> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<% end %> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<% else %> |
||||
<%= link_to search_result["name"], custom_url, class: "accordion-link text-decoration-none text-dark d-block sub1 clickable-link" %> |
||||
<% end %> |
||||
</div> |
||||
<% end %> |
||||
<% else %> |
||||
<% parent.children.order(name: :asc).each do |sub1| %> |
||||
<div class="accordion accordion-flush ps-20" id="#secondLevelPanel<%= sub1.id %>"> |
||||
<div class="accordion-item"> |
||||
<div class="accordion-header d-flex justify-content-between"> |
||||
<% if sub1.children.present? %> |
||||
<div class="accordion-button collapsed" data-bs-toggle="collapse" data-bs-target="#<%= ["secondLevel", sub1.id].join %>"> |
||||
<%= link_to sub1.name, subject_index_path(sub1.id), class: "accordion-link text-decoration-none text-dark d-block sub2 clickable-link" %> |
||||
<%= link_to "Add Sub Level", new_subject_index_path(parent_id: sub1.id), class: "btn btn-sm btn-primary text-decoration-none d-block sub1 clickable-link position-absolute end-0 me-5" %> |
||||
</div> |
||||
<% else %> |
||||
<%= link_to sub1.name, subject_index_path(sub1.id), class: "accordion-link text-decoration-none text-dark d-block sub2 clickable-link" %> |
||||
<%= link_to "Add Sub Level", new_subject_index_path(parent_id: sub1.id), class: "btn btn-sm btn-primary text-decoration-none d-block sub1 clickable-link position-absolute end-0 accordion-action-button-margin" %> |
||||
<% end %> |
||||
</div> |
||||
|
||||
<div class="accordion-collapse collapse" id="<%= ["secondLevel", sub1.id].join %>" data-bs-parent="#secondLevelPanel<%= sub1.id %>"> |
||||
<div class="accordion-body pt-1"> |
||||
<% sub1.children.order(name: :asc).each do |sub2| %> |
||||
<div class="accordion accordion-flush ps-20" id="thirdLevelPanel<%= sub2.id %>"> |
||||
<div class="accordion-item"> |
||||
<div class="accordion-header d-flex justify-content-between"> |
||||
<% if sub1.children.present? %> |
||||
<div class="accordion-button collapsed" data-bs-toggle="collapse" data-bs-target="#<%= ["thirdLevel", sub2.id].join %>"> |
||||
<%= link_to sub2.name, subject_index_path(sub2.id), class: "accordion-link text-decoration-none text-dark d-block sub3 clickable-link" %> |
||||
<%= link_to "Add Sub Level", new_subject_index_path(parent_id: sub2.id), class: "btn btn-sm btn-primary text-decoration-none d-block sub1 clickable-link position-absolute end-0 me-5" %> |
||||
</div> |
||||
<% else %> |
||||
<%= link_to sub2.name, subject_index_path(sub2.id), class: "accordion-link text-decoration-none text-dark d-block sub3 clickable-link" %> |
||||
<%= link_to "Add Sub Level", new_subject_index_path(parent_id: sub2.id), class: "btn btn-sm btn-primary text-decoration-none d-block sub1 clickable-link position-absolute end-0 accordion-action-button-margin" %> |
||||
<% end %> |
||||
</div> |
||||
|
||||
<div class="accordion-collapse collapse" id="<%= ["thirdLevel", sub2.id].join %>" data-bs-parent="#thirdLevelPanel<%= sub2.id %>"> |
||||
<div class="accordion-body pt-1"> |
||||
<% sub2.children.order(name: :asc).each do |sub3| %> |
||||
<div class="accordion accordion-flush ps-20" id="fourthLevelPanel<%= sub3.id %>"> |
||||
<div class="accordion-item"> |
||||
<div class="accordion-header d-flex justify-content-between"> |
||||
<% if sub3.children.present? %> |
||||
<div class="<%= sub3.children.present? ? 'accordion-button' : '' %> collapsed" data-bs-toggle="collapse" data-bs-target="#<%= ["fourthLevel", sub3.id].join %>"> |
||||
<%= link_to sub3.name, subject_index_path(sub3.id), class: "accordion-link text-decoration-none text-dark d-block sub4 clickable-link" %> |
||||
<%= link_to "Add Sub Level", new_subject_index_path(parent_id: sub3.id), class: "btn btn-sm btn-primary text-decoration-none d-block sub1 clickable-link position-absolute end-0 me-5" %> |
||||
</div> |
||||
<% else %> |
||||
<%= link_to sub3.name, subject_index_path(sub3.id), class: "accordion-link text-decoration-none text-dark d-block sub4 clickable-link" %> |
||||
<%= link_to "Add Sub Level", new_subject_index_path(parent_id: sub3.id), class: "btn btn-sm btn-primary text-decoration-none d-block sub1 clickable-link position-absolute end-0 accordion-action-button-margin" %> |
||||
<% end %> |
||||
</div> |
||||
|
||||
<div class="accordion-collapse collapse" id="<%= ["fourthLevel", sub3.id].join %>" data-bs-parent="#fourthLevelPanel<%= sub3.id %>"> |
||||
<div class="accordion-body pt-1"> |
||||
<% sub3.children.order(name: :asc).each do |sub4| %> |
||||
<div class="accordion accordion-flush ps-20"> |
||||
<div class="accordion-item d-flex justify-content-between"> |
||||
<div> |
||||
<%= link_to sub4.name, subject_index_path(sub4.id), class: "accordion-link text-decoration-none text-dark d-block sub5 clickable-link" %> |
||||
<%= link_to "Add Sub Level", new_subject_index_path(parent_id: sub4.id), class: "btn btn-sm btn-primary text-decoration-none d-block sub1 clickable-link position-absolute end-0 accordion-action-button-margin" %> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<% end %> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<% end %> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<% end %> |
||||
</div> |
||||
</div> |
||||
<div class="accordion-collapse collapse" id="<%= children_accordion_id %>" data-bs-parent="#<%= parent_accordion_id %>"> |
||||
<div class="accordion-body pt-1 pb-1" id="<%= accordion_body_id %>"> |
||||
</div> |
||||
</div> |
||||
<% end %> |
||||
<% end %> |
||||
</div> |
||||
</div> |
||||
|
||||
@ -1,31 +1,9 @@
|
||||
<div class="offcanvas offcanvas-start" data-bs-scroll="true" tabindex="-1" data-bs-backdrop="false" id="subjectsOffCanvas"> |
||||
<div class="offcanvas offcanvas-start" data-bs-scroll="true" tabindex="-1" data-bs-backdrop="false" id="subjectsOffCanvas" data-controller="subjects"> |
||||
<div class="offcanvas-header"> |
||||
<h5 class="offcanvas-title" id="offcanvasWithBothOptionsLabel">Subjects</h5> |
||||
<h5 class="offcanvas-title">Subjects</h5> |
||||
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button> |
||||
</div> |
||||
|
||||
<div class="offcanvas-body" id="subjectsAccordion"> |
||||
<% Cdao::Subject.roots.order(name: :asc).each do |root| %> |
||||
<div class="accordion accordion-flash" id="mainPanel<%= root.id %>"> |
||||
<div class="accordion-item"> |
||||
<div class="accordion-header d-flex justify-content-between"> |
||||
<% if root.children.present? %> |
||||
<div class="accordion-button collapsed m-0 p-0" data-bs-toggle="collapse" data-bs-target="#<%= ["rootLevel", root.id].join %>"> |
||||
<%= link_to root.name, subject_index_path(root.id), class: "accordion-link text-decoration-none text-dark d-block sub1 clickable-link" %> |
||||
</div> |
||||
<% else %> |
||||
<%= link_to root.name, subject_index_path(root.id), class: "accordion-link text-decoration-none text-dark d-block sub1 clickable-link" %> |
||||
<% end %> |
||||
</div> |
||||
|
||||
<div class="accordion-collapse collapse" id="<%= ["rootLevel", root.id].join %>" data-bs-parent="#mainPanel<%= root.id %>"> |
||||
<div class="accordion-body pt-1 pb-1"> |
||||
|
||||
<%= render(SubjectAccordionComponent.new(current_user: current_user, parent: root)) %> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<% end %> |
||||
<div class="offcanvas-body" id="subjectsAccordionBody"> |
||||
</div> |
||||
</div> |
||||
|
||||
@ -1,17 +1,7 @@
|
||||
# frozen_string_literal: true |
||||
|
||||
class SubjectsReflex < ApplicationReflex |
||||
def load_sidenav_accordion(search_results, opts = {}) |
||||
morph "#" |
||||
def render_subjects_accordion(search_results, opts = {}) |
||||
morph opts[:accordionTarget], render(partial: "/shared/subjects_accordion", locals: { search_results: search_results, opts: opts }) |
||||
end |
||||
|
||||
def save |
||||
raise @subject_index.inspect |
||||
end |
||||
|
||||
private |
||||
|
||||
def resource_params |
||||
params.permit(:name, :parent_id, library_ids: []) |
||||
end |
||||
end |
||||
|
||||
@ -1,4 +1,5 @@
|
||||
json.array!(@subjects) do |subject| |
||||
json.extract! subject, *%i[id name parent_id state doctrine_ids created_at updated_at] |
||||
json.text subject.lineage_name |
||||
json.heirarchy_level subject.ancestors.count |
||||
end |
||||
|
||||
@ -0,0 +1 @@
|
||||
<%= render(SubjectAccordionComponent.with_collection(search_results, current_user: current_user, opts: opts)) %> |
||||
Loading…
Reference in new issue