Browse Source

Major UI updates

pull/35/head
alexdbondoc17 4 years ago
parent
commit
15144fc9e0
  1. 34
      app/components/annotation_marks_modal_form_component.rb
  2. 60
      app/components/annotation_marks_modal_form_component/annotation_marks_modal_form_component.html.erb
  3. 12
      app/components/doctrine_modal_form_component.rb
  4. 52
      app/components/doctrine_modal_form_component/doctrine_modal_form_component.html.erb
  5. 162
      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. 5
      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. 54
      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
attr_reader :document, :annotation, :opts
def initialize(current_user:, document:, annotation:, opts:)
@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
def initialize(current_user:); end
end

60
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-content">
<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>
</div>
@ -10,62 +10,64 @@
<div class="row">
<div class="col-sm-12 p-2">
<strong> <%= label_tag :annotation_marks %> </strong>
<%= hidden_field_tag :document_id, document.id %>
<%= hidden_field_tag :document_ids, citing_document_ids %>
<%= 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 :annotation_id, nil, data: { target: "annotations.annotation_id" } %>
<%= hidden_field_tag :doctrine_id, nil, data: { target: "annotations.doctrine_id" } %>
<%= 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 class="row">
<div class="col-sm-12 p-2">
<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 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 class="col-sm-10 p-2">
<%= text_field_tag :q, nil, class: "form-control", placeholder: "Search GR Number", data: { target: "annotations.q" } %>
</div>
<div class="col-sm-1 p-2">
<button type="button" class="btn btn-primary" data-action="click->annotations#searchDocument"> Search </button>
</div>
</div>
<div class="row tab ms-1 ps-0">
<table class="table table-striped table-hover mb-0">
<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>
<div class="row tab">
<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="modalDocumentSearchTable"> </tbody>
</table>
</div>
<tbody id="documentSearchResultTable"> </tbody>
</table>
</div>
<div class="row">
<div class="col-sm-12 p-2">
<strong> <%= label_tag :annotation_marks %> </strong>
<%= text_field_tag :phil_rep, annotation.phil_rep, class: "form-control" %>
<strong> <%= label_tag :phil_rep %> </strong>
<%= text_field_tag :phil_rep, nil, class: "form-control", data: { target: "annotations.phil_rep" } %>
</div>
</div>
<div class="row">
<div class="col-sm-12 p-2">
<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 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>
</div>
</div>
</div>
<% end %>
</div>

12
app/components/doctrine_modal_form_component.rb

@ -1,13 +1,3 @@
class DoctrineModalFormComponent < BaseComponent
attr_reader :doctrine, :subjects, :opts
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
def initialize(current_user:); end
end

52
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">
<%= form_tag(opts[:form_url], method: opts[:form_method]) do %>
<div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"> <%= opts[:form_method].eql?(:post) ? "New Doctrine" : "Update Doctrine" %> </h5>
<button type="button" class="btn-close-x" data-bs-dismiss="modal" aria-label="Close">x</button>
</div>
<div class="modal-body">
<div class="mb-3">
<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" %>
</div>
<% if doctrine.new_record? %>
<div class="mb-3">
<label for="subject-name" class="col-form-label">Doctine content suggestions</label>
<select id="doctine_content_suggestions" class="form-control ps-0"> </select>
</div>
<% end %>
<div class="modal fade modal-doctrine-body" id="doctrineModal" tabindex="-1" aria-labelledby="doctrineModal" aria-hidden="true" data-controller="doctrines">
<div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"></h5>
<button type="button" class="btn-close-x" data-bs-dismiss="modal" aria-label="Close">x</button>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="subject-name" class="col-form-label">Content</label>
<%= rich_text_area_tag :content, doctrine.content, placeholder: "Doctrine Content" %>
<label for="subject-name" class="col-form-label"> Subjects </label>
<%= 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 class="mb-3" id="doctine_content_suggestions_div">
<label for="subject-name" class="col-form-label">Doctine content suggestions</label>
<select id="doctine_content_suggestions" class="form-control ps-0"> </select>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary">Save</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<div class="mb-3">
<label for="subject-name" class="col-form-label">Content</label>
<%= rich_text_area_tag :content, nil, placeholder: "Doctrine Content", data: { target: "doctrines.content" } %>
</div>
</div>
<div class="modal-footer">
<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>
</div>
</div>
<% end %>
</div>
</div>

