Browse Source

Merge pull request #35 from lexintegritastech/improve-main-ui

Major UI updates
pull/36/head
Alexander D. Bondoc 4 years ago committed by GitHub
parent
commit
ff226bd31d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 34
      app/components/annotation_marks_modal_form_component.rb
  2. 38
      app/components/annotation_marks_modal_form_component/annotation_marks_modal_form_component.html.erb
  3. 12
      app/components/doctrine_modal_form_component.rb
  4. 20
      app/components/doctrine_modal_form_component/doctrine_modal_form_component.html.erb
  5. 122
      app/components/document_doctrine_show_component/document_doctrine_show_component.html.erb
  6. 2
      app/components/document_index_table_component.rb
  7. 2
      app/components/document_index_table_component/document_index_table_component.html.erb
  8. 4
      app/components/sidenav_component/sidenav_component.html.erb
  9. 2
      app/controllers/api/doctrine/annotations_controller.rb
  10. 4
      app/controllers/api/documents_controller.rb
  11. 3
      app/controllers/api/subjects_controller.rb
  12. 4
      app/controllers/concerns/subject_search.rb
  13. 87
      app/javascript/controllers/annotations_controller.js
  14. 13
      app/javascript/controllers/application_controller.js
  15. 62
      app/javascript/controllers/doctrines_controller.js
  16. 48
      app/javascript/controllers/document_controller.js
  17. 13
      app/javascript/controllers/select2_controller.js
  18. 52
      app/javascript/controllers/selectize_controller.js
  19. 16
      app/javascript/controllers/subjects_controller.js
  20. 1
      app/javascript/packs/application.js
  21. 4
      app/models/annotation.rb
  22. 8
      app/reflexes/annotation_reflex.rb
  23. 2
      app/reflexes/document_reflex.rb
  24. 4
      app/reflexes/subjects_reflex.rb
  25. 1
      app/views/api/doctrine/annotations/show.json.jbuilder
  26. 2
      app/views/api/doctrines/show.json.jbuilder
  27. 2
      app/views/api/documents/index.json.jbuilder
  28. 2
      app/views/api/subjects/index.json.jbuilder
  29. 19
      app/views/document/doctrines/_document_search_results_table.html.erb
  30. 14
      app/views/document/doctrines/show.html.erb
  31. 6
      app/views/documents/show.html.erb
  32. 0
      app/views/shared/_subjects_sidenav_accorrdion.html.erb

34
app/components/annotation_marks_modal_form_component.rb

@ -1,36 +1,4 @@
class AnnotationMarksModalFormComponent < BaseComponent class AnnotationMarksModalFormComponent < BaseComponent
attr_reader :document, :annotation, :opts
def initialize(current_user:, document:, annotation:, opts:) def initialize(current_user:); end
@document = document
@annotation = annotation
@opts = opts
end
def document_date_or_year
return document.year if document.docdate.blank?
document.docdate.strftime("%B %d, %Y")
end
def document_title
title = document.short_title || document.title
[title, document.reference_number, document_date_or_year].reject(&:blank?).join(", ")
end
def citing_documents_reference_numbers
return if annotation.documents.blank?
annotation.documents.map(&:reference_number).join(" citing ")
end
def citing_document_ids
return if annotation.documents.blank?
annotation.documents.map(&:id).join(",")
end
def render?
opts[:form_url].present? && opts[:form_method].present?
end
end end

38
app/components/annotation_marks_modal_form_component/annotation_marks_modal_form_component.html.erb

@ -1,8 +1,8 @@
<%= form_tag(opts[:form_url], method: opts[:form_method]) do %> <div class="modal fade modal-doctrine-body" id="annotationModal" tabindex="-1" aria-labelledby="annotationModal" aria-hidden="true" data-controller="annotations">
<div class="modal-dialog modal-lg modal-dialog-scrollable"> <div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title">Edit Annotations</h5> <h5 class="modal-title"></h5>
<button type="button" class="btn-close-x" data-bs-dismiss="modal" aria-label="Close">x</button> <button type="button" class="btn-close-x" data-bs-dismiss="modal" aria-label="Close">x</button>
</div> </div>
@ -10,31 +10,34 @@
<div class="row"> <div class="row">
<div class="col-sm-12 p-2"> <div class="col-sm-12 p-2">
<strong> <%= label_tag :annotation_marks %> </strong> <strong> <%= label_tag :annotation_marks %> </strong>
<%= hidden_field_tag :document_id, document.id %> <%= hidden_field_tag :annotation_id, nil, data: { target: "annotations.annotation_id" } %>
<%= hidden_field_tag :document_ids, citing_document_ids %> <%= hidden_field_tag :doctrine_id, nil, data: { target: "annotations.doctrine_id" } %>
<%= select_tag "annomark_ids[]", options_from_collection_for_select(Annomark.all, :id, :name, annotation.annomark_ids), class: "form-control default-selectize pe-0 ps-0", multiple: true, prompt: "Please select" %> <%= hidden_field_tag :document_id, nil, data: { target: "annotations.document_id" } %>
<%= hidden_field_tag :document_ids, nil, data: { target: "annotations.document_ids" } %>
<%= select_tag "annomark_ids[]", options_from_collection_for_select(Annomark.all.order(name: :asc), :id, :name),
class: "form-control default-selectize ps-0", multiple: true, prompt: "Please select",
data: { target: "annotations.annomark_ids" } %>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm-12 p-2"> <div class="col-sm-12 p-2">
<strong> <%= label_tag :document_title %> </strong> <strong> <%= label_tag :document_title %> </strong>
<%= text_area_tag :document_title, [document_title, citing_documents_reference_numbers].reject(&:blank?).join(" "), class: "form-control selected-citing-docs" %> <%= text_area_tag :document_title, nil, class: "form-control selected-citing-docs" %>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="row" data-controller="document">
<div class="col-sm-10 p-2"> <div class="col-sm-10 p-2">
<%= text_field_tag :q, nil, class: "form-control", placeholder: "Search GR Number", data: { target: "document.input" } %> <%= text_field_tag :q, nil, class: "form-control", placeholder: "Search GR Number", data: { target: "annotations.q" } %>
</div> </div>
<div class="col-sm-1 p-2"> <div class="col-sm-1 p-2">
<button type="button" class="btn btn-primary" data-action="click->document#modalDocumentSearch"> Search </button> <button type="button" class="btn btn-primary" data-action="click->annotations#searchDocument"> Search </button>
</div> </div>
</div> </div>
<div class="row tab ms-1 ps-0"> <div class="row tab">
<table class="table table-striped table-hover mb-0"> <table class="table table-striped table-hover mb-0" style="width: 98%; margin: 0 auto;">
<thead> <thead>
<th class="bg-light"> Reference No. </th> <th class="bg-light"> Reference No. </th>
<th class="bg-light"> Title </th> <th class="bg-light"> Title </th>
@ -42,30 +45,29 @@
<th class="bg-light"> </th> <th class="bg-light"> </th>
</thead> </thead>
<tbody id="modalDocumentSearchTable"> </tbody> <tbody id="documentSearchResultTable"> </tbody>
</table> </table>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="col-sm-12 p-2"> <div class="col-sm-12 p-2">
<strong> <%= label_tag :annotation_marks %> </strong> <strong> <%= label_tag :phil_rep %> </strong>
<%= text_field_tag :phil_rep, annotation.phil_rep, class: "form-control" %> <%= text_field_tag :phil_rep, nil, class: "form-control", data: { target: "annotations.phil_rep" } %>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm-12 p-2"> <div class="col-sm-12 p-2">
<strong> <%= label_tag :editor_notes %> </strong> <strong> <%= label_tag :editor_notes %> </strong>
<%= rich_text_area_tag :editor_notes, annotation.editor_notes, placeholder: "Editor Notes" %> <%= rich_text_area_tag :editor_notes, nil, placeholder: "Editor Notes", data: { target: "annotations.editor_notes" } %>
</div> </div>
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<%= submit_tag "Save", class: "btn btn-primary" %> <button type="button" class="btn btn-primary" data-action="click->annotations#save"> Save </button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div> </div>
</div> </div>
</div> </div>
<% end %> </div>

