geoblacklight_admin 0.6.3 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/app/assets/stylesheets/geoblacklight_admin/_core.scss +2 -1
  4. data/app/assets/stylesheets/geoblacklight_admin/modules/_icons.scss +9 -0
  5. data/app/assets/stylesheets/geoblacklight_admin/modules/_pagy.scss +7 -0
  6. data/app/controllers/admin/document_data_dictionaries_controller.rb +126 -0
  7. data/app/controllers/admin/document_data_dictionary_entries_controller.rb +124 -0
  8. data/app/controllers/admin/document_distributions_controller.rb +0 -38
  9. data/app/controllers/admin/import_distributions_controller.rb +126 -0
  10. data/app/controllers/concerns/blacklight/catalog.rb +373 -0
  11. data/app/helpers/facets_helper.rb +19 -0
  12. data/app/javascript/index.js +1 -1
  13. data/app/jobs/import_distributions_run_job.rb +32 -0
  14. data/app/jobs/import_document_distribution_job.rb +23 -0
  15. data/app/models/document.rb +5 -0
  16. data/app/models/document_data_dictionary/csv_header_validator.rb +30 -0
  17. data/app/models/document_data_dictionary.rb +39 -0
  18. data/app/models/document_data_dictionary_entry.rb +9 -0
  19. data/app/models/import_distribution/csv_header_validator.rb +32 -0
  20. data/app/models/import_distribution.rb +55 -0
  21. data/app/models/import_distribution_state_machine.rb +14 -0
  22. data/app/models/import_distribution_transition.rb +26 -0
  23. data/app/models/import_document_distribution.rb +25 -0
  24. data/app/models/import_document_distribution_state_machine.rb +13 -0
  25. data/app/models/import_document_distribution_transition.rb +19 -0
  26. data/app/views/admin/document_data_dictionaries/_data_dictionaries_table.html.erb +40 -0
  27. data/app/views/admin/document_data_dictionaries/_document_data_dictionary.html.erb +37 -0
  28. data/app/views/admin/document_data_dictionaries/_document_data_dictionary.json.jbuilder +2 -0
  29. data/app/views/admin/document_data_dictionaries/_form.html.erb +17 -0
  30. data/app/views/admin/document_data_dictionaries/edit.html.erb +12 -0
  31. data/app/views/admin/document_data_dictionaries/index.html.erb +45 -0
  32. data/app/views/admin/document_data_dictionaries/index.json.jbuilder +1 -0
  33. data/app/views/admin/document_data_dictionaries/new.html.erb +78 -0
  34. data/app/views/admin/document_data_dictionaries/show.html.erb +78 -0
  35. data/app/views/admin/document_data_dictionaries/show.json.jbuilder +1 -0
  36. data/app/views/admin/document_data_dictionary_entries/_form.html.erb +19 -0
  37. data/app/views/admin/document_data_dictionary_entries/edit.html.erb +12 -0
  38. data/app/views/admin/document_data_dictionary_entries/new.html.erb +16 -0
  39. data/app/views/admin/document_distributions/index.html.erb +2 -2
  40. data/app/views/admin/documents/_form_nav.html.erb +4 -0
  41. data/app/views/admin/import_distributions/_form.html.erb +21 -0
  42. data/app/views/admin/import_distributions/_import_distribution.json.jbuilder +5 -0
  43. data/app/views/admin/import_distributions/_show_failed_tab.html.erb +36 -0
  44. data/app/views/admin/import_distributions/_show_success_tab.html.erb +35 -0
  45. data/app/views/admin/import_distributions/edit.html.erb +8 -0
  46. data/app/views/admin/import_distributions/index.html.erb +58 -0
  47. data/app/views/admin/import_distributions/index.json.jbuilder +3 -0
  48. data/app/views/admin/import_distributions/new.html.erb +7 -0
  49. data/app/views/admin/import_distributions/show.html.erb +121 -0
  50. data/app/views/admin/import_distributions/show.json.jbuilder +3 -0
  51. data/app/views/admin/imports/index.html.erb +2 -2
  52. data/app/views/admin/shared/_navbar.html.erb +2 -2
  53. data/app/views/catalog/_facet_pagination.html.erb +6 -0
  54. data/app/views/catalog/_gbl_admin_data_dictionaries.html.erb +3 -0
  55. data/app/views/catalog/_paginate_compact.html.erb +9 -0
  56. data/app/views/catalog/_results_pagination.html.erb +9 -0
  57. data/app/views/catalog/_show_gbl_admin_data_dictionaries.html.erb +44 -0
  58. data/app/views/catalog/data_dictionaries.html.erb +12 -0
  59. data/db/migrate/20241204163117_create_document_data_dictionaries.rb +14 -0
  60. data/db/migrate/20241218174455_create_document_data_dictionary_entries.rb +17 -0
  61. data/db/migrate/20250113213655_import_distributions.rb +56 -0
  62. data/lib/generators/geoblacklight_admin/config_generator.rb +61 -4
  63. data/lib/generators/geoblacklight_admin/templates/btaa_sample_document_data_dictionary_entries.csv +9 -0
  64. data/lib/generators/geoblacklight_admin/templates/btaa_sample_document_distributions.csv +17 -0
  65. data/lib/generators/geoblacklight_admin/templates/config/initializers/pagy.rb +53 -83
  66. data/lib/geoblacklight_admin/engine.rb +1 -0
  67. data/lib/geoblacklight_admin/routes/data_dictionariesable.rb +17 -0
  68. data/lib/geoblacklight_admin/version.rb +1 -1
  69. metadata +61 -14
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ImportDocumentDistribution class
4
+ class ImportDocumentDistribution < ApplicationRecord
5
+ has_many :import_document_distribution_transitions, autosave: false, dependent: :destroy
6
+
7
+ include Statesman::Adapters::ActiveRecordQueries[
8
+ transition_class: ImportDocumentDistributionTransition,
9
+ initial_state: :queued
10
+ ]
11
+
12
+ def state_machine
13
+ @state_machine ||= ImportDocumentDistributionStateMachine.new(self, transition_class: ImportDocumentDistributionTransition)
14
+ end
15
+
16
+ def to_hash
17
+ {
18
+ friendlier_id: friendlier_id,
19
+ reference_type: ReferenceType.find_by(name: reference_type),
20
+ url: distribution_url,
21
+ label: label,
22
+ import_distribution_id: import_distribution_id
23
+ }
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ImportDocumentDistribution Statesman
4
+ class ImportDocumentDistributionStateMachine
5
+ include Statesman::Machine
6
+
7
+ state :queued, initial: true
8
+ state :success
9
+ state :failed
10
+
11
+ transition from: :queued, to: %i[success failed]
12
+ transition from: :failed, to: :success
13
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Add ImportDocumentDistribution Statesman Transitions
4
+ class ImportDocumentDistributionTransition < ApplicationRecord
5
+ include Statesman::Adapters::ActiveRecordTransition
6
+
7
+ belongs_to :import_document_distribution, inverse_of: :import_document_distribution_transitions
8
+
9
+ after_destroy :update_most_recent, if: :most_recent?
10
+
11
+ private
12
+
13
+ def update_most_recent
14
+ last_transition = import_document_distribution.import_document_distribution_transitions.order(:sort_key).last
15
+ return if last_transition.blank?
16
+
17
+ last_transition.update_column(:most_recent, true)
18
+ end
19
+ end
@@ -0,0 +1,40 @@
1
+ <div class="table-responsive">
2
+ <table class="table table-striped table-bordered sortable">
3
+ <thead class="thead-dark">
4
+ <tr>
5
+ <th>Name</th>
6
+ <th>Description</th>
7
+ <th>Staff Notes</th>
8
+ <th>Tags</th>
9
+ <th>Entries</th>
10
+ <th colspan="2">Actions</th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ <% document_data_dictionaries.each do |document_data_dictionary| %>
15
+ <tr>
16
+ <td><%= link_to(document_data_dictionary.name, admin_document_document_data_dictionary_path(document_data_dictionary.friendlier_id, document_data_dictionary)) %></td>
17
+ <td>
18
+ <%= document_data_dictionary.description %>
19
+ <span class="sr-only"><%= document_data_dictionary.inspect %></span>
20
+ </td>
21
+ <td>
22
+ <%= document_data_dictionary.staff_notes %>
23
+ </td>
24
+ <td>
25
+ <%= document_data_dictionary.tags %>
26
+ </td>
27
+ <td>
28
+ <%= link_to "#{document_data_dictionary.document_data_dictionary_entries.count} entries", admin_document_document_data_dictionary_path(document_data_dictionary.friendlier_id, document_data_dictionary) %>
29
+ </td>
30
+ <td>
31
+ <%= link_to 'Edit', edit_admin_document_document_data_dictionary_path(document_data_dictionary.friendlier_id, document_data_dictionary) %>
32
+ </td>
33
+ <td>
34
+ <%= link_to 'Destroy', admin_document_document_data_dictionary_path(document_data_dictionary.friendlier_id, document_data_dictionary), method: :delete, data: { confirm: 'Are you sure?' } %>
35
+ </td>
36
+ </tr>
37
+ <% end %>
38
+ </tbody>
39
+ </table>
40
+ </div>
@@ -0,0 +1,37 @@
1
+ <%- @page_title = "GBL♦Admin - Document - Data Dictionaries" %>
2
+
3
+ <div id="<%= dom_id document_data_dictionary %>">
4
+ <h2>
5
+ <%= document_data_dictionary.name %>
6
+ <%= link_to '~ Edit Data Dictionary', edit_admin_document_document_data_dictionary_path, { class: 'btn btn-primary float-right' } %>
7
+ </h2>
8
+
9
+ <table class="table table-bordered">
10
+ <thead class="thead-dark">
11
+ <tr>
12
+ <th class="header" style="width:300px;">Attribute</th>
13
+ <th class="header">Value</th>
14
+ </tr>
15
+ </thead>
16
+ <tr>
17
+ <th>Friendlier Id</th>
18
+ <td><%= document_data_dictionary.friendlier_id %></td>
19
+ </tr>
20
+ <tr>
21
+ <th>Name</th>
22
+ <td><%= document_data_dictionary.name %></td>
23
+ </tr>
24
+ <tr>
25
+ <th>Description</th>
26
+ <td><%= document_data_dictionary.description %></td>
27
+ </tr>
28
+ <tr>
29
+ <th>Staff Notes</th>
30
+ <td><%= document_data_dictionary.staff_notes %></td>
31
+ </tr>
32
+ <tr>
33
+ <th>Tags</th>
34
+ <td><%= document_data_dictionary.tags %></td>
35
+ </tr>
36
+ </table>
37
+ </div>
@@ -0,0 +1,2 @@
1
+ json.extract! document_data_dictionary, :id, :friendlier_id, :label, :type, :values, :definition, :definition_source, :parent_friendlier_id, :created_at, :updated_at
2
+ json.url document_data_dictionary_url(document_data_dictionary, format: :json)
@@ -0,0 +1,17 @@
1
+ <%= simple_form_for([:admin, @document, @document_data_dictionary]) do |f| %>
2
+ <%= f.error_notification %>
3
+ <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
4
+
5
+ <div class="form-inputs">
6
+ <%= f.input :friendlier_id, input_html: { value: @document.friendlier_id, readonly: true } %>
7
+ <%= f.input :name, input_html: { class: 'form-control', autofocus: true } %>
8
+ <%= f.input :description, input_html: { class: 'form-control' } %>
9
+ <%= f.input :staff_notes, input_html: { class: 'form-control' } %>
10
+ <%= f.input :tags, input_html: { class: "form-control mb-2", placeholder: "Comma-separated tags (Optional)", data: { controller: "taginput" } } %>
11
+ <%= f.file_field :csv_file, direct_upload: true %>
12
+ </div>
13
+
14
+ <div class="form-group mt-3">
15
+ <%= f.submit class: 'btn btn-primary' %>
16
+ </div>
17
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <% content_for :title, "Editing document data dictionary" %>
2
+
3
+ <h1>Editing document data dictionary</h1>
4
+
5
+ <%= render "form", document_data_dictionary: @document_data_dictionary %>
6
+
7
+ <br>
8
+
9
+ <div>
10
+ <%= link_to "Show this document data dictionary", admin_document_document_data_dictionary_path(@document, @document_data_dictionary) %> |
11
+ <%= link_to "Back to document data dictionaries", admin_document_document_data_dictionaries_path(@document) %>
12
+ </div>
@@ -0,0 +1,45 @@
1
+ <%- @page_title = "GBL♦Admin - Document - Data Dictionaries" %>
2
+
3
+ <div class="row mb-2">
4
+ <div class="col">
5
+ <h1 style="width:100%;">
6
+ Document &middot; Data Dictionaries
7
+
8
+ <%= link_to '+ New Data Dictionary', new_admin_document_document_data_dictionary_path, { class: 'btn btn-primary float-right' } %>
9
+ </h1>
10
+ <% if params[:document_id] %>
11
+ <h2 class='h3'>
12
+ <%= link_to(@document.title, admin_document_path(@document)) %>
13
+ &middot;
14
+ <%= @document_data_dictionaries.count %> data dictionaries
15
+ </h2>
16
+ <% else %>
17
+ <h2 class='h3'>Data Dictionaries</h2>
18
+ <% end %>
19
+
20
+ <% if @pagy %>
21
+ <h6>
22
+ <span class='float-left mt-3'>
23
+ <%== pagy_info(@pagy, 'data dictionaries'.pluralize(@pagy.count)) %>
24
+ </span>
25
+ <span class='float-right'>
26
+ <%== pagy_bootstrap_nav(@pagy) %>
27
+ </span>
28
+ </h6>
29
+ <% end %>
30
+
31
+ <%= render partial: 'data_dictionaries_table', locals: { document_data_dictionaries: @document_data_dictionaries } %>
32
+
33
+ <% if @pagy %>
34
+ <h6>
35
+ <span class='float-left mt-3'>
36
+ <%== pagy_info(@pagy, 'data dictionaries'.pluralize(@pagy.count)) %>
37
+ </span>
38
+ <span class='float-right'>
39
+ <%== pagy_bootstrap_nav(@pagy) %>
40
+ </span>
41
+ </h6>
42
+ <% end %>
43
+ </div>
44
+ </div>
45
+ </div>
@@ -0,0 +1 @@
1
+ json.array! @document_data_dictionaries, partial: "document_data_dictionaries/document_data_dictionary", as: :document_data_dictionary
@@ -0,0 +1,78 @@
1
+ <div class="row mb-2">
2
+ <div class="col">
3
+ <%= link_to "Back to document data dictionaries", admin_document_document_data_dictionaries_path(@document) %>
4
+
5
+ <h1 style="width:100%;">
6
+ <%= @document.title %> &middot; New Data Dictionary
7
+ </h1>
8
+ </div>
9
+ </div>
10
+
11
+ <div class="row">
12
+ <div class="col-5">
13
+ <%= render "form", document_data_dictionary: @document_data_dictionary %>
14
+ </div>
15
+
16
+ <div class="col-6">
17
+ <h4>Example Data Dictionary CSV File</h4>
18
+ <table class="table table-bordered">
19
+ <thead>
20
+ <tr>
21
+ <th>friendlier_id*</th>
22
+ <th>field_name*</th>
23
+ <th>field_type</th>
24
+ <th>values</th>
25
+ <th>definition</th>
26
+ <th>definition_source</th>
27
+ <th>parent_field_name</th>
28
+ </tr>
29
+ </thead>
30
+ <tbody>
31
+ <tr>
32
+ <td>999-0010a</td>
33
+ <td>Institution</td>
34
+ <td>string</td>
35
+ <td>University of Minnesota</td>
36
+ <td>The name of the institution</td>
37
+ <td>https://www.umn.edu</td>
38
+ <td>999-0010UMN</td>
39
+ </tr>
40
+ <tr>
41
+ <td>999-0010a</td>
42
+ <td>Institution</td>
43
+ <td>string</td>
44
+ <td>University of Minnesota Duluth</td>
45
+ <td>The name of the institution</td>
46
+ <td>https://www.d.umn.edu</td>
47
+ <td>999-0010UMN</td>
48
+ </tr>
49
+ <tr>
50
+ <td>...</td>
51
+ <td>...</td>
52
+ <td>...</td>
53
+ <td>...</td>
54
+ <td>...</td>
55
+ <td>...</td>
56
+ </tr>
57
+ </tbody>
58
+ </table>
59
+
60
+ <h5>CSV File Column Definitions</h5>
61
+ <dl>
62
+ <dt>friendlier_id</dt>
63
+ <dd>The associated document's friendlier id</dd>
64
+ <dt>field_name</dt>
65
+ <dd>The name of the field</dd>
66
+ <dt>field_type</dt>
67
+ <dd>The type of the field</dd>
68
+ <dt>values</dt>
69
+ <dd>The values of the field</dd>
70
+ <dt>definition</dt>
71
+ <dd>The definition of the field</dd>
72
+ <dt>definition_source</dt>
73
+ <dd>The source of the definition</dd>
74
+ <dt>parent_field_name</dt>
75
+ <dd>The parent field's name</dd>
76
+ </dl>
77
+ </div>
78
+ </div>
@@ -0,0 +1,78 @@
1
+ <%- @page_title = "GBL♦Admin - Document - Data Dictionaries" %>
2
+
3
+ <div class="row mb-2">
4
+ <div class="col">
5
+ <%= link_to "Back to document data dictionaries", admin_document_document_data_dictionaries_path(@document) %>
6
+
7
+ <h1 style="width:100%;">
8
+ <%= @document.title %> &middot; Data Dictionaries &middot; <%= @document_data_dictionary.name %>
9
+
10
+ <%= link_to '+ New Entry', new_admin_document_document_data_dictionary_document_data_dictionary_entry_path(@document, @document_data_dictionary), { class: 'btn btn-primary float-right' } %>
11
+ </h1>
12
+ </div>
13
+ </div>
14
+
15
+ <div class="row">
16
+ <div class="col-12">
17
+ <h6>
18
+ <span class='float-left mt-3'>
19
+ <%== pagy_info(@pagy) %>
20
+ </span>
21
+ <span class='float-right'>
22
+ <%== pagy_bootstrap_nav(@pagy) %>
23
+ </span>
24
+ </h6>
25
+
26
+ <div class="table-responsive">
27
+ <table class="table table-striped table-bordered sortable">
28
+ <thead class="thead-dark">
29
+ <tr>
30
+ <th class="header">field_name</th>
31
+ <th class="header">field_type</th>
32
+ <th class="header">values</th>
33
+ <th class="header">definition</th>
34
+ <th class="header">definition_source</th>
35
+ <th class="header">parent_field_name</th>
36
+ <th class="header">Reorder</th>
37
+ <th class="header" colspan="2">Actions</th>
38
+ </tr>
39
+ </thead>
40
+ <tbody>
41
+ <% @document_data_dictionary.document_data_dictionary_entries.each do |entry| %>
42
+ <tr data-id="<%=entry.id%>">
43
+ <td><%= entry.field_name %></td>
44
+ <td><%= entry.field_type %></td>
45
+ <td><%= entry.values %></td>
46
+ <td><%= entry.definition %></td>
47
+ <td><%= entry.definition_source %></td>
48
+ <td><%= entry.parent_field_name %></td>
49
+ <td class="handle" style="text-align:center">&varr;</td>
50
+ <td>
51
+ <%= link_to 'Edit', edit_admin_document_document_data_dictionary_document_data_dictionary_entry_path(@document, @document_data_dictionary, entry.id) %>
52
+ </td>
53
+ <td>
54
+ <%= link_to 'Destroy', admin_document_document_data_dictionary_document_data_dictionary_entry_path(@document, @document_data_dictionary, entry.id), method: :delete, data: { confirm: 'Are you sure?' } %>
55
+ </td>
56
+ </tr>
57
+ <% end %>
58
+ </tbody>
59
+ </table>
60
+ </div>
61
+
62
+ <h6>
63
+ <span class='float-left mt-3'>
64
+ <%== pagy_info(@pagy) %>
65
+ </span>
66
+ <span class='float-right'>
67
+ <%== pagy_bootstrap_nav(@pagy) %>
68
+ </span>
69
+ </h6>
70
+ </div>
71
+ </div>
72
+
73
+ <script>
74
+ GBLADMIN.SortElements(
75
+ $("tbody"),
76
+ "<%= sort_admin_document_document_data_dictionary_document_data_dictionary_entries_path(@document, @document_data_dictionary) %>"
77
+ );
78
+ </script>
@@ -0,0 +1 @@
1
+ json.partial! "document_data_dictionaries/document_data_dictionary", document_data_dictionary: @document_data_dictionary
@@ -0,0 +1,19 @@
1
+ <%= simple_form_for([:admin, @document, @document_data_dictionary, @document_data_dictionary_entry]) do |f| %>
2
+ <%= f.error_notification %>
3
+ <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
4
+
5
+ <div class="form-inputs">
6
+ <%= f.input :friendlier_id, input_html: { value: @document.friendlier_id, readonly: true } %>
7
+ <%= f.input :document_data_dictionary_id, as: :hidden, input_html: { value: @document_data_dictionary.id } %>
8
+ <%= f.input :field_name, input_html: { class: 'form-control', autofocus: true } %>
9
+ <%= f.input :field_type, input_html: { class: 'form-control' } %>
10
+ <%= f.input :values, input_html: { class: 'form-control' } %>
11
+ <%= f.input :definition, input_html: { class: 'form-control' } %>
12
+ <%= f.input :definition_source, input_html: { class: 'form-control' } %>
13
+ <%= f.input :parent_field_name, input_html: { class: 'form-control' } %>
14
+ </div>
15
+
16
+ <div class="form-group">
17
+ <%= f.submit class: 'btn btn-primary' %>
18
+ </div>
19
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <% content_for :title, "Editing document data dictionary entry" %>
2
+
3
+ <h1>Editing document data dictionary entry</h1>
4
+
5
+ <%= render "form", document_data_dictionary_entry: @document_data_dictionary_entry %>
6
+
7
+ <br>
8
+
9
+ <div>
10
+ <%= link_to "Show this document data dictionary entry", admin_document_document_data_dictionary_document_data_dictionary_entry_path(@document, @document_data_dictionary, @document_data_dictionary_entry) %> |
11
+ <%= link_to "Back to document data dictionary entries", admin_document_document_data_dictionary_document_data_dictionary_entries_path(@document, @document_data_dictionary) %>
12
+ </div>
@@ -0,0 +1,16 @@
1
+ <div class="row mb-2">
2
+ <div class="col">
3
+ <%= link_to "Back to document data dictionaries", admin_document_document_data_dictionaries_path(@document) %>
4
+
5
+ <h1 style="width:100%;">
6
+ <%= @document.title %> &middot; New Data Dictionary Entry
7
+ </h1>
8
+ </div>
9
+ </div>
10
+
11
+ <div class="row">
12
+ <div class="col-5">
13
+ <%= render "form", document_data_dictionary_entry: @document_data_dictionary_entry %>
14
+
15
+ <%= link_to "Back to document data dictionary entries", admin_document_document_data_dictionary_document_data_dictionary_entries_path(@document, @document_data_dictionary) %>
16
+ </div>
@@ -6,12 +6,12 @@
6
6
  Document &middot; Distributions