162
app/components/document_doctrine_show_component/document_doctrine_show_component.html.erb

@ -1,42 +1,42 @@
<hr class="mt-0"/>
<div class="row pe-0">
<div class="col-sm-10">
<h5> <b>Doctrine Details</b> </h5>
</div>
<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>
</div>
</div>
<hr class="mt-3"/>
<div class="">
<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" })) %>
</div>
<div class="container-sm row-flex col-sm-12 mt-2">
<%= render(DoctrineModalFormComponent.new(current_user: current_user)) %>
</div>
<div class="card-body pt-0">
<div class="row">
<div class="col-sm-2" style="width: 100px;">
<strong> Subjects: </strong>
</div>
<div class="row">
<div class="col-sm-2" style="width: 100px;">
<strong> Subjects: </strong>
</div>
<div class="col-sm-10">
<%= subjects.map(&:lineage_name).join(" & ") %>
</div>
<div class="col-sm-10">
<%= subjects.map(&:lineage_name).join(" & ") %>
</div>
</div>
<div class="row">
<div class="col-sm-2" style="width: 100px;">
<strong> Content: </strong>
</div>
<div class="row">
<div class="col-sm-2" style="width: 100px;">
<strong> Content: </strong>
</div>
<div class="col-sm-10">
<%= raw content %>
</div>
<div class="col-sm-10">
<%= raw content %>
</div>
</div>
<div class="row">
<div class="col-sm-10"> </div>
@ -54,9 +54,9 @@
<%= button_tag "Search", class: "btn btn-primary", data: { action: "click->document#search" } %>
</div>
</div>
<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>
@ -64,111 +64,39 @@
<th class="bg-light"> </th>
</thead>
<tbody id="documentIndexTable">
</tbody>
<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>
<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="modalDocumentSearchTable"> </tbody>
</table>
</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>
<div class="row-flex">
<div class="annot-header">
<h5> Annotations </h5>
</div>
<div class="annot-header"> <h5> Annotations </h5> </div>
<div class="">
<% doctrine.annotations.order(rank: :asc).each do |annotation| %>
<% 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 %>
<% annotated_documents_title = [] %>
<% annotation.documents.each do |annotated_document| %>
<% ad_title = annotated_document.short_title || annotated_document.title %>
<% 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(", ") %>
<% end %>
<% 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>
<% 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 %>
<% annotated_documents_title = [] %>
<% annotation.documents.each do |annotated_document| %>
<% ad_title = annotated_document.short_title || annotated_document.title %>
<% 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(", ") %>
<% end %>
<%= raw [document_title, annotation.document.reference_number, date_or_year, annotation.phil_rep, annotated_documents_title].reject(&:blank?).join(', ').html_safe %>
<%= raw citing_document_title %>
</p>
</div>
<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>
</div>
</div>
@ -185,13 +113,11 @@
</div>
<hr/>
<% 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 %>
</div>
<div class="row">
<%= render AnnotationMarksModalFormComponent.new(current_user: current_user) %>
</div>
</div>
</div>

2
app/components/document_index_table_component.rb

@ -7,7 +7,7 @@ class DocumentIndexTableComponent < BaseComponent
@opts = opts
end
delegate :reference_number, to: :search_result
delegate :clean_reference_number, to: :search_result
delegate :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">
<td> <%= reference_number %> </td>
<td> <%= clean_reference_number %> </td>
<td> <%= short_title || title %> </td>
<td> <%= date_or_year %> </td>
</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 " %>
</button>
</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>
</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 " %>
</button>
</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>
</li>

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

@ -16,7 +16,7 @@ module Api
attrs = resource_params.to_unsafe_h.deep_symbolize_keys
subject_ids = attrs.delete(:subject_ids)
@annotation = @jurisprudence.annotations.new(attrs)
@annotation = @doctrine.annotations.new(attrs)
if @annotation.save
@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
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 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
with(:year, search_params[:year].to_i) if search_params[:year].present?