12
app/components/doctrine_modal_form_component.rb

@ -1,13 +1,3 @@
class DoctrineModalFormComponent < BaseComponent class DoctrineModalFormComponent < BaseComponent
attr_reader :doctrine, :subjects, :opts def initialize(current_user:); end
def initialize(current_user:, doctrine:, subjects:, opts:)
@doctrine = doctrine
@subjects = subjects
@opts = opts
end
def render?
opts[:form_url].present? && opts[:form_method].present?
end
end end

20
app/components/doctrine_modal_form_component/doctrine_modal_form_component.html.erb

@ -1,35 +1,33 @@
<div class="modal fade modal-doctrine-body" id="doctrineModal" tabindex="-1" aria-labelledby="doctrineModal" aria-hidden="true"> <div class="modal fade modal-doctrine-body" id="doctrineModal" tabindex="-1" aria-labelledby="doctrineModal" aria-hidden="true" data-controller="doctrines">
<%= form_tag(opts[:form_url], method: opts[:form_method]) do %>
<div class="modal-dialog modal-lg modal-dialog-scrollable"> <div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title"> <%= opts[:form_method].eql?(:post) ? "New Doctrine" : "Update Doctrine" %> </h5> <h5 class="modal-title"></h5>
<button type="button" class="btn-close-x" data-bs-dismiss="modal" aria-label="Close">x</button> <button type="button" class="btn-close-x" data-bs-dismiss="modal" aria-label="Close">x</button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="mb-3"> <div class="mb-3">
<label for="subject-name" class="col-form-label">Subjects</label> <label for="subject-name" class="col-form-label"> Subjects </label>
<%= select_tag "subject_ids[]", options_from_collection_for_select(subjects.sort_by { |sub| sub.lineage_name }, :id, :lineage_name, doctrine.subject_ids), class: "form-control subject-ids-selectize ps-0", multiple: true, prompt: "Please select" %> <%= hidden_field_tag :document_id, nil, data: { target: "doctrines.document_id" } %>
<%= hidden_field_tag :doctrine_id, nil, data: { target: "doctrines.doctrine_id" } %>
<select class="form-control subject-ids-selectize ps-0" name="subject_ids[]" id="subject_ids_" multiple="true"> </select>
</div> </div>
<% if doctrine.new_record? %> <div class="mb-3" id="doctine_content_suggestions_div">
<div class="mb-3">
<label for="subject-name" class="col-form-label">Doctine content suggestions</label> <label for="subject-name" class="col-form-label">Doctine content suggestions</label>
<select id="doctine_content_suggestions" class="form-control ps-0"> </select> <select id="doctine_content_suggestions" class="form-control ps-0"> </select>
</div> </div>
<% end %>
<div class="mb-3"> <div class="mb-3">
<label for="subject-name" class="col-form-label">Content</label> <label for="subject-name" class="col-form-label">Content</label>
<%= rich_text_area_tag :content, doctrine.content, placeholder: "Doctrine Content" %> <%= rich_text_area_tag :content, nil, placeholder: "Doctrine Content", data: { target: "doctrines.content" } %>
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="submit" class="btn btn-primary">Save</button> <button type="button" class="btn btn-primary" data-action="click->doctrines#save">Save</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div> </div>
</div> </div>
</div> </div>
<% end %>
</div> </div>

122
app/components/document_doctrine_show_component/document_doctrine_show_component.html.erb