7
7
 
8
8
  <% if params[:document_id] %>
9
- <%= link_to '+ Import CSV', import_admin_document_document_distributions_path(@document), { class: 'btn btn-primary float-right' } %>
9
+ <%= link_to '+ Import CSV', new_admin_import_distribution_path, { class: 'btn btn-primary float-right' } %>
10
10
 
11
11
  <%= link_to '+ New Distribution', new_admin_document_document_distribution_path(@document), { class: 'btn btn-primary float-right mr-2' } %>
12
12
  <% else %>
13
13
  <%= link_to '- Delete CSV', destroy_all_admin_document_distributions_path, { class: 'btn btn-danger float-right' } %>
14
- <%= link_to '+ Import CSV', import_admin_document_distributions_path, { class: 'btn btn-primary float-right mr-4' } %>
14
+ <%= link_to '+ Import CSV', new_admin_import_distribution_path, { class: 'btn btn-primary float-right mr-4' } %>
15
15
  <% end %>
16
16
  </h1>
17
17
 
@@ -32,6 +32,10 @@
32
32
  Additional Assets
33
33
  <span class="badge badge-light"><%= @document.document_assets.count %></span>
34
34
  <% end %>
35
+ <%= link_to admin_document_document_data_dictionaries_url(@document), class: "ml-2" do %>
36
+ Data Dictionaries
37
+ <span class="badge badge-light"><%= @document.document_data_dictionaries.count %></span>
38
+ <% end %>
35
39
  <%= link_to admin_document_document_distributions_url(@document), class: "ml-2" do %>
