From 5685bc82943e15acf7770a73c31adb2dbb4743b8 Mon Sep 17 00:00:00 2001 From: Tomasz Subik Date: Fri, 19 Jul 2019 12:36:08 +0200 Subject: [PATCH 01/14] add documents --- app/models/document.rb | 17 ++++++++++++++ db/migrate/20190719102422_create_documents.rb | 13 +++++++++++ db/schema.rb | 14 +++++++++++- spec/factories/documents.rb | 22 +++++++++++++++++++ spec/models/document_spec.rb | 22 +++++++++++++++++++ 5 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 app/models/document.rb create mode 100644 db/migrate/20190719102422_create_documents.rb create mode 100644 spec/factories/documents.rb create mode 100644 spec/models/document_spec.rb diff --git a/app/models/document.rb b/app/models/document.rb new file mode 100644 index 000000000..a4d6e2dbe --- /dev/null +++ b/app/models/document.rb @@ -0,0 +1,17 @@ +# == Schema Information +# +# Table name: documents +# +# id :bigint not null, primary key +# name :string +# external_url :text +# language :string +# last_verified_on :date +# documentable_type :string +# documentable_id :bigint +# created_at :datetime not null +# updated_at :datetime not null +# + +class Document < ApplicationRecord +end diff --git a/db/migrate/20190719102422_create_documents.rb b/db/migrate/20190719102422_create_documents.rb new file mode 100644 index 000000000..00ea15d15 --- /dev/null +++ b/db/migrate/20190719102422_create_documents.rb @@ -0,0 +1,13 @@ +class CreateDocuments < ActiveRecord::Migration[5.2] + def change + create_table :documents do |t| + t.string :name + t.text :external_url + t.string :language + t.date :last_verified_on + t.references :documentable, polymorphic: true, index: true + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index d403af44a..250287bae 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_07_16_113250) do +ActiveRecord::Schema.define(version: 2019_07_19_102422) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -80,6 +80,18 @@ t.index ["sector_id"], name: "index_cp_benchmarks_on_sector_id" end + create_table "documents", force: :cascade do |t| + t.string "name" + t.text "external_url" + t.string "language" + t.date "last_verified_on" + t.string "documentable_type" + t.bigint "documentable_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["documentable_type", "documentable_id"], name: "index_documents_on_documentable_type_and_documentable_id" + end + create_table "legislations", force: :cascade do |t| t.string "title" t.text "description" diff --git a/spec/factories/documents.rb b/spec/factories/documents.rb new file mode 100644 index 000000000..c92962223 --- /dev/null +++ b/spec/factories/documents.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: documents +# +# id :bigint not null, primary key +# name :string +# external_url :text +# language :string +# last_verified_on :date +# documentable_type :string +# documentable_id :bigint +# created_at :datetime not null +# updated_at :datetime not null +# + +FactoryBot.define do + factory :document do + name { 'Cool document' } + language { 'en' } + last_verified_on { 10.days.ago } + end +end diff --git a/spec/models/document_spec.rb b/spec/models/document_spec.rb new file mode 100644 index 000000000..51100d9fd --- /dev/null +++ b/spec/models/document_spec.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: documents +# +# id :bigint not null, primary key +# name :string +# external_url :text +# language :string +# last_verified_on :date +# documentable_type :string +# documentable_id :bigint +# created_at :datetime not null +# updated_at :datetime not null +# + +require 'rails_helper' + +RSpec.describe Document, type: :model do + subject { build(:document) } + + it { is_expected.to be_valid } +end From 0b6b6de199e50f2de6b2c787875172511c65cb42 Mon Sep 17 00:00:00 2001 From: Tomasz Subik Date: Fri, 19 Jul 2019 14:28:02 +0200 Subject: [PATCH 02/14] add active storage, document specs --- app/models/document.rb | 15 ++++++- app/validators/attached_validator.rb | 5 +++ app/validators/url_validator.rb | 12 ++++++ db/migrate/20190719102422_create_documents.rb | 3 +- ...te_active_storage_tables.active_storage.rb | 27 ++++++++++++ db/schema.rb | 27 +++++++++++- spec/factories/documents.rb | 11 ++++- spec/models/document_spec.rb | 40 +++++++++++++++++- spec/rails_helper.rb | 4 +- spec/support/fixtures/files/test.pdf | Bin 0 -> 100609 bytes spec/support/test_files.rb | 10 +++++ 11 files changed, 145 insertions(+), 9 deletions(-) create mode 100644 app/validators/attached_validator.rb create mode 100644 app/validators/url_validator.rb create mode 100644 db/migrate/20190719104815_create_active_storage_tables.active_storage.rb create mode 100644 spec/support/fixtures/files/test.pdf create mode 100644 spec/support/test_files.rb diff --git a/app/models/document.rb b/app/models/document.rb index a4d6e2dbe..ffdfcca11 100644 --- a/app/models/document.rb +++ b/app/models/document.rb @@ -3,7 +3,8 @@ # Table name: documents # # id :bigint not null, primary key -# name :string +# name :string not null +# type :string not null # external_url :text # language :string # last_verified_on :date @@ -14,4 +15,16 @@ # class Document < ApplicationRecord + self.inheritance_column = nil + + has_one_attached :file + + TYPES = %w[uploaded external].freeze + + enum type: array_to_enum_hash(TYPES) + + validates :external_url, url: true, presence: true, if: :external? + validates :file, attached: true, if: :uploaded? + + validates_presence_of :name, :type end diff --git a/app/validators/attached_validator.rb b/app/validators/attached_validator.rb new file mode 100644 index 000000000..eb4829cfd --- /dev/null +++ b/app/validators/attached_validator.rb @@ -0,0 +1,5 @@ +class AttachedValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + record.errors.add(attribute, :attached, options) unless value.attached? + end +end diff --git a/app/validators/url_validator.rb b/app/validators/url_validator.rb new file mode 100644 index 000000000..a40b31c3a --- /dev/null +++ b/app/validators/url_validator.rb @@ -0,0 +1,12 @@ +class UrlValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + return unless value.present? + + record.errors[attribute] << (options[:message] || 'must be a valid URL') unless url_valid?(value) + end + + def url_valid?(url) + url = URI.parse(url) rescue false + url.kind_of?(URI::HTTP) || url.kind_of?(URI::HTTPS) + end +end diff --git a/db/migrate/20190719102422_create_documents.rb b/db/migrate/20190719102422_create_documents.rb index 00ea15d15..6a1e448dc 100644 --- a/db/migrate/20190719102422_create_documents.rb +++ b/db/migrate/20190719102422_create_documents.rb @@ -1,7 +1,8 @@ class CreateDocuments < ActiveRecord::Migration[5.2] def change create_table :documents do |t| - t.string :name + t.string :name, null: false + t.string :type, null: false t.text :external_url t.string :language t.date :last_verified_on diff --git a/db/migrate/20190719104815_create_active_storage_tables.active_storage.rb b/db/migrate/20190719104815_create_active_storage_tables.active_storage.rb new file mode 100644 index 000000000..0b2ce257c --- /dev/null +++ b/db/migrate/20190719104815_create_active_storage_tables.active_storage.rb @@ -0,0 +1,27 @@ +# This migration comes from active_storage (originally 20170806125915) +class CreateActiveStorageTables < ActiveRecord::Migration[5.2] + def change + create_table :active_storage_blobs do |t| + t.string :key, null: false + t.string :filename, null: false + t.string :content_type + t.text :metadata + t.bigint :byte_size, null: false + t.string :checksum, null: false + t.datetime :created_at, null: false + + t.index [ :key ], unique: true + end + + create_table :active_storage_attachments do |t| + t.string :name, null: false + t.references :record, null: false, polymorphic: true, index: false + t.references :blob, null: false + + t.datetime :created_at, null: false + + t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true + t.foreign_key :active_storage_blobs, column: :blob_id + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 250287bae..8779ee759 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_07_19_102422) do +ActiveRecord::Schema.define(version: 2019_07_19_104815) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -29,6 +29,27 @@ t.index ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id" end + create_table "active_storage_attachments", force: :cascade do |t| + t.string "name", null: false + t.string "record_type", null: false + t.bigint "record_id", null: false + t.bigint "blob_id", null: false + t.datetime "created_at", null: false + t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" + t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true + end + + create_table "active_storage_blobs", force: :cascade do |t| + t.string "key", null: false + t.string "filename", null: false + t.string "content_type" + t.text "metadata" + t.bigint "byte_size", null: false + t.string "checksum", null: false + t.datetime "created_at", null: false + t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true + end + create_table "admin_users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false @@ -81,7 +102,8 @@ end create_table "documents", force: :cascade do |t| - t.string "name" + t.string "name", null: false + t.string "type", null: false t.text "external_url" t.string "language" t.date "last_verified_on" @@ -189,6 +211,7 @@ t.index ["name", "type"], name: "index_tags_on_name_and_type", unique: true end + add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "companies", "locations" add_foreign_key "companies", "locations", column: "headquarter_location_id" add_foreign_key "companies", "sectors" diff --git a/spec/factories/documents.rb b/spec/factories/documents.rb index c92962223..7ca072220 100644 --- a/spec/factories/documents.rb +++ b/spec/factories/documents.rb @@ -3,7 +3,8 @@ # Table name: documents # # id :bigint not null, primary key -# name :string +# name :string not null +# type :string not null # external_url :text # language :string # last_verified_on :date @@ -17,6 +18,14 @@ factory :document do name { 'Cool document' } language { 'en' } + type { 'external' } + external_url { 'https://test.com' } last_verified_on { 10.days.ago } + + factory :document_uploaded do + type { 'uploaded' } + file { TestFiles.pdf } + external_url { nil } + end end end diff --git a/spec/models/document_spec.rb b/spec/models/document_spec.rb index 51100d9fd..fd1013a34 100644 --- a/spec/models/document_spec.rb +++ b/spec/models/document_spec.rb @@ -3,7 +3,8 @@ # Table name: documents # # id :bigint not null, primary key -# name :string +# name :string not null +# type :string not null # external_url :text # language :string # last_verified_on :date @@ -18,5 +19,40 @@ RSpec.describe Document, type: :model do subject { build(:document) } - it { is_expected.to be_valid } + it 'should not be valid without name' do + subject.name = nil + expect(subject).to have(1).errors_on(:name) + end + + it 'should not be valid without type' do + subject.type = nil + expect(subject).to have(1).errors_on(:type) + end + + describe 'uploaded' do + subject { FactoryBot.build(:document_uploaded) } + + it { is_expected.to be_valid } + + it 'should be invalid without file' do + subject.file.purge + expect(subject).to have(1).errors_on(:file) + end + end + + describe 'external' do + subject { FactoryBot.build(:document) } + + it { is_expected.to be_valid } + + it 'should not be valid without external_url' do + subject.external_url = nil + expect(subject).to have(1).errors_on(:external_url) + end + + it 'should be invalid if external_url is not a valid URL' do + subject.external_url = 'not a valid external_url' + expect(subject).to have(1).errors_on(:external_url) + end + end end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 541104d63..6593b5756 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -22,7 +22,7 @@ # directory. Alternatively, in the individual `*_spec.rb` files, manually # require only the support files necessary. # -# Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f } +Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f } # Checks for pending migrations and applies them before tests are run. # If you are not using ActiveRecord, you can remove these lines. @@ -38,7 +38,7 @@ config.render_views # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures - config.fixture_path = "#{::Rails.root}/spec/fixtures" + # config.fixture_path = "#{::Rails.root}/spec/fixtures" # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false diff --git a/spec/support/fixtures/files/test.pdf b/spec/support/fixtures/files/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8fc9b28bc9049df5f204eabb892ee4e99b2b6bc4 GIT binary patch literal 100609 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 Date: Fri, 19 Jul 2019 15:18:17 +0200 Subject: [PATCH 03/14] add documents to litigations v1 --- app/admin/litigations.rb | 12 +++++++++++- app/decorators/litigation_decorator.rb | 8 ++++++++ app/models/document.rb | 26 ++++++++++++++++++++++++-- app/models/litigation.rb | 3 +++ app/validators/url_validator.rb | 2 +- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/app/admin/litigations.rb b/app/admin/litigations.rb index b8d7717d5..1021767bf 100644 --- a/app/admin/litigations.rb +++ b/app/admin/litigations.rb @@ -3,7 +3,10 @@ decorate_with LitigationDecorator - permit_params :title, :location_id, :document_type, :summary, :core_objective + permit_params :title, :location_id, :document_type, :summary, :core_objective, + documents_attributes: [ + :id, :_destroy, :name, :external_url, :file + ] filter :title_contains filter :summary_contains @@ -36,6 +39,7 @@ row :core_objective row :created_at row :updated_at + list_row 'Documents', :document_list end end @@ -60,6 +64,12 @@ f.input :document_type, as: :select, collection: array_to_select_collection(Litigation::DOCUMENT_TYPES) f.input :summary, as: :trix f.input :core_objective, as: :trix + + f.has_many :documents, allow_destroy: true, new_record: true do |d| + d.input :file, as: :file + d.input :external_url, label: 'Or provide external url' + d.input :name + end end f.actions diff --git a/app/decorators/litigation_decorator.rb b/app/decorators/litigation_decorator.rb index 11c933482..668e01af1 100644 --- a/app/decorators/litigation_decorator.rb +++ b/app/decorators/litigation_decorator.rb @@ -16,4 +16,12 @@ def summary def core_objective model.core_objective.html_safe end + + def document_list + return [] if model.documents.empty? + + model.documents.map do |document| + h.link_to document.name, document.url, target: '_blank' + end + end end diff --git a/app/models/document.rb b/app/models/document.rb index ffdfcca11..07ba54c5e 100644 --- a/app/models/document.rb +++ b/app/models/document.rb @@ -20,11 +20,33 @@ class Document < ApplicationRecord has_one_attached :file TYPES = %w[uploaded external].freeze - enum type: array_to_enum_hash(TYPES) + belongs_to :documentable, polymorphic: true + + before_validation :set_type + validates :external_url, url: true, presence: true, if: :external? validates :file, attached: true, if: :uploaded? - validates_presence_of :name, :type + validates_presence_of :name + + def url + return file_url if uploaded? + + external_url + end + + private + + def file_url + return unless file.attached? + + Rails.application.routes.url_helpers.polymorphic_url(file, only_path: true) + end + + def set_type + self.type = external_url.present? ? 'external' : 'uploaded' + file.purge if external? + end end diff --git a/app/models/litigation.rb b/app/models/litigation.rb index 9ecd61c25..2eeaa116c 100644 --- a/app/models/litigation.rb +++ b/app/models/litigation.rb @@ -26,6 +26,9 @@ class Litigation < ApplicationRecord belongs_to :location has_many :litigation_sides + has_many :documents, as: :documentable, dependent: :destroy + + accepts_nested_attributes_for :documents, allow_destroy: true validates_presence_of :title, :slug, :document_type end diff --git a/app/validators/url_validator.rb b/app/validators/url_validator.rb index a40b31c3a..e42930489 100644 --- a/app/validators/url_validator.rb +++ b/app/validators/url_validator.rb @@ -7,6 +7,6 @@ def validate_each(record, attribute, value) def url_valid?(url) url = URI.parse(url) rescue false - url.kind_of?(URI::HTTP) || url.kind_of?(URI::HTTPS) + url.is_a?(URI::HTTP) || url.is_a?(URI::HTTPS) end end From 43f711151f51a194e6299b76fa1c7611f36c6085 Mon Sep 17 00:00:00 2001 From: Tomasz Subik Date: Fri, 19 Jul 2019 15:30:35 +0200 Subject: [PATCH 04/14] attached validator message --- config/locales/en.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/locales/en.yml b/config/locales/en.yml index 46c771a03..1f5ff9386 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -34,6 +34,9 @@ en: edit_model: 'Edit' delete_model: 'Delete' activerecord: + errors: + messages: + attached: is not attached attributes: company: isin: 'ISIN' From 118420777d8d1cdcb5063f20577b20b4d24f8323 Mon Sep 17 00:00:00 2001 From: Tomasz Subik Date: Fri, 19 Jul 2019 16:51:41 +0200 Subject: [PATCH 05/14] dynamic document list --- app/admin/litigations.rb | 20 +---------- app/assets/stylesheets/active_admin.scss | 12 +++++++ .../controllers/document_list_controller.js | 33 +++++++++++++++++++ app/views/admin/documents/_fields.html.erb | 10 ++++++ app/views/admin/documents/_list.html.erb | 15 +++++++++ app/views/admin/litigations/_form.html.erb | 19 +++++++++++ 6 files changed, 90 insertions(+), 19 deletions(-) create mode 100644 app/javascript/controllers/document_list_controller.js create mode 100644 app/views/admin/documents/_fields.html.erb create mode 100644 app/views/admin/documents/_list.html.erb create mode 100644 app/views/admin/litigations/_form.html.erb diff --git a/app/admin/litigations.rb b/app/admin/litigations.rb index 1021767bf..55f92a7fe 100644 --- a/app/admin/litigations.rb +++ b/app/admin/litigations.rb @@ -55,25 +55,7 @@ end end - form do |f| - f.semantic_errors(*f.object.errors.keys) - - f.inputs do - f.input :title - f.input :location - f.input :document_type, as: :select, collection: array_to_select_collection(Litigation::DOCUMENT_TYPES) - f.input :summary, as: :trix - f.input :core_objective, as: :trix - - f.has_many :documents, allow_destroy: true, new_record: true do |d| - d.input :file, as: :file - d.input :external_url, label: 'Or provide external url' - d.input :name - end - end - - f.actions - end + form partial: 'form' controller do def find_resource diff --git a/app/assets/stylesheets/active_admin.scss b/app/assets/stylesheets/active_admin.scss index a0226fa34..248d36a4a 100644 --- a/app/assets/stylesheets/active_admin.scss +++ b/app/assets/stylesheets/active_admin.scss @@ -128,3 +128,15 @@ form { } } } + +// Documents + +.inline-fields { + display: flex; + justify-content: space-around; + align-items: center; + + .flex-grow-1 { + flex-grow: 1; + } +} diff --git a/app/javascript/controllers/document_list_controller.js b/app/javascript/controllers/document_list_controller.js new file mode 100644 index 000000000..0cb3a3e11 --- /dev/null +++ b/app/javascript/controllers/document_list_controller.js @@ -0,0 +1,33 @@ +import { Controller } from "stimulus"; + +export default class extends Controller { + static targets = [ "links", "template" ] + + connect() { + this.wrapperClass = this.data.get("wrapperClass") || "nested-fields"; + console.log(this.wrapperClass); + } + + add_association(event) { + event.preventDefault(); + + var content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, new Date().getTime()); + this.linksTarget.insertAdjacentHTML('beforebegin', content); + } + + remove_association(event) { + event.preventDefault(); + + let wrapper = event.target.closest("." + this.wrapperClass); + + // New records are simply removed from the page + if (wrapper.dataset.newRecord == "true") { + wrapper.remove(); + + // Existing records are hidden and flagged for deletion + } else { + wrapper.querySelector("input[name*='_destroy']").value = 1; + wrapper.style.display = 'none'; + } + } +} diff --git a/app/views/admin/documents/_fields.html.erb b/app/views/admin/documents/_fields.html.erb new file mode 100644 index 000000000..2d6a7a827 --- /dev/null +++ b/app/views/admin/documents/_fields.html.erb @@ -0,0 +1,10 @@ +<% is_new_record = form.object.new_record? %> + +<%= content_tag :div, class: "panel nested-fields inline-fields", data: { new_record: is_new_record } do %> + <%= form.input :file, as: :file %> + <%= form.input :external_url, as: :string, label: 'Or provide external url', wrapper_html: { class: 'flex-grow-1' } %> + <%= form.input :name, wrapper_html: { class: 'flex-grow-1' } %> + + <%= link_to "Remove", "#", class: 'button', data: { action: "click->document-list#remove_association" } %> + <%= form.hidden_field :_destroy %> +<% end %> diff --git a/app/views/admin/documents/_list.html.erb b/app/views/admin/documents/_list.html.erb new file mode 100644 index 000000000..c27d70a87 --- /dev/null +++ b/app/views/admin/documents/_list.html.erb @@ -0,0 +1,15 @@ +
+ + + <%= form.semantic_fields_for :documents do |document| %> + <%= render "admin/documents/fields", form: document %> + <% end %> + +
+ <%= link_to "Add Document", "#", class: 'button', data: { action: "click->document-list#add_association" } %> +
+
diff --git a/app/views/admin/litigations/_form.html.erb b/app/views/admin/litigations/_form.html.erb new file mode 100644 index 000000000..b1d2e29dc --- /dev/null +++ b/app/views/admin/litigations/_form.html.erb @@ -0,0 +1,19 @@ +<%= semantic_form_for [:admin, resource], builder: ActiveAdmin::FormBuilder do |f| %> + <%= f.semantic_errors(*f.object.errors.keys) %> + <%= f.inputs 'Step Details' do %> + <%= f.input :title %> + <%= f.input :location %> + <%= f.input :document_type, as: :select, collection: array_to_select_collection(Litigation::DOCUMENT_TYPES) %> + <%= f.input :summary, as: :trix %> + <%= f.input :core_objective, as: :trix %> + <% end %> + + <%= f.inputs 'Documents' do %> + <%= render 'admin/documents/list', form: f %> + <% end %> + + <%= f.actions do %> + <%= f.action :submit %> + <%= f.cancel_link :back %> + <% end %> +<% end %> From 5d3668a96c39565a1c2bb09c840abf3b723de5c3 Mon Sep 17 00:00:00 2001 From: Tomasz Subik Date: Fri, 19 Jul 2019 17:16:07 +0200 Subject: [PATCH 06/14] add documents view --- app/admin/documents.rb | 20 ++++++++++++++++++++ app/decorators/document_decorator.rb | 17 +++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 app/admin/documents.rb create mode 100644 app/decorators/document_decorator.rb diff --git a/app/admin/documents.rb b/app/admin/documents.rb new file mode 100644 index 000000000..767b37da5 --- /dev/null +++ b/app/admin/documents.rb @@ -0,0 +1,20 @@ +ActiveAdmin.register Document do + menu priority: 3 + + decorate_with DocumentDecorator + + filter :name_contains + filter :documentable_type, label: 'Attached to' + + config.batch_actions = false + + actions :all, except: [:new, :edit, :create, :update] + + index do + column :name_link + column :open_link + column 'Attached To', :documentable + column :last_verified_on + actions + end +end diff --git a/app/decorators/document_decorator.rb b/app/decorators/document_decorator.rb new file mode 100644 index 000000000..838cb7360 --- /dev/null +++ b/app/decorators/document_decorator.rb @@ -0,0 +1,17 @@ +class DocumentDecorator < Draper::Decorator + delegate_all + + def name_link + h.link_to model.name, h.admin_document_path(model) + end + + def open_link + h.link_to model.name, model.url, target: '_blank' + end + + def last_verified_on + return 'N/A' if model.uploaded? + + model.last_verified_on + end +end From 1e945bdf95eb3abbc816448cd17de2597a620c23 Mon Sep 17 00:00:00 2001 From: Tomasz Subik Date: Mon, 22 Jul 2019 11:32:43 +0200 Subject: [PATCH 07/14] two templated for document list --- .../controllers/dependent_input_controller.js | 2 +- .../controllers/document_list_controller.js | 23 +++++++++++-------- app/views/admin/documents/_fields.html.erb | 14 +++++++---- app/views/admin/documents/_list.html.erb | 13 ++++++++--- 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/app/javascript/controllers/dependent_input_controller.js b/app/javascript/controllers/dependent_input_controller.js index 56841c321..432595ec5 100644 --- a/app/javascript/controllers/dependent_input_controller.js +++ b/app/javascript/controllers/dependent_input_controller.js @@ -1,4 +1,4 @@ -import { Controller } from "stimulus"; +import { Controller } from 'stimulus'; export default class extends Controller { connect() { diff --git a/app/javascript/controllers/document_list_controller.js b/app/javascript/controllers/document_list_controller.js index 0cb3a3e11..cf23b470f 100644 --- a/app/javascript/controllers/document_list_controller.js +++ b/app/javascript/controllers/document_list_controller.js @@ -1,32 +1,35 @@ -import { Controller } from "stimulus"; +import { Controller } from 'stimulus'; export default class extends Controller { - static targets = [ "links", "template" ] + static targets = [ 'links', 'templateExternal', 'templateUploaded'] connect() { - this.wrapperClass = this.data.get("wrapperClass") || "nested-fields"; - console.log(this.wrapperClass); + this.wrapperClass = this.data.get('wrapperClass') || 'nested-fields'; } - add_association(event) { + addRecord(event) { event.preventDefault(); - var content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, new Date().getTime()); + const templateName = event.target.dataset['template']; + const content = this[`template${templateName}Target`] + .innerHTML + .replace(/NEW_RECORD/g, new Date().getTime()); + this.linksTarget.insertAdjacentHTML('beforebegin', content); } - remove_association(event) { + removeRecord(event) { event.preventDefault(); - let wrapper = event.target.closest("." + this.wrapperClass); + const wrapper = event.target.closest('.' + this.wrapperClass); // New records are simply removed from the page - if (wrapper.dataset.newRecord == "true") { + if (wrapper.dataset.newRecord == 'true') { wrapper.remove(); // Existing records are hidden and flagged for deletion } else { - wrapper.querySelector("input[name*='_destroy']").value = 1; + wrapper.querySelector('input[name*="_destroy"]').value = 1; wrapper.style.display = 'none'; } } diff --git a/app/views/admin/documents/_fields.html.erb b/app/views/admin/documents/_fields.html.erb index 2d6a7a827..6b94af288 100644 --- a/app/views/admin/documents/_fields.html.erb +++ b/app/views/admin/documents/_fields.html.erb @@ -1,10 +1,16 @@ <% is_new_record = form.object.new_record? %> -<%= content_tag :div, class: "panel nested-fields inline-fields", data: { new_record: is_new_record } do %> - <%= form.input :file, as: :file %> - <%= form.input :external_url, as: :string, label: 'Or provide external url', wrapper_html: { class: 'flex-grow-1' } %> +<%= content_tag :div, class: "nested-fields inline-fields", data: { new_record: is_new_record } do %> + <%= form.input :type, as: :hidden %> +
+ <% if form.object.external? %> + <%= form.input :external_url, as: :string, label: 'Provide external url' %> + <% else %> + <%= form.input :file, as: :file %> + <% end %> +
<%= form.input :name, wrapper_html: { class: 'flex-grow-1' } %> - <%= link_to "Remove", "#", class: 'button', data: { action: "click->document-list#remove_association" } %> + <%= link_to "Remove", "#", class: 'button', data: { action: "click->document-list#removeRecord" } %> <%= form.hidden_field :_destroy %> <% end %> diff --git a/app/views/admin/documents/_list.html.erb b/app/views/admin/documents/_list.html.erb index c27d70a87..1d2956cf6 100644 --- a/app/views/admin/documents/_list.html.erb +++ b/app/views/admin/documents/_list.html.erb @@ -1,6 +1,12 @@
-