@ -1,20 +1,20 @@
<hr class="mt-0"/> <hr class="mt-0"/>
<div class="row pe-0"> <div class="row pe-0">
<div class="col-sm-10"> <div class="col-sm-10">
<h5> <b>Doctrine Details</b> </h5> <h5> <b>Doctrine Details</b> </h5>
</div> </div>
<div class="col-sm-2 d-flex justify-content-end pe-0"> <div class="col-sm-2 d-flex justify-content-end pe-0">
<a class="btn btn-sm btn-secondary me-3" data-bs-toggle="modal" data-bs-target="#doctrineModal"> Edit </a> <a class="btn btn-sm btn-secondary me-3" data-controller="doctrines" data-document-id="<%= document_id %>" data-doctrine-id="<%= id %>" data-action="click->doctrines#renderForm" data-bs-toggle="modal" data-bs-target="#doctrineModal"> Edit </a>
<a class="btn btn-sm btn-danger" href="<%= jurisprudence_doctrine_path(document_id, id) %>" data-confirm="Are you sure to delete this record?" data-method="DELETE"> Delete </a> <a class="btn btn-sm btn-danger" href="<%= jurisprudence_doctrine_path(document_id, id) %>" data-confirm="Are you sure to delete this record?" data-method="DELETE"> Delete </a>
</div> </div>
</div> </div>
<hr class="mt-3"/> <hr class="mt-3"/>
<div class="">
<div class="container-sm row-flex col-sm-12 mt-2"> <div class="container-sm row-flex col-sm-12 mt-2">
<%= render(DoctrineModalFormComponent.new(current_user: current_user, doctrine: doctrine, subjects: all_subjects, opts: { form_url: jurisprudence_doctrine_path(jurisprudence_id: document_id, id: doctrine.id), form_method: "PUT" })) %> <%= render(DoctrineModalFormComponent.new(current_user: current_user)) %>
</div>
</div> </div>
<div class="card-body pt-0"> <div class="card-body pt-0">
@ -56,57 +56,7 @@
</div> </div>
<div class="row tab"> <div class="row tab">
<table class="table table-striped table-hover mb-0" style="width: 98%;margin: 0 auto;"> <table class="table table-striped table-hover mb-0" style="width: 98%; margin: 0 auto;">
<thead>
<th class="bg-light"> Reference No. </th>
<th class="bg-light"> Title </th>
<th class="bg-light"> Date </th>
<th class="bg-light"> </th>
</thead>
<tbody id="documentIndexTable">
</tbody>
</table>
<div class="modal fade new-annotation-modal" id="newAnnotationModal" tabindex="-1" aria-labelledby="annotationModal" aria-hidden="true">
<%= form_tag(doctrine_annotations_path(id), method: :post) do%>
<div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">New Annotations</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row">
<div class="col-sm-12 p-2">
<strong> <%= label_tag :annotation_marks %> </strong>
<%= hidden_field_tag :document_id, nil %>
<%= hidden_field_tag :document_ids, nil %>
<%= select_tag "annomark_ids[]", options_from_collection_for_select(Annomark.all, :id, :name), class: "form-select default-selectize", multiple: true, prompt: "Please select" %>
</div>
</div>
<div class="row">
<div class="col-sm-12 p-2">
<strong> <%= label_tag :document_title %> </strong>
<%= text_area_tag :document_title, nil, class: "form-control" %>
</div>
</div>
<div class="row">
<div class="row" data-controller="document">
<div class="col-sm-10 p-2">
<%= text_field_tag :q, nil, class: "form-control", placeholder: "Search GR Number", data: { target: "document.input" } %>
</div>
<div class="col-sm-1 p-2">
<button type="button" class="btn btn-primary" data-action="click->document#modalDocumentSearch"> Search </button>
</div>
</div>
<div class="row tab">
<table class="table table-striped table-hover mb-0">
<thead> <thead>
<th class="bg-light"> Reference No. </th> <th class="bg-light"> Reference No. </th>
<th class="bg-light"> Title </th> <th class="bg-light"> Title </th>
@ -114,47 +64,16 @@
<th class="bg-light"> </th> <th class="bg-light"> </th>
</thead> </thead>
<tbody id="modalDocumentSearchTable"> </tbody> <tbody id="documentIndexTable"> </tbody>
</table> </table>
</div> </div>
</div> </div>
</div>
<div class="row">
<div class="col-sm-12 p-2">
<strong> <%= label_tag :phil_rep %> </strong>
<%= text_field_tag :phil_rep, nil, class: "form-control" %>
</div>
</div>
<div class="row">
<div class="col-sm-12 p-2">
<strong> <%= label_tag :editor_notes %> </strong>
<trix-editor id="editor_notes" placeholder="Editor Notes"> </trix-editor>
</div>
</div>
</div>
<div class="modal-footer">
<%= submit_tag "Save", class: "btn btn-primary" %>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
<% end %>
</div>
</div>
</div>
<div class="row-flex"> <div class="row-flex">
<div class="annot-header"> <div class="annot-header"> <h5> Annotations </h5> </div>
<h5> Annotations </h5>
</div>
<div class=""> <div class="">
<% doctrine.annotations.order(rank: :asc).each do |annotation| %> <% doctrine.annotations.order(rank: :asc).each do |annotation| %>
<div class="row">
<div class="col-sm-10">
<p class="pb-0 ms-3">
<strong> <%= "#{annotation.annomarks.map { |annomark| "(#{annomark.code})" }.join(" ")}" %> </strong>
<% document_title = annotation.document.short_title || annotation.document.title %> <% document_title = annotation.document.short_title || annotation.document.title %>
<% date_or_year = annotation.document.docdate.present? ? annotation.document.docdate.strftime("%B %d, %Y") : annotation.document.year %> <% date_or_year = annotation.document.docdate.present? ? annotation.document.docdate.strftime("%B %d, %Y") : annotation.document.year %>
<% annotated_documents_title = [] %> <% annotated_documents_title = [] %>
@ -163,12 +82,21 @@
<% ad_date_or_year = annotated_document.docdate.present? ? annotated_document.docdate.strftime("%B %d, %Y") : annotated_document.year %> <% ad_date_or_year = annotated_document.docdate.present? ? annotated_document.docdate.strftime("%B %d, %Y") : annotated_document.year %>
<% annotated_documents_title << [" citing #{ad_title}", annotated_document.reference_number, ad_date_or_year].join(", ") %> <% annotated_documents_title << [" citing #{ad_title}", annotated_document.reference_number, ad_date_or_year].join(", ") %>
<% end %> <% end %>
<%= raw [document_title, annotation.document.reference_number, date_or_year, annotation.phil_rep, annotated_documents_title].reject(&:blank?).join(', ').html_safe %> <% citing_document_title = [document_title, annotation.document.reference_number, date_or_year, annotation.phil_rep, annotated_documents_title].reject(&:blank?).join(', ').html_safe %>
<div class="row">
<div class="col-sm-10">
<p class="pb-0 ms-3">
<strong> <%= "#{annotation.annomarks.map { |annomark| "(#{annomark.code})" }.join(" ")}" %> </strong>
<%= raw citing_document_title %>
</p> </p>
</div> </div>
<div class="col-sm-2 d-flex justify-content-end align-items-baseline"> <div class="col-sm-2 d-flex justify-content-end align-items-baseline">
<a class="btn btn-sm btn-secondary me-3" data-bs-toggle="modal" data-bs-target="#editAnnotationModal<%= annotation.id %>"> Edit </a> <a class="btn btn-sm btn-secondary me-3" data-bs-toggle="modal" data-bs-target="#annotationModal"
data-controller="annotations" data-doctrine-id="<%= id %>" data-annotation-id="<%= annotation.id %>"
data-document-title="<%= citing_document_title %>"
data-action="click->annotations#renderForm"> Edit </a>
<a class="btn btn-sm btn-danger" href="<%= doctrine_annotation_path(doctrine.id, annotation.id) %>" data-confirm="Are you sure to delete this record?" data-method="DELETE"> Delete </a> <a class="btn btn-sm btn-danger" href="<%= doctrine_annotation_path(doctrine.id, annotation.id) %>" data-confirm="Are you sure to delete this record?" data-method="DELETE"> Delete </a>
</div> </div>
</div> </div>
@ -185,13 +113,11 @@
</div> </div>
<hr/> <hr/>
<% end %> <% end %>
<div class="row annotation-marks-modal-container">
<div class="modal fade modal-doctrine-body" id="editAnnotationModal<%= annotation.id %>" tabindex="-1" aria-labelledby="annotationModal" aria-hidden="true">
<%= render AnnotationMarksModalFormComponent.new(current_user: current_user, document: document, annotation: annotation, opts: { form_url: doctrine_annotation_path(id, annotation.id), form_method: "PUT" }) %>
</div>
</div>
<% end %> <% end %>
</div> </div>
<div class="row">
<%= render AnnotationMarksModalFormComponent.new(current_user: current_user) %>
</div>
</div> </div>
</div> </div>

2
app/components/document_index_table_component.rb

@ -7,7 +7,7 @@ class DocumentIndexTableComponent < BaseComponent
@opts = opts @opts = opts
end end
delegate :reference_number, to: :search_result delegate :clean_reference_number, to: :search_result
delegate :title, to: :search_result delegate :title, to: :search_result
delegate :short_title, to: :search_result delegate :short_title, to: :search_result

2
app/components/document_index_table_component/document_index_table_component.html.erb

@ -1,5 +1,5 @@
<tr href="<%= document_path(search_result.id) %>" class="<%= opts.reject{ |k, v| v.blank? }.blank? ? 'clickable-tr' : ''%>" target="_blank"> <tr href="<%= document_path(search_result.id) %>" class="<%= opts.reject{ |k, v| v.blank? }.blank? ? 'clickable-tr' : ''%>" target="_blank">
<td> <%= reference_number %> </td> <td> <%= clean_reference_number %> </td>
<td> <%= short_title || title %> </td> <td> <%= short_title || title %> </td>
<td> <%= date_or_year %> </td> <td> <%= date_or_year %> </td>
</tr> </tr>

4
app/components/sidenav_component/sidenav_component.html.erb

@ -21,8 +21,6 @@
<i class="fas fa-indent"></i> <%= link_to "Subjects", "#", class: "accordion-link text-decoration-none mx-2 text-dark text-white " %> <i class="fas fa-indent"></i> <%= link_to "Subjects", "#", class: "accordion-link text-decoration-none mx-2 text-dark text-white " %>
</button> </button>
</div> </div>
<%= render(SubjectsSidenavSubMenuComponent.new(current_user: current_user, opts: { is_subjects_index: true, main_sub_menu: "mainSubjectIndexSubMenu", second_sub_menu: "secondSubjectIndexSubMenu", third_sub_menu: "thirdSubjectIndexSubMenu", fourth_sub_menu: "fourthSubjectIndexSubMenu", fifth_sub_menu: "fifthSubjectIndexSubMenu" })) %>
</div> </div>
</li> </li>
@ -33,8 +31,6 @@
<i class="fas fa-book"></i> <%= link_to "Doctrines", "#", class: "accordion-link text-decoration-none mx-2 text-dark text-white " %> <i class="fas fa-book"></i> <%= link_to "Doctrines", "#", class: "accordion-link text-decoration-none mx-2 text-dark text-white " %>
</button> </button>
</div> </div>
<%= render(SubjectsSidenavSubMenuComponent.new(current_user: current_user, opts: { is_doctrines_index: true, main_sub_menu: "mainDoctrinesSubMenu", second_sub_menu: "secondDoctrinesSubMenu", third_sub_menu: "thirdDoctrinesSubMenu", fourth_sub_menu: "fourthDoctrinesSubMenu", fifth_sub_menu: "fifthDoctrinesSubMenu" })) %>
</div> </div>
</li> </li>

2
app/controllers/api/doctrine/annotations_controller.rb

@ -16,7 +16,7 @@ module Api
attrs = resource_params.to_unsafe_h.deep_symbolize_keys attrs = resource_params.to_unsafe_h.deep_symbolize_keys
subject_ids = attrs.delete(:subject_ids) subject_ids = attrs.delete(:subject_ids)
@annotation = @jurisprudence.annotations.new(attrs) @annotation = @doctrine.annotations.new(attrs)
if @annotation.save if @annotation.save
@annotation.subject_ids = subject_ids if subject_ids.present? @annotation.subject_ids = subject_ids if subject_ids.present?

4
app/controllers/api/documents_controller.rb

@ -21,10 +21,10 @@ module Api
fulltext_fields = %i[reference_number title short_title].freeze fulltext_fields = %i[reference_number title short_title].freeze
search = Cdao::Document.search do search = Cdao::Document.search do
fulltext search_params[:q], fields: fulltext_fields if search_params[:q].present? fulltext search_params[:q], fields: fulltext_fields, query_phrase_slop: 0, minimum_match: 1 if search_params[:q].present?
fulltext_fields.each do |field| fulltext_fields.each do |field|
fulltext search_params[field], fields: [field] if search_params[field].present? fulltext search_params[field], fields: [field], query_phrase_slop: 0, minimum_match: 1 if search_params[field].present?
end end
with(:year, search_params[:year].to_i) if search_params[:year].present? with(:year, search_params[:year].to_i) if search_params[:year].present?

3
app/controllers/api/subjects_controller.rb

@ -14,8 +14,7 @@ module Api
private private
def search_params def search_params
params.permit(:name, :parent_id, :state, doctrine_ids: [], exclude_ids: []) params.permit(:q, :name, :parent_id, :state, :doctrine_ids, :page, :per_page, exclude_ids: [])
end end
end end
end end

4
app/controllers/concerns/subject_search.rb

@ -15,6 +15,10 @@ module SubjectSearch
without(:id).any_of(search_params[:exclude_ids]) if search_params[:exclude_ids].present? without(:id).any_of(search_params[:exclude_ids]) if search_params[:exclude_ids].present?
if search_params[:doctrine_ids].present?
with(:doctrine_ids).any_of(search_params[:doctrine_ids].split(",").reject(&:blank?).map(&:to_i))
end
order_by :lineage_name, :asc order_by :lineage_name, :asc
order_by :name, :asc order_by :name, :asc

87
app/javascript/controllers/annotations_controller.js

@ -0,0 +1,87 @@
import ApplicationController from './application_controller'
export default class extends ApplicationController {
static targets = ["q", "annotation_id", "doctrine_id", "document_id", "document_ids",
"annomark_ids", "phil_rep", "editor_notes"]
connect () {
super.connect()
}
searchDocument () {
var $this = this
$.get("/api/documents.json", { q: $this.qTarget.value }, function (data, status) {
if (status === "success") {
$this.stimulate("AnnotationReflex#render_document_search_results", data)
}
});
}
renderForm () {
var $this = this, annotation_id = $this.element.dataset["annotationId"], doctrine_id = $this.element.dataset["doctrineId"],
document_title = "", document_ref_no = "", document_date_or_year = "", $modal = $("#annotationModal")
if(annotation_id !== null && annotation_id !== undefined && annotation_id !== "") {
$modal.find(".modal-title").text("Edit Annotation")
$.get("/api/doctrines/" + doctrine_id + "/annotations/" + annotation_id + ".json", {}, function(result, status) {
$modal.find("#annotation_id").val(annotation_id)
$modal.find("#doctrine_id").val(doctrine_id)
$modal.find("#document_id").val(result.citing_document_ids)
$modal.find("#document_ids").val(result.document_id)
$modal.find("#phil_rep").val(result.phil_rep)
$modal.find("#document_title").val($this.element.dataset["documentTitle"])
$modal.find("select[name='annomark_ids[]']")[0].selectize.setValue(result.annomark_ids)
$modal.find(".trix-content").val(result.editor_notes)
});
} else {
$modal.find(".modal-title").text("New Annotation")
document_title = this.element.dataset["documentTitle"]
document_ref_no = this.element.dataset["documentReferenceNumber"]
document_date_or_year = this.element.dataset["documentDateOrYear"]
$modal.find("#doctrine_id").val(doctrine_id)
$modal.find("#document_title").val([document_title, document_ref_no, document_date_or_year].join(", "))
$modal.find("#document_id").val(this.element.dataset["documentId"])
$modal.find("#phil_rep").val(this.element.dataset["documentPhilRep"])
}
}
addCitingDocument () {
var document_id = "", document_ref_no = "", document_date = "", document_title = "",
$modal = $("#annotationModal"), $doc_title = $modal.find("#document_title"),
$citing_document_ids = $modal.find("#document_ids")
document_id = this.element.dataset["documentId"]
document_ref_no = this.element.dataset["documentReferenceNumber"]
document_date = this.element.dataset["documentDate"]
document_title = this.element.dataset["documentTitle"]
var document_ids = []
if ($citing_document_ids.val() !== null && $citing_document_ids.val() !== undefined && $citing_document_ids.val() !== "") {
document_ids = $citing_document_ids.val().split(",")
}
document_ids.push(document_id)
$citing_document_ids.val(document_ids.join(","))
var doc_title = $doc_title.val()
$doc_title.val(doc_title + " citing " + [document_title, document_ref_no, document_date].join(", "))
}
save () {
var $this = this, $modal = $("#annotationModal"), annotation_id = $this.annotation_idTarget.value, doctrine_id = $this.doctrine_idTarget.value
const params = { annomark_ids: $modal.find("select[name='annomark_ids[]']").val(), document_id: $this.document_idTarget.value,
document_ids: $this.document_idsTarget.value || "", phil_rep: $this.phil_repTarget.value || "",
editor_notes: $this.editor_notesTarget.value || "" }
if (annotation_id !== null && annotation_id !== undefined && annotation_id !== "") {
$.ajax({
url: "/doctrines/" + doctrine_id + "/annotations/" + annotation_id,
type: 'PUT',
data: params
})
} else {
$.post("/doctrines/" + doctrine_id + "/annotations", params)
}
}
}

13
app/javascript/controllers/application_controller.js

@ -1,14 +1,11 @@
import { Controller } from 'stimulus' import { Controller } from 'stimulus';
import StimulusReflex from 'stimulus_reflex' import StimulusReflex from 'stimulus_reflex';
import $ from 'jquery'; import $ from 'jquery';
import { end } from '@popperjs/core'
require("select2/dist/css/select2") require("selectize/dist/js/selectize.min");
require("select2-bootstrap-theme/dist/select2-bootstrap") require("selectize/dist/css/selectize");
require("selectize.js/dist/js/selectize.min")
require("selectize.js/dist/css/selectize")
import Select2 from "select2"
import Selectize from "selectize"; import Selectize from "selectize";
/* This is your ApplicationController. /* This is your ApplicationController.

62
app/javascript/controllers/doctrines_controller.js

@ -0,0 +1,62 @@
import ApplicationController from './application_controller'
export default class extends ApplicationController {
static targets = ["input", "document_id", "doctrine_id", "content"]
connect () {
super.connect()
}
renderForm () {
var document_id = this.element.dataset["documentId"], doctrine_id = this.element.dataset["doctrineId"],
$modal = $("#doctrineModal"), $subject_ids_el = $modal.find(".subject-ids-selectize"),
$subject_ids_selectize = $subject_ids_el[0].selectize
console.log(this.element.dataset)
if (doctrine_id !== null && doctrine_id !== undefined && doctrine_id !== "") {
$modal.find("#doctine_content_suggestions_div").hide()
$.get("/api/doctrines/" + doctrine_id + ".json", {}, function (doctrine, status) {
$modal.find("#document_id").val(doctrine.document_id)
$modal.find("#doctrine_id").val(doctrine.id)
if (status === "success") {
$.get("/api/subjects.json?doctrine_ids=" + doctrine.id, { per_page: 100 }, function (subjects, status) {
if (status === "success") {
$.each(subjects, function(i, subject) {
$subject_ids_selectize.addOption(subject)
})
$subject_ids_selectize.refreshOptions()
$subject_ids_selectize.setValue(doctrine.subject_ids)
}
});
$modal.find(".trix-content").val(doctrine.content)
}
})
$modal.find(".modal-title").text("Update Doctrine")
$(".selectize-dropdown").hide()
} else {
$modal.find("#doctine_content_suggestions_div").show()
$modal.find(".modal-title").text("New Doctrine")
$modal.find(".trix-content").val("")
$subject_ids_selectize.setValue([])
$modal.find("#document_id").val(document_id)
}
}
save () {
var $modal = $("#doctrineModal"), document_id = this.document_idTarget.value, doctrine_id = this.doctrine_idTarget.value
const params = { subject_ids: $modal.find("select[name='subject_ids[]']").val(), content: this.contentTarget.value }
if (doctrine_id !== null && doctrine_id !== undefined && doctrine_id !== "") {
$.ajax({
url: "/jurisprudences/" + document_id + "/doctrines/" + doctrine_id,
type: 'PUT',
data: params
})
} else {
$.post("/jurisprudences/" + document_id + "/doctrines", params)
}
}
}

48
app/javascript/controllers/document_controller.js

@ -1,4 +1,3 @@
import { end } from '@popperjs/core'
import ApplicationController from './application_controller' import ApplicationController from './application_controller'
export default class extends ApplicationController { export default class extends ApplicationController {
static targets = ["input"] static targets = ["input"]
@ -17,15 +16,6 @@ export default class extends ApplicationController {
}); });
} }
modalDocumentSearch () {
var $this = this
$.get("/api/documents.json", { q: $this.inputTarget.value }, function (data, status) {
if (status === "success") {
$this.stimulate("DocumentReflex#render_modal_document_search_table", data)
}
});
}
loadYears () { loadYears () {
var $this = this var $this = this
$.get("/api/jurisprudences/years.json", {}, function (data, status) { $.get("/api/jurisprudences/years.json", {}, function (data, status) {
@ -34,42 +24,4 @@ export default class extends ApplicationController {
} }
}); });
} }
loadFormDocumentDetais () {
var document_id = "", document_title = "", document_ref_no = "", document_date_or_year = "", document_phil_rep = "", $modal = $("#newAnnotationModal")
document_id = this.element.dataset["documentId"]
document_title = this.element.dataset["documentTitle"]
document_ref_no = this.element.dataset["documentReferenceNumber"]
document_date_or_year = this.element.dataset["documentDateOrYear"]
document_phil_rep = this.element.dataset["documentPhilRep"]
$modal.find("#document_title").val([document_title, document_ref_no, document_date_or_year].join(", "))
$modal.find("#document_id").val(document_id)
$modal.find("#phil_rep").val(document_phil_rep)
}
addCitingDocument () {
var document_id = "", document_ref_no = "", document_date = "", document_title = "", $modal = $("#newAnnotationModal"), $doc_title = $modal.find("#document_title")
document_id = this.element.dataset["documentId"]
document_ref_no = this.element.dataset["documentReferenceNumber"]
document_date = this.element.dataset["documentDate"]
document_title = this.element.dataset["documentTitle"]
var document_ids = []
if ($("#document_ids").val() === "") {
document_ids.push(document_id)
} else {
document_ids = $("#document_ids").val().split(",")
document_ids.push(document_id)
}
$("#document_ids").val(document_ids.join(","))
var doc_title = $doc_title.val()
$doc_title.val(doc_title + " citing " + [document_title, document_ref_no, document_date].join(", "))
}
} }

13
app/javascript/controllers/select2_controller.js

@ -1,13 +0,0 @@
import ApplicationController from './application_controller'
export default class extends ApplicationController {
connect() {
super.connect()
$("#cdao_subject_parent_id").select2({ tags: true, width: "100%" })
$(".subjects-select2").select2({ tags: true, width: "100%" })
$(".annomark-ids-select2").select2({ width: "100%", dropdownParent: $("#edit-annotation-modal") })
$(".new-annotation-annomark-ids").select2({ width: "100%", dropdownParent: $("#new-annotation-modal") })
$(".subject-ids-modal-select2").select2({ width: "100%", dropdownParent: $("#doctrineModal") })
}
}

52
app/javascript/controllers/selectize_controller.js

@ -3,60 +3,82 @@ import ApplicationController from './application_controller'
export default class extends ApplicationController { export default class extends ApplicationController {
connect() { connect() {
super.connect() super.connect()
var $this = this
var default_opts = { var default_opts = {
plugins: ['restore_on_backspace', 'remove_button'], plugins: ['restore_on_backspace', 'remove_button'],
searchField: ['text', 'optgroup'], searchField: ['text', 'optgroup'],
valueField: "id", valueField: "id",
allowEmptyOption: false, allowEmptyOption: false,
closeAfterSelect: true,
showEmptyOptionInDropdown: true, showEmptyOptionInDropdown: true,
emptyOptionLabel: true, emptyOptionLabel: true,
hideSelected: true, hideSelected: true,
placeholder: "Please Select" placeholder: "Please Select"
} }
$(".default-selectize").selectize(default_opts) $(".default-selectize").selectize(default_opts);
var $doctrine_content = $("#doctrineModal").find("input[name='content']") var $doctrine_content = $("#doctrineModal").find("input[name='content']");
var $trix_content = $("#doctrineModal").find(".trix-content") var $trix_content = $("#doctrineModal").find(".trix-content");
var doctrine_content_suggestions_opts = { var doctrine_content_suggestions_opts = {
onChange: function (value) { onChange: function (value) {
if(value === null || value === undefined || value === "") { if(value === null || value === undefined || value === "") {
$doctrine_content.val("") $doctrine_content.val("");
$trix_content.val("") $trix_content.val("");
} else { } else {
$doctrine_content.val(value.text()) $.get("/api/doctrines/" + value + ".json", {}, function (doctrine, status) {
$trix_content.val(value) if (status === "success") {
$doctrine_content.val(doctrine.content);
$trix_content.val(doctrine.content);
}
});
} }
} }
}; };
var subject_ids_opts = { var subject_ids_opts = {
load: function (query, callback) {
$.get("/api/subjects.json", { q: query, per_page: 100 }, function (data, status) {
if (status === 'success') {
callback(data);
}
})
},
onChange: function (value) { onChange: function (value) {
var selectize_options = [] var selectize_options = []
var $selectize = $("#doctrineModal").find("#doctine_content_suggestions").selectize($.extend({ options: selectize_options }, doctrine_content_suggestions_opts)) var $selectize = $("#doctrineModal").find("#doctine_content_suggestions").selectize($.extend({ options: selectize_options }, doctrine_content_suggestions_opts));
if (value.length === 0) { if (value.length === 0) {
$selectize[0].selectize.clearOptions(); if ($selectize.length) $selectize[0].selectize.clearOptions();
} else { } else {
$.get("/api/doctrines.json", { subject_ids: value }, function(data, status) { $.get("/api/doctrines.json", { subject_ids: value }, function(data, status) {
if (status === "success") { if (status === "success") {
$.each(data, function (i, doctrine) { $.each(data, function (i, doctrine) {
selectize_options.push({ id: doctrine.id, value: doctrine.content, text: doctrine.plain_content }) selectize_options.push({ id: doctrine.id, value: doctrine.content, text: doctrine.plain_content });
}) })
$selectize[0].selectize.addOption(selectize_options) if ($selectize.length) $selectize[0].selectize.addOption(selectize_options);
} }
}); });
} }
$selectize[0].selectize.refreshOptions() if ($selectize.length) $selectize[0].selectize.refreshOptions();
} }
}; };
$(".subject-ids-selectize").selectize($.extend(subject_ids_opts, default_opts)) var $subject_ids_selectize = $(".subject-ids-selectize").selectize($.extend(subject_ids_opts, default_opts));
$("#doctine_content_suggestions").selectize($.extend(doctrine_content_suggestions_opts, default_opts))
$.get("/api/subjects.json", { per_page: 100 }, function (results, status) {
if (status === 'success') {
$.each(results, function (i, result) {
$subject_ids_selectize[0].selectize.addOption(result);
})
$subject_ids_selectize[0].selectize.refreshOptions();
}
});
$("#doctine_content_suggestions").selectize($.extend(doctrine_content_suggestions_opts, default_opts));
} }
} }

16
app/javascript/controllers/subjects_controller.js

@ -4,7 +4,19 @@ export default class extends ApplicationController {
super.connect() super.connect()
} }
load_roots() { renderSidenavAccordion () {
this.stimulate("SubjectsReflex#load_roots") var parent_id = this.element.dataset["subjectParentId"], $this = this, params = {}
if (parent_id !== null && parent_id !== undefined && parent_id !== "") {
params.parent_id = parent_id
} else {
params.is_root_only = true
}
$.get("/api/subjects.json", params, function (results, status) {
if (status === "success") {
$this.stimulate("SubjectsReflex#render_sidenav_accordion", results)
}
})
} }
} }

1
app/javascript/packs/application.js

@ -15,7 +15,6 @@ import 'bootstrap/dist/css/bootstrap.min.css';
import "@fortawesome/fontawesome-free/js/all.min"; import "@fortawesome/fontawesome-free/js/all.min";
import "@fortawesome/fontawesome-free/css/all.min"; import "@fortawesome/fontawesome-free/css/all.min";
import "moment"; import "moment";
import "select2";
import "chosen-js"; import "chosen-js";
import 'trix/dist/trix.css'; import 'trix/dist/trix.css';
import 'trix/dist/trix.js'; import 'trix/dist/trix.js';

4
app/models/annotation.rb

@ -25,6 +25,10 @@ class Annotation < ApplicationRecord
annotation_documents.find_by(document_id: document.id).destroy annotation_documents.find_by(document_id: document.id).destroy
end end
def citing_document_ids
documents.map(&:id)
end
searchable do searchable do
integer :document_id integer :document_id
integer :doctrine_id integer :doctrine_id

8
app/reflexes/annotation_reflex.rb

@ -0,0 +1,8 @@
# frozen_string_literal: true
class AnnotationReflex < ApplicationReflex
def render_document_search_results(results)
opts = { is_citing_document: true }
morph "tbody#documentSearchResultTable", render(partial: "document_search_results_table", locals: { search_results: results, opts: opts })
end
end

2
app/reflexes/document_reflex.rb

@ -4,7 +4,7 @@ class DocumentReflex < ApplicationReflex
include JurisprudenceSearch include JurisprudenceSearch
def render_index_table(results, document_id, doctrine_id) def render_index_table(results, document_id, doctrine_id)
opts = { is_case_lists: true, document_id: document_id, doctrine_id: doctrine_id, form_method: :post } opts = { is_case_lists: true, doctrine_id: doctrine_id }
morph "tbody#documentIndexTable", render(partial: "document_search_results_table", locals: { search_results: results, opts: opts }) morph "tbody#documentIndexTable", render(partial: "document_search_results_table", locals: { search_results: results, opts: opts })
end end

4
app/reflexes/subjects_reflex.rb

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
class SubjectsReflex < ApplicationReflex class SubjectsReflex < ApplicationReflex
def load_roots def load_sidenav_accordion(search_results, opts = {})
@roots = "Hello!!!" morph "#"
end end
end end

1
app/views/api/doctrine/annotations/show.json.jbuilder

@ -0,0 +1 @@
json.(@annotation, *%i[id doctrine_id document_id phil_rep editor_notes annomark_ids citing_document_ids])

2
app/views/api/doctrines/show.json.jbuilder

@ -1 +1 @@
json.(@doctrine, *%i[id subject_ids content plain_content created_at updated_at]) json.(@doctrine, *%i[id document_id subject_ids content plain_content created_at updated_at])

2
app/views/api/documents/index.json.jbuilder

@ -1,3 +1,3 @@
json.array!(@documents) do |document| json.array!(@documents) do |document|
json.extract! document, *%i[id reference_number title short_title doc_date year phil_rep scra] json.extract! document, *%i[id reference_number clean_reference_number title short_title doc_date year phil_rep scra]
end end

2
app/views/api/subjects/index.json.jbuilder

@ -1,4 +1,4 @@
json.array!(@subjects) do |subject| json.array!(@subjects) do |subject|
json.extract! subject, *%i[id name parent_id state doctrine_ids created_at updated_at] json.extract! subject, *%i[id name parent_id state doctrine_ids created_at updated_at]
json.text [subject.lineage_name].join(" - ") json.text subject.lineage_name
end end

19
app/views/document/doctrines/_document_search_results_table.html.erb

@ -1,17 +1,17 @@
<% search_results.each do |search_result| %> <% search_results.each do |search_result| %>
<tr> <tr>
<td> <%= search_result["reference_number"] %> </td> <td> <%= search_result["clean_reference_number"] %> </td>
<td> <%= search_result["short_title"] || search_result["title"] %> </td> <td> <%= search_result["short_title"] || search_result["title"] %> </td>
<td> <%= search_result["doc_date"].present? ? search_result["doc_date"].to_date.strftime("%m/%d/%Y") : search_result["year"] %> </td> <td> <%= search_result["doc_date"].present? ? search_result["doc_date"].to_date.strftime("%m/%d/%Y") : search_result["year"] %> </td>
<% if opts[:is_case_lists].present? && opts[:document_id].present? && opts[:doctrine_id].present? %> <% if opts[:is_case_lists].present? && opts[:doctrine_id].present? %>
<td> <td>
<% date_or_year = search_result["doc_date"].present? ? search_result["doc_date"].to_date.strftime("%B %d, %Y") : search_result["year"] %> <% date_or_year = search_result["doc_date"].present? ? search_result["doc_date"].to_date.strftime("%B %d, %Y") : search_result["year"] %>
<% title = search_result["short_title"].present? ? search_result["short_title"] : search_result["title"] %> <% title = search_result["short_title"].present? ? search_result["short_title"] : search_result["title"] %>
<a class="btn btn-sm btn-primary" data-bs-toggle="modal" data-bs-target="#newAnnotationModal" data-controller="document" data-document-title="<%= title %>" <a class="btn btn-sm btn-primary" data-bs-toggle="modal" data-bs-target="#annotationModal" data-controller="annotations"
data-document-id="<%= search_result['id'] %>" data-document-reference-number="<%= search_result['reference_number'] %>" data-doctrine-id="<%= opts[:doctrine_id] %>" data-document-id="<%= search_result['id'] %>" data-document-title="<%= title %>"
data-document-date-or-year="<%= date_or_year %>" data-document-phil-rep="<%= search_result['phil_rep'] %>" data-document-reference-number="<%= search_result['clean_reference_number'] %>" data-document-date-or-year="<%= date_or_year %>"
data-action="click->document#loadFormDocumentDetais"> data-document-phil-rep="<%= search_result['phil_rep'] %>" data-action="click->annotations#renderForm">
Add Annotations Add Annotations
</a> </a>
</td> </td>
@ -19,10 +19,11 @@
<% if opts[:is_citing_document].present? %> <% if opts[:is_citing_document].present? %>
<td> <td>
<a class="btn btn-sm btn-primary" data-action="click->document#addCitingDocument" data-controller="document" data-document-id="<%= search_result["id"] %>" <a class="btn btn-sm btn-primary" data-controller="annotations" data-document-id="<%= search_result["id"] %>"
data-document-reference-number="<%= search_result['reference_number'] %>" data-document-reference-number="<%= search_result['clean_reference_number'] %>"
data-document-date="<%= search_result['doc_date'].present? ? search_result['doc_date'].to_date.strftime('%B %d, %Y') : search_result['year'] %>" data-document-date="<%= search_result['doc_date'].present? ? search_result['doc_date'].to_date.strftime('%B %d, %Y') : search_result['year'] %>"
data-document-title="<%= search_result['short_title'] || search_result['title'] %>"> data-document-title="<%= search_result['short_title'] || search_result['title'] %>"
data-action="click->annotations#addCitingDocument" >
Add Add
</a> </a>
</td> </td>

14
app/views/document/doctrines/show.html.erb

@ -1,6 +1,6 @@
<div class="card mt-1 g-3"> <div class="card mt-1 g-3">
<div class="card-header mt-1 mb-2 col-sm-12"> <div class="card-header mb-0 col-sm-12">
<table class="table table-borderless"> <table class="table table-borderless mb-0">
<tbody> <tbody>
<tr> <tr>
<td class="text-start" style="width: 160px;"> Reference Number: </td> <td class="text-start" style="width: 160px;"> Reference Number: </td>
@ -17,14 +17,10 @@
</table> </table>
</div> </div>
<div class="card-body"> <div class="card-body pt-0">
<div class="row"> <div class="row">
<div class="d-flex justify-content-end p-3"> <div class="d-flex justify-content-end p-2">
<a class="btn btn-sm btn-primary" data-bs-toggle="modal" data-bs-target="#doctrineModal"> Add Doctrine </a> <a class="btn btn-sm btn-primary" data-controller="doctrines" data-document-id="<%= @document.id %>" data-action="click->doctrines#renderForm" data-bs-toggle="modal" data-bs-target="#doctrineModal"> Add Doctrine </a>
</div>
<div class="container-sm row-flex col-sm-12 mt-2">
<%= render(DoctrineModalFormComponent.new(current_user: current_user, doctrine: @document.doctrines.new, subjects: Cdao::Subject.all.order(name: :asc), opts: { form_url: jurisprudence_doctrines_path(jurisprudence_id: @document.id), form_method: :post })) %>
</div> </div>
</div> </div>

6
app/views/documents/show.html.erb

@ -1,5 +1,3 @@
<div class="card mt-1 g-3"> <div class="card mt-1 g-3">
<div class="container p-2 card-header"> <div class="container p-2 card-header">
<div class="row"> <div class="row">
@ -55,10 +53,10 @@
<div class="tab-pane fade show active" id="analysisTabContent" role="tabpanel" aria-labelledby="home-tab"> <div class="tab-pane fade show active" id="analysisTabContent" role="tabpanel" aria-labelledby="home-tab">
<div class="row"> <div class="row">
<div class="d-flex justify-content-end" style="margin: 10px 0 0 -20px;"> <div class="d-flex justify-content-end" style="margin: 10px 0 0 -20px;">
<a class="btn btn-sm btn-primary" data-bs-toggle="modal" data-bs-target="#doctrineModal"> Add Doctrine </a> <a class="btn btn-sm btn-primary" data-controller="doctrines" data-document-id="<%= @document.id %>" data-action="click->doctrines#renderForm" data-bs-toggle="modal" data-bs-target="#doctrineModal"> Add Doctrine </a>
</div> </div>
<div class="container-sm row-flex col-sm-12 mt-2"> <div class="container-sm row-flex col-sm-12 mt-2">
<%= render(DoctrineModalFormComponent.new(current_user: current_user, doctrine: @document.doctrines.new, subjects: @subjects.order(name: :asc), opts: { form_url: jurisprudence_doctrines_path(jurisprudence_id: @document.id), form_method: :post })) %> <%= render(DoctrineModalFormComponent.new(current_user: current_user)) %>
</div> </div>
</div> </div>

0
app/views/shared/_subjects_sidenav_accorrdion.html.erb

Loading…
Cancel
Save