36
40
  Distributions
37
41
  <% end %>
@@ -0,0 +1,21 @@
1
+ <% if @import_distribution.errors.any? %>
2
+ <div class="alert alert-danger mb-4" role="alert">
3
+ <h2 class="h4" class="alert-heading"><%= pluralize(@import_distribution.errors.count, "error") %> prohibited this import distribution from being saved</h2>
4
+ <ol class="mb-0">
5
+ <% @import_distribution.errors.full_messages.each do |msg| %>
6
+ <li><%= msg %></li>
7
+ <% end %>
8
+ </ol>
9
+ </div>
10
+ <% end %>
11
+
12
+ <div class="form-inputs">
13
+ <%= f.input :name, {autofocus: true} %>
14
+ <%= f.input :source %>
15
+ <%= f.input :description %>
16
+ <%= f.file_field :csv_file, direct_upload: true %>
17
+ </div>
18
+
19
+ <div class="form-actions">
20
+ <%= f.button :submit, "+ Create Import Distributions", {class: 'btn btn-primary'} %>
21
+ </div>
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.extract! import_distribution, :id, :name, :filename, :source, :description, :row_count, :headers, :encoding, :content_type,
4
+ :extension, :validity, :validation_result, :created_at, :updated_at
5
+ json.url import_distribution_url(import_distribution, format: :json)
@@ -0,0 +1,36 @@
1
+ <h6>
2
+ <span class='float-left mt-3'>
3
+ <%== pagy_info(@pagy_failed) %>
4
+ </span>
5
+ <span class='float-right'>
6
+ <%== pagy_bootstrap_nav(@pagy_failed) %>
7
+ </span>
8
+ </h6>
9
+
10
+ <table class="table table-striped">
11
+ <thead>
12
+ <tr>
13
+ <th>State</th>
14
+ <th>Title</th>
15
+ <th>Identifier</th>
16
+ <th>Reason</th>
17
+ </tr>
18
+ </thead>
19
+ <tbody>
20
+ <% @import_failed_distributions.each_with_index do |distribution, index| %>
21
+ <tr>
22
+ <td>
23
+ <span class="badge badge-danger">
24
+ <%= distribution.state_machine.current_state %>
25
+ </span>
26
+ </td>
27
+ <td><%= distribution.friendlier_id %></td>
28
+ <td>
29
+ <%= link_to admin_import_distribution_path(@import_distribution, distribution) do %>
30
+ <%= distribution.state_machine&.last_transition&.metadata %>
31
+ <% end %>
32
+ </td>
33
+ </tr>
34
+ <% end %>
35
+ </tbody>
36
+ </table>
@@ -0,0 +1,35 @@
1
+ <h6>
2
+ <span class='float-left mt-3'>
3
+ <%== pagy_info(@pagy_success) %>
4
+ </span>
5
+ <span class='float-right'>
6
+ <%== pagy_bootstrap_nav(@pagy_success) %>
7
+ </span>
8
+ </h6>
9
+
10
+ <table class="table table-striped">
11
+ <thead>
12
+ <tr>
13
+ <th>State</th>
14
+ <th>Friendlier ID</th>
15
+ <th>Distribution URL</th>
16
+ <th>Reference Type</th>
17
+ <th>Label</th>
18
+ </tr>
19
+ </thead>
20
+ <tbody>
21
+ <% @import_success_distributions.each_with_index do |distribution, index| %>
22
+ <tr>
23
+ <td>
24
+ <span class="badge badge-success">
25
+ <%= distribution.state_machine.current_state %>
26
+ </span>
27
+ </td>
28
+ <td><%= distribution.friendlier_id %></td>
29
+ <td><%= distribution.distribution_url %></td>
30
+ <td><%= distribution.reference_type %></td>
31
+ <td><%= distribution.label %></td>
32
+ </tr>
33
+ <% end %>
34
+ </tbody>
35
+ </table>
@@ -0,0 +1,8 @@
1
+ <h1>Editing Import Distribution</h1>
2
+
3
+ <%= simple_form_for(@import_distribution, :url => admin_import_distribution_path) do |f| %>
4
+ <%= render 'form', import_distribution: @import_distribution, f: f %>
5
+ <% end %>
6
+
7
+ <%= link_to 'Show', admin_import_distribution_path(@import_distribution) %> |
8
+ <%= link_to 'Back', admin_import_distributions_path %>
@@ -0,0 +1,58 @@
1
+ <%- @page_title = "GBL♦Admin - Import Distributions" %>
2
+
3
+ <div class="row mb-2">
4
+ <div class="col">
5
+ <h1 style="width:100%;">
6
+ Import Distributions
7
+ <%= link_to '+ New Distributions Import', new_admin_import_distribution_path, { class: 'btn btn-primary float-right' } %>
8
+ </h1>
9
+
10
+ <h6>
11
+ <span class='float-left mt-3'>
12
+ <%== pagy_info(@pagy) %>
13
+ </span>
14
+ <span class='float-right'>
15
+ <%== pagy_bootstrap_nav(@pagy) %>
16
+ </span>
17
+ </h6>
18
+
19
+ <table class="table table-striped table-bordered sortable">
20
+ <thead class="thead-dark">
21
+ <tr>
22
+ <th class="header">Name</th>
23
+ <th class="header">Filename</th>
24
+ <th class="header">Source</th>
25
+ <th class="header">Description</th>
26
+ <th class="header">Row count</th>
27
+ <th class="header">Date</th>
28
+ <th class="header" colspan="3">Actions</th>
29
+ </tr>
30
+ </thead>
31
+
32
+ <tbody>
33
+ <% @import_distributions.each do |import_distribution| %>
34
+ <tr>
35
+ <td><%= import_distribution.name %></td>
36
+ <td><%= import_distribution.filename %></td>
37
+ <td><%= import_distribution.source %></td>
38
+ <td><%= import_distribution.description %></td>
39
+ <td><%= import_distribution.row_count %></td>
40
+ <td><%= import_distribution.created_at %></td>
41
+ <td><%= link_to 'Show', admin_import_distribution_path(import_distribution) %></td>
42
+ <td><%= link_to 'Edit', edit_admin_import_distribution_path(import_distribution) %></td>
43
+ <td><%= link_to 'Destroy', admin_import_distribution_path(import_distribution), method: :delete, data: { confirm: 'Are you sure?' } %></td>
44
+ </tr>
45
+ <% end %>
46
+ </tbody>
47
+ </table>
48
+
49
+ <h6>
50
+ <span class='float-left mt-3'>
51
+ <%== pagy_info(@pagy) %>
52
+ </span>
53
+ <span class='float-right'>
54
+ <%== pagy_bootstrap_nav(@pagy) %>
55
+ </span>
56
+ </h6>
57
+ </div>
58
+ </div>
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.array! @import_distributions, partial: "import_distributions/import_distribution", as: :import_distribution
@@ -0,0 +1,7 @@
1
+ <h1>New Import Distribution</h1>
2
+
3
+ <%= simple_form_for(@import_distribution.becomes(ImportDistribution), url: admin_import_distributions_path) do |f| %>
4
+ <%= render 'form', import_distribution: @import_distribution, f: f %>
5
+ <% end %>
6
+
7
+ <%= link_to 'Back', admin_import_distributions_path %>