5
app/controllers/api/subjects_controller.rb

@ -14,8 +14,7 @@ module Api
private
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

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?
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 :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 StimulusReflex from 'stimulus_reflex'
import { Controller } from 'stimulus';
import StimulusReflex from 'stimulus_reflex';
import $ from 'jquery';
import { end } from '@popperjs/core'
require("select2/dist/css/select2")
require("select2-bootstrap-theme/dist/select2-bootstrap")
require("selectize/dist/js/selectize.min");
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";
/* 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'
export default class extends ApplicationController {
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 () {
var $this = this
$.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") })
}
}

54
app/javascript/controllers/selectize_controller.js

@ -3,60 +3,82 @@ import ApplicationController from './application_controller'
export default class extends ApplicationController {
connect() {
super.connect()
var $this = this
var default_opts = {
plugins: ['restore_on_backspace', 'remove_button'],
searchField: ['text', 'optgroup'],
valueField: "id",
allowEmptyOption: false,
closeAfterSelect: true,
showEmptyOptionInDropdown: true,
emptyOptionLabel: true,
hideSelected: true,
placeholder: "Please Select"
}
$(".default-selectize").selectize(default_opts)
$(".default-selectize").selectize(default_opts);
var $doctrine_content = $("#doctrineModal").find("input[name='content']")
var $trix_content = $("#doctrineModal").find(".trix-content")
var $doctrine_content = $("#doctrineModal").find("input[name='content']");
var $trix_content = $("#doctrineModal").find(".trix-content");
var doctrine_content_suggestions_opts = {
onChange: function (value) {
if(value === null || value === undefined || value === "") {
$doctrine_content.val("")
$trix_content.val("")
$doctrine_content.val("");
$trix_content.val("");
} else {
$doctrine_content.val(value.text())
$trix_content.val(value)
$.get("/api/doctrines/" + value + ".json", {}, function (doctrine, status) {
if (status === "success") {
$doctrine_content.val(doctrine.content);
$trix_content.val(doctrine.content);
}
});
}
}
};
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) {
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) {
$selectize[0].selectize.clearOptions();
if ($selectize.length) $selectize[0].selectize.clearOptions();
} else {
$.get("/api/doctrines.json", { subject_ids: value }, function(data, status) {
if (status === "success") {
$.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))
$("#doctine_content_suggestions").selectize($.extend(doctrine_content_suggestions_opts, default_opts))
var $subject_ids_selectize = $(".subject-ids-selectize").selectize($.extend(subject_ids_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()
}
load_roots() {
this.stimulate("SubjectsReflex#load_roots")
renderSidenavAccordion () {
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/css/all.min";
import "moment";
import "select2";
import "chosen-js";
import 'trix/dist/trix.css';
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
end
def citing_document_ids
documents.map(&:id)
end
searchable do
integer :document_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
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 })
end

4
app/reflexes/subjects_reflex.rb

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

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

@ -1,4 +1,4 @@
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].join(" - ")
json.text subject.lineage_name
end

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

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

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

@ -1,6 +1,6 @@
<div class="card mt-1 g-3">
<div class="card-header mt-1 mb-2 col-sm-12">
<table class="table table-borderless">
<div class="card-header mb-0 col-sm-12">
<table class="table table-borderless mb-0">
<tbody>
<tr>
<td class="text-start" style="width: 160px;"> Reference Number: </td>
@ -17,14 +17,10 @@
</table>
</div>
<div class="card-body">
<div class="card-body pt-0">
<div class="row">
<div class="d-flex justify-content-end p-3">
<a class="btn btn-sm btn-primary" 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 class="d-flex justify-content-end p-2">
<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>

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

@ -1,5 +1,3 @@
<div class="card mt-1 g-3">
<div class="container p-2 card-header">
<div class="row">
@ -55,10 +53,10 @@
<div class="tab-pane fade show active" id="analysisTabContent" role="tabpanel" aria-labelledby="home-tab">
<div class="row">
<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 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>

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

Loading…
Cancel
Save