geoblacklight_admin 0.0.1 → 0.1.0
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.
- checksums.yaml +4 -4
- data/README.md +27 -3
- data/Rakefile +30 -12
- data/app/assets/javascripts/geoblacklight_admin.js +1 -0
- data/app/assets/stylesheets/geoblacklight_admin/_core.scss +5 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_chosen.scss +425 -0
- data/app/controllers/admin/admin_controller.rb +4 -2
- data/app/controllers/admin/advanced_search_controller.rb +123 -103
- data/app/controllers/admin/api_controller.rb +123 -108
- data/app/controllers/admin/bookmarks_controller.rb +4 -4
- data/app/controllers/admin/bulk_actions_controller.rb +9 -4
- data/app/controllers/admin/concerns/upload_util.rb +2 -0
- data/app/controllers/admin/document_accesses_controller.rb +10 -4
- data/app/controllers/admin/document_assets_controller.rb +14 -11
- data/app/controllers/admin/document_downloads_controller.rb +12 -10
- data/app/controllers/admin/documents_controller.rb +16 -8
- data/app/controllers/admin/elements_controller.rb +6 -5
- data/app/controllers/admin/form_elements_controller.rb +4 -4
- data/app/controllers/admin/ids_controller.rb +107 -87
- data/app/controllers/admin/import_documents_controller.rb +1 -1
- data/app/controllers/admin/imports_controller.rb +7 -3
- data/app/controllers/admin/mappings_controller.rb +6 -4
- data/app/controllers/admin/notifications_controller.rb +1 -1
- data/app/controllers/admin/search_controller.rb +1 -1
- data/app/controllers/admin/users_controller.rb +1 -1
- data/app/helpers/form_input_helper.rb +4 -4
- data/app/helpers/geoblacklight_admin_helper.rb +1 -1
- data/app/jobs/export_job.rb +2 -1
- data/app/models/admin/bookmark.rb +18 -0
- data/app/models/api_search_builder.rb +3 -1
- data/app/models/document/bbox_validator.rb +9 -5
- data/app/models/document/date_range_validator.rb +13 -10
- data/app/models/document/geom_validator.rb +4 -2
- data/app/models/document.rb +15 -7
- data/app/models/element.rb +9 -7
- data/app/models/form_control.rb +2 -0
- data/app/models/form_element.rb +2 -0
- data/app/models/form_feature.rb +2 -0
- data/app/models/form_group.rb +2 -0
- data/app/models/form_header.rb +2 -0
- data/app/models/geoblacklight_admin/schema.rb +5 -2
- data/app/models/geoblacklight_admin.rb +2 -0
- data/app/models/import/csv_duplicates_validator.rb +2 -1
- data/app/models/import/csv_header_validator.rb +2 -1
- data/app/models/import.rb +4 -7
- data/app/models/user.rb +1 -1
- data/app/services/export_csv_service.rb +5 -1
- data/app/views/admin/advanced_search/facets.json.jbuilder +9 -8
- data/app/views/admin/advanced_search/index.json.jbuilder +8 -7
- data/app/views/admin/api/_field.json.jbuilder +1 -1
- data/app/views/admin/api/fetch.json.jbuilder +8 -7
- data/app/views/admin/api/index.json.jbuilder +8 -7
- data/app/views/admin/bookmarks/index.html.erb +2 -2
- data/app/views/admin/bulk_actions/index.html.erb +3 -3
- data/app/views/admin/bulk_actions/show.html.erb +1 -1
- data/app/views/admin/document_accesses/_form.html.erb +1 -1
- data/app/views/admin/document_accesses/destroy_all.html.erb +2 -2
- data/app/views/admin/document_accesses/edit.html.erb +1 -1
- data/app/views/admin/document_accesses/import.html.erb +2 -2
- data/app/views/admin/document_accesses/index.html.erb +9 -9
- data/app/views/admin/document_accesses/new.html.erb +1 -1
- data/app/views/admin/document_downloads/_form.html.erb +1 -1
- data/app/views/admin/document_downloads/destroy_all.html.erb +1 -1
- data/app/views/admin/document_downloads/edit.html.erb +2 -3
- data/app/views/admin/document_downloads/import.html.erb +1 -1
- data/app/views/admin/document_downloads/index.html.erb +9 -9
- data/app/views/admin/document_downloads/new.html.erb +1 -1
- data/app/views/admin/document_downloads/show.html.erb +2 -2
- data/app/views/admin/documents/_document_bookmark.html.erb +1 -1
- data/app/views/admin/documents/_form_nav.html.erb +1 -1
- data/app/views/admin/documents/_json_btaa_aardvark.jbuilder +1 -3
- data/app/views/admin/documents/edit.html.erb +1 -1
- data/app/views/admin/documents/features/_multiple_download_links.html.erb +2 -2
- data/app/views/admin/documents/index.html.erb +2 -4
- data/app/views/admin/documents/versions.html.erb +1 -1
- data/app/views/admin/elements/_element.json.jbuilder +4 -1
- data/app/views/admin/elements/_form.html.erb +1 -1
- data/app/views/admin/elements/edit.html.erb +2 -2
- data/app/views/admin/elements/index.html.erb +3 -3
- data/app/views/admin/elements/index.json.jbuilder +2 -0
- data/app/views/admin/elements/new.html.erb +1 -1
- data/app/views/admin/elements/show.html.erb +6 -6
- data/app/views/admin/elements/show.json.jbuilder +2 -0
- data/app/views/admin/form_elements/_form.html.erb +1 -1
- data/app/views/admin/form_elements/_form_element.json.jbuilder +2 -0
- data/app/views/admin/form_elements/edit.html.erb +2 -2
- data/app/views/admin/form_elements/index.html.erb +1 -1
- data/app/views/admin/form_elements/index.json.jbuilder +2 -0
- data/app/views/admin/form_elements/new.html.erb +1 -1
- data/app/views/admin/form_elements/show.html.erb +2 -2
- data/app/views/admin/form_elements/show.json.jbuilder +2 -0
- data/app/views/admin/ids/fetch.json.jbuilder +8 -7
- data/app/views/admin/ids/index.json.jbuilder +3 -2
- data/app/views/admin/import_documents/show.html.haml +1 -1
- data/app/views/admin/imports/_import.json.jbuilder +2 -1
- data/app/views/admin/imports/_show_failed_tab.html.erb +2 -2
- data/app/views/admin/imports/_show_success_tab.html.erb +1 -1
- data/app/views/admin/imports/edit.html.erb +3 -3
- data/app/views/admin/imports/index.html.erb +3 -3
- data/app/views/admin/layouts/application.html.erb +4 -4
- data/app/views/admin/mappings/_form.html.erb +1 -1
- data/app/views/admin/mappings/_mapping.json.jbuilder +2 -1
- data/app/views/admin/mappings/edit.html.erb +2 -2
- data/app/views/admin/mappings/new.html.erb +1 -1
- data/app/views/admin/mappings/show.html.erb +2 -2
- data/app/views/admin/notifications/index.html.erb +3 -3
- data/app/views/admin/search/index.html.erb +2 -2
- data/app/views/admin/shared/_navbar.html.erb +8 -3
- data/app/views/catalog/_show_gbl_admin.html.erb +3 -0
- data/config/routes.rb +37 -33
- data/db/migrate/20230316183001_add_geoblacklight_admin_gem.rb +408 -0
- data/db/seeds.rb +7 -5
- data/lib/generators/geoblacklight_admin/config_generator.rb +43 -31
- data/lib/generators/geoblacklight_admin/install_generator.rb +2 -3
- data/lib/generators/geoblacklight_admin/jobs_generator.rb +3 -2
- data/lib/generators/geoblacklight_admin/models_generator.rb +0 -1
- data/lib/generators/geoblacklight_admin/templates/_show_sidebar.html.erb +19 -0
- data/lib/generators/geoblacklight_admin/templates/_user_util_links.html.erb +1 -1
- data/lib/generators/geoblacklight_admin/templates/config/database.yml +9 -5
- data/lib/generators/geoblacklight_admin/templates/config/initializers/geoblacklight_admin.rb +1 -2
- data/lib/generators/geoblacklight_admin/templates/config/initializers/pagy.rb +150 -68
- data/lib/generators/geoblacklight_admin/templates/config/settings.yml +241 -0
- data/lib/generators/geoblacklight_admin/templates/package.json +1 -0
- data/lib/generators/geoblacklight_admin/views_generator.rb +0 -1
- data/lib/geoblacklight_admin/engine.rb +5 -6
- data/lib/geoblacklight_admin/version.rb +1 -1
- data/lib/geoblacklight_admin.rb +1 -1
- data/lib/tasks/geoblacklight_admin.rake +10 -6
- metadata +79 -48
- data/.editorconfig +0 -18
- data/.gitignore +0 -75
- data/.standard.yml +0 -4
- data/Gemfile +0 -59
- data/LICENSE +0 -21
- data/app/assets/images/.keep +0 -0
- data/app/controllers/admin/concerns/.keep +0 -0
- data/app/models/bookmark.rb +0 -17
- data/app/models/concerns/.keep +0 -0
- data/db/migrate/20230316183001_add_geoblacklight_admin.rb +0 -399
- data/geoblacklight_admin.gemspec +0 -67
- data/lib/generators/geoblacklight_admin/templates/.env.development.example +0 -28
- data/lib/generators/geoblacklight_admin/templates/.solr_wrapper.yml +0 -7
- data/lib/generators/geoblacklight_admin/templates/solr/snapshots/.keep +0 -0
- data/lib/tasks/.keep +0 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +0 -35
- data/template.rb +0 -16
|
@@ -47,7 +47,7 @@ module FormInputHelper
|
|
|
47
47
|
category_list = [existing_category_value] + category_list unless category_list.include?(existing_category_value)
|
|
48
48
|
|
|
49
49
|
# Turn category list into values and human labels, using i18n or rails humanizing.
|
|
50
|
-
category_list = category_list.collect
|
|
50
|
+
category_list = category_list.collect do |key|
|
|
51
51
|
value = if key.nil?
|
|
52
52
|
key
|
|
53
53
|
elsif model_class.respond_to?(:model_name) && key.present?
|
|
@@ -59,15 +59,15 @@ module FormInputHelper
|
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
[value, key]
|
|
62
|
-
|
|
62
|
+
end.to_h
|
|
63
63
|
|
|
64
64
|
tag.div(class: "form-row category-and-value") do
|
|
65
65
|
tag.div(class: "col-left category") {
|
|
66
66
|
builder.input category_key, collection: category_list, label: false, include_blank: false
|
|
67
67
|
} +
|
|
68
|
-
tag.div(class: "col-sm value")
|
|
68
|
+
tag.div(class: "col-sm value") do
|
|
69
69
|
builder.input value_key, label: false, input_html: {data: input_data_attributes}
|
|
70
|
-
|
|
70
|
+
end
|
|
71
71
|
end
|
|
72
72
|
end
|
|
73
73
|
end
|
|
@@ -5,7 +5,7 @@ module GeoblacklightAdminHelper
|
|
|
5
5
|
# @TODO:
|
|
6
6
|
# Cannot generate app if uncommented...
|
|
7
7
|
# Uncomment after app is generated to fix view errors
|
|
8
|
-
|
|
8
|
+
include ::Pagy::Frontend if defined?(Pagy)
|
|
9
9
|
|
|
10
10
|
# jbuilder helper
|
|
11
11
|
def no_json_blanks(value)
|
data/app/jobs/export_job.rb
CHANGED
|
@@ -41,7 +41,8 @@ class ExportJob < ApplicationJob
|
|
|
41
41
|
notification.deliver(current_user)
|
|
42
42
|
|
|
43
43
|
# Attach CSV file (can only attach after persisted)
|
|
44
|
-
notification.record.file.attach(io: @tempfile, filename: "geomg-export-#{Time.zone.today}.csv",
|
|
44
|
+
notification.record.file.attach(io: @tempfile, filename: "geomg-export-#{Time.zone.today}.csv",
|
|
45
|
+
content_type: "text/csv")
|
|
45
46
|
|
|
46
47
|
# Update UI
|
|
47
48
|
ActionCable.server.broadcast("export_channel", {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Admin::Bookmark
|
|
4
|
+
module Admin
|
|
5
|
+
class Bookmark < ApplicationRecord
|
|
6
|
+
belongs_to :user, polymorphic: true
|
|
7
|
+
belongs_to :document, polymorphic: true
|
|
8
|
+
validates :user_id, presence: true
|
|
9
|
+
|
|
10
|
+
def document_id
|
|
11
|
+
document_id
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def document_type
|
|
15
|
+
Kithe::Model
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
class ApiSearchBuilder < Blacklight::SearchBuilder
|
|
2
4
|
include Blacklight::Solr::SearchBuilderBehavior
|
|
3
5
|
include BlacklightAdvancedSearch::AdvancedSearchBuilder
|
|
4
6
|
# include B1gDateRangeQueryConcern::RangeLimitBuilder
|
|
5
7
|
|
|
6
|
-
self.default_processor_chain += [
|
|
8
|
+
self.default_processor_chain += %i[add_advanced_parse_q_to_solr add_advanced_search_to_solr]
|
|
7
9
|
|
|
8
10
|
# Remove GBL Spatial, otherwise it will hide all suppressed docs
|
|
9
11
|
# from API search results
|
|
@@ -14,7 +14,10 @@ class Document
|
|
|
14
14
|
valid_geom = true
|
|
15
15
|
|
|
16
16
|
# Sane for W,S,E,N?
|
|
17
|
-
|
|
17
|
+
unless record.send(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box]).nil?
|
|
18
|
+
proper_bounding_box(record,
|
|
19
|
+
valid_geom)
|
|
20
|
+
end
|
|
18
21
|
|
|
19
22
|
valid_geom
|
|
20
23
|
end
|
|
@@ -57,10 +60,11 @@ class Document
|
|
|
57
60
|
# Reject ENVELOPE(-118.00.0000,-88.00.0000,51.00.0000,42.00.0000
|
|
58
61
|
# - Double period float-ish things?
|
|
59
62
|
geom.each do |val|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
next unless val.count(".") >= 2
|
|
64
|
+
|
|
65
|
+
valid_geom = false
|
|
66
|
+
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:bounding_box],
|
|
67
|
+
"invalid ENVELOPE(W,E,N,S) syntax - found multiple periods in a coordinate value.")
|
|
64
68
|
end
|
|
65
69
|
end
|
|
66
70
|
|
|
@@ -18,7 +18,8 @@ class Document
|
|
|
18
18
|
|
|
19
19
|
# Must split into two via '-'
|
|
20
20
|
if date_range.split("-").size != 2
|
|
21
|
-
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range],
|
|
21
|
+
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range],
|
|
22
|
+
"invalid date range present - missing YYYY-YYYY value")
|
|
22
23
|
valid_date_ranges = false
|
|
23
24
|
return valid_date_ranges
|
|
24
25
|
end
|
|
@@ -26,28 +27,30 @@ class Document
|
|
|
26
27
|
start_date, end_date = date_range.split("-")
|
|
27
28
|
|
|
28
29
|
unless valid_yyyy(start_date)
|
|
29
|
-
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range],
|
|
30
|
+
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range],
|
|
31
|
+
"invalid start date - bad YYYY-YYYY value, only integers or the wildcard '*' allowed")
|
|
30
32
|
valid_date_ranges = false
|
|
31
33
|
end
|
|
32
34
|
|
|
33
35
|
unless valid_yyyy(end_date)
|
|
34
|
-
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range],
|
|
36
|
+
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range],
|
|
37
|
+
"invalid end date - bad YYYY-YYYY value, only integers or the wildcard '*' allowed")
|
|
35
38
|
valid_date_ranges = false
|
|
36
39
|
end
|
|
37
40
|
|
|
38
41
|
# Allow only 1 wildcard
|
|
39
42
|
if start_date == "*" && end_date == "*"
|
|
40
|
-
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range],
|
|
43
|
+
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range],
|
|
44
|
+
"invalid only one wildcard can be used")
|
|
41
45
|
valid_date_ranges = false
|
|
42
46
|
end
|
|
43
47
|
|
|
44
48
|
# Avoid 1996-1946
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
end
|
|
49
|
+
next unless start_date[/\d+/] && end_date[/\d+/] && start_date.to_i > end_date.to_i
|
|
50
|
+
|
|
51
|
+
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:date_range],
|
|
52
|
+
"invalid start date must be less than the end date")
|
|
53
|
+
valid_date_ranges = false
|
|
51
54
|
end
|
|
52
55
|
valid_date_ranges
|
|
53
56
|
end
|
|
@@ -37,7 +37,8 @@ class Document
|
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
unless valid_geom
|
|
40
|
-
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:geometry],
|
|
40
|
+
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:geometry],
|
|
41
|
+
"Invalid envelope: #{error_message}")
|
|
41
42
|
end
|
|
42
43
|
|
|
43
44
|
valid_geom
|
|
@@ -60,7 +61,8 @@ class Document
|
|
|
60
61
|
# Guard against a whole world polygons
|
|
61
62
|
if geom == "POLYGON((-180 90, 180 90, 180 -90, -180 -90, -180 90))"
|
|
62
63
|
valid_geom = false
|
|
63
|
-
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:geometry],
|
|
64
|
+
record.errors.add(GeoblacklightAdmin::Schema.instance.solr_fields[:geometry],
|
|
65
|
+
"Invalid polygon: all points are coplanar input, Solr will not index")
|
|
64
66
|
end
|
|
65
67
|
|
|
66
68
|
valid_geom
|
data/app/models/document.rb
CHANGED
|
@@ -11,7 +11,8 @@ class Document < Kithe::Work
|
|
|
11
11
|
belongs_to :import, optional: true
|
|
12
12
|
|
|
13
13
|
# Statesman
|
|
14
|
-
has_many :document_transitions, foreign_key: "kithe_model_id", autosave: false, dependent: :destroy,
|
|
14
|
+
has_many :document_transitions, foreign_key: "kithe_model_id", autosave: false, dependent: :destroy,
|
|
15
|
+
inverse_of: :document
|
|
15
16
|
|
|
16
17
|
# DocumentAccesses
|
|
17
18
|
has_many :document_accesses, primary_key: "friendlier_id", foreign_key: "friendlier_id", autosave: false, dependent: :destroy,
|
|
@@ -69,7 +70,9 @@ class Document < Kithe::Work
|
|
|
69
70
|
# Index Transformations - *_json functions
|
|
70
71
|
def references_json
|
|
71
72
|
references = ActiveSupport::HashWithIndifferentAccess.new
|
|
72
|
-
send(GeoblacklightAdmin::Schema.instance.solr_fields[:reference]).each
|
|
73
|
+
send(GeoblacklightAdmin::Schema.instance.solr_fields[:reference]).each do |ref|
|
|
74
|
+
references[Document::Reference::REFERENCE_VALUES[ref.category.to_sym][:uri]] = ref.value
|
|
75
|
+
end
|
|
73
76
|
references = apply_downloads(references)
|
|
74
77
|
references.to_json
|
|
75
78
|
end
|
|
@@ -79,7 +82,10 @@ class Document < Kithe::Work
|
|
|
79
82
|
# Make sure downloads exist!
|
|
80
83
|
if document_downloads.present?
|
|
81
84
|
multiple_downloads = multiple_downloads_array
|
|
82
|
-
|
|
85
|
+
if dct_downloads.present?
|
|
86
|
+
multiple_downloads << {label: download_text(send(GeoblacklightAdmin::Schema.instance.solr_fields[:format])),
|
|
87
|
+
url: dct_downloads}
|
|
88
|
+
end
|
|
83
89
|
references[:"http://schema.org/downloadUrl"] = multiple_downloads
|
|
84
90
|
end
|
|
85
91
|
references
|
|
@@ -178,7 +184,9 @@ class Document < Kithe::Work
|
|
|
178
184
|
end
|
|
179
185
|
|
|
180
186
|
def dct_references_s_to_csv(key, destination)
|
|
181
|
-
send(destination).detect
|
|
187
|
+
send(destination).detect do |ref|
|
|
188
|
+
ref.category == GeoblacklightAdmin::Schema.instance.dct_references_mappings[key]
|
|
189
|
+
end.value
|
|
182
190
|
rescue NoMethodError
|
|
183
191
|
nil
|
|
184
192
|
end
|
|
@@ -219,9 +227,9 @@ class Document < Kithe::Work
|
|
|
219
227
|
end
|
|
220
228
|
|
|
221
229
|
def set_geometry
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
230
|
+
return unless locn_geometry.blank? && self&.dcat_bbox&.present?
|
|
231
|
+
|
|
232
|
+
self.locn_geometry = derive_polygon
|
|
225
233
|
end
|
|
226
234
|
|
|
227
235
|
# Convert GEOM for Solr Indexing
|
data/app/models/element.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
class Element < ApplicationRecord
|
|
2
4
|
serialize :html_attributes
|
|
3
5
|
|
|
@@ -21,13 +23,13 @@ class Element < ApplicationRecord
|
|
|
21
23
|
# Validations
|
|
22
24
|
validates :label, :solr_field, :field_type, presence: true
|
|
23
25
|
|
|
24
|
-
FIELD_TYPES = [
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
]
|
|
26
|
+
FIELD_TYPES = %w[
|
|
27
|
+
string
|
|
28
|
+
text
|
|
29
|
+
integer
|
|
30
|
+
boolean
|
|
31
|
+
datetime
|
|
32
|
+
].freeze
|
|
31
33
|
|
|
32
34
|
# Find by solr_field shortcut
|
|
33
35
|
def self.at(field)
|
data/app/models/form_control.rb
CHANGED
data/app/models/form_element.rb
CHANGED
data/app/models/form_feature.rb
CHANGED
data/app/models/form_group.rb
CHANGED
data/app/models/form_header.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "singleton"
|
|
2
4
|
|
|
3
5
|
module GeoblacklightAdmin
|
|
@@ -11,12 +13,12 @@ module GeoblacklightAdmin
|
|
|
11
13
|
end
|
|
12
14
|
|
|
13
15
|
def solr_fields
|
|
14
|
-
elements.map
|
|
16
|
+
elements.map do |elm|
|
|
15
17
|
[
|
|
16
18
|
elm.label.parameterize(separator: "_").to_sym,
|
|
17
19
|
elm.solr_field
|
|
18
20
|
]
|
|
19
|
-
|
|
21
|
+
end.to_h
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
def importable_fields
|
|
@@ -40,6 +42,7 @@ module GeoblacklightAdmin
|
|
|
40
42
|
Element.exportable.order(:position).each do |elm|
|
|
41
43
|
# Skip References
|
|
42
44
|
next if elm.solr_field == "dct_references_s"
|
|
45
|
+
|
|
43
46
|
@fields[elm.label.to_sym] = {
|
|
44
47
|
destination: elm.solr_field,
|
|
45
48
|
delimited: elm.repeatable,
|
|
@@ -15,7 +15,8 @@ class Import
|
|
|
15
15
|
duplicate_id = validate_csv_file(record.csv_file)
|
|
16
16
|
unless duplicate_id.nil?
|
|
17
17
|
valid_csv_file = false
|
|
18
|
-
record.errors.add(:csv_file,
|
|
18
|
+
record.errors.add(:csv_file,
|
|
19
|
+
"Duplicate ID value found: #{duplicate_id}. Please clean up the CSV file and reimport.")
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
valid_csv_file
|
|
@@ -10,7 +10,8 @@ class Import
|
|
|
10
10
|
valid_csv_header = true
|
|
11
11
|
unless valid_csv_headers?(record.csv_file)
|
|
12
12
|
valid_csv_header = false
|
|
13
|
-
record.errors.add(:csv_file,
|
|
13
|
+
record.errors.add(:csv_file,
|
|
14
|
+
"Missing a required CSV header. Title, Resource Class, Access Rights, and ID are required.")
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
valid_csv_header
|
data/app/models/import.rb
CHANGED
|
@@ -94,9 +94,7 @@ class Import < ApplicationRecord
|
|
|
94
94
|
# logger.debug("Mapping: #{mapping.source_header} to #{mapping.destination_field}")
|
|
95
95
|
|
|
96
96
|
# Handle discards
|
|
97
|
-
if mapping.destination_field == "Discard"
|
|
98
|
-
next
|
|
99
|
-
end
|
|
97
|
+
next if mapping.destination_field == "Discard"
|
|
100
98
|
|
|
101
99
|
# Handle repeatable dct_references_s entries
|
|
102
100
|
if mapping.destination_field == "dct_references_s"
|
|
@@ -118,7 +116,8 @@ class Import < ApplicationRecord
|
|
|
118
116
|
|
|
119
117
|
# Split delimited field values, if field has a value present
|
|
120
118
|
if mapping.delimited?
|
|
121
|
-
transformed_data[mapping.destination_field] =
|
|
119
|
+
transformed_data[mapping.destination_field] =
|
|
120
|
+
transformed_data[mapping.destination_field].present? ? transformed_data[mapping.destination_field].split(klass_delimiter) : ""
|
|
122
121
|
end
|
|
123
122
|
end
|
|
124
123
|
|
|
@@ -175,9 +174,7 @@ class Import < ApplicationRecord
|
|
|
175
174
|
required_mapping = {}
|
|
176
175
|
required_mapping[key] = value
|
|
177
176
|
|
|
178
|
-
unless data_hash.
|
|
179
|
-
data_hash.merge!(required_mapping.stringify_keys)
|
|
180
|
-
end
|
|
177
|
+
data_hash.merge!(required_mapping.stringify_keys) unless data_hash.key?(key)
|
|
181
178
|
end
|
|
182
179
|
end
|
|
183
180
|
|
data/app/models/user.rb
CHANGED
|
@@ -20,7 +20,11 @@ class ExportCsvService
|
|
|
20
20
|
Rails.logger.debug { "\n\nExportCsvService: #{document_ids.inspect}\n\n" }
|
|
21
21
|
|
|
22
22
|
CSV.generate(headers: true) do |_csv|
|
|
23
|
-
Rails.logger.debug
|
|
23
|
+
Rails.logger.debug do
|
|
24
|
+
"\n\n CSV Fields: #{GeoblacklightAdmin::Schema.instance.exportable_fields.map do |k, _v|
|
|
25
|
+
k.to_s
|
|
26
|
+
end} \n\n"
|
|
27
|
+
end
|
|
24
28
|
|
|
25
29
|
csv_file << GeoblacklightAdmin::Schema.instance.exportable_fields.map { |k, _v| k.to_s }
|
|
26
30
|
document_ids.each_slice(slice_count) do |slice|
|
|
@@ -9,10 +9,10 @@ json.data do
|
|
|
9
9
|
doc_presenter = index_presenter(document)
|
|
10
10
|
|
|
11
11
|
doc_presenter.fields_to_render.each do |field_name, field|
|
|
12
|
-
json.partial!
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
json.partial! "field", field: field,
|
|
13
|
+
field_name: field_name,
|
|
14
|
+
document_url: document_url,
|
|
15
|
+
doc_presenter: doc_presenter
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -24,7 +24,7 @@ end
|
|
|
24
24
|
|
|
25
25
|
json.included do
|
|
26
26
|
json.array! @presenter.search_facets do |facet|
|
|
27
|
-
json.type
|
|
27
|
+
json.type "facet"
|
|
28
28
|
json.id facet.name
|
|
29
29
|
json.attributes do
|
|
30
30
|
facet_config = facet_configuration_for_field(facet.name)
|
|
@@ -41,7 +41,8 @@ json.included do
|
|
|
41
41
|
Deprecation.silence(Blacklight::FacetsHelperBehavior) do
|
|
42
42
|
if facet_in_params?(facet.name, item.value)
|
|
43
43
|
Deprecation.silence(Blacklight::SearchState) do
|
|
44
|
-
json.remove admin_advanced_search_action_path(search_state.remove_facet_params(facet.name,
|
|
44
|
+
json.remove admin_advanced_search_action_path(search_state.remove_facet_params(facet.name,
|
|
45
|
+
item.value))
|
|
45
46
|
end
|
|
46
47
|
else
|
|
47
48
|
json.self path_for_facet(facet.name, item.value, only_path: false)
|
|
@@ -57,7 +58,7 @@ json.included do
|
|
|
57
58
|
end
|
|
58
59
|
|
|
59
60
|
json.array! search_fields do |(label, key)|
|
|
60
|
-
json.type
|
|
61
|
+
json.type "search_field"
|
|
61
62
|
json.id key
|
|
62
63
|
json.attributes do
|
|
63
64
|
json.label label
|
|
@@ -68,7 +69,7 @@ json.included do
|
|
|
68
69
|
end
|
|
69
70
|
|
|
70
71
|
json.array! active_sort_fields do |key, field|
|
|
71
|
-
json.type
|
|
72
|
+
json.type "sort"
|
|
72
73
|
json.id key
|
|
73
74
|
json.attributes do
|
|
74
75
|
json.label field.label
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
json.links do
|
|
3
4
|
json.self url_for(search_state.to_h.merge(only_path: false))
|
|
4
5
|
json.prev url_for(search_state.to_h.merge(only_path: false, page: @response.prev_page.to_s)) if @response.prev_page
|
|
@@ -19,10 +20,10 @@ json.data do
|
|
|
19
20
|
doc_presenter = document_presenter(document)
|
|
20
21
|
|
|
21
22
|
doc_presenter.fields_to_render.each do |field_name, field|
|
|
22
|
-
json.partial!
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
json.partial! "field", field: field,
|
|
24
|
+
field_name: field_name,
|
|
25
|
+
document_url: document_url,
|
|
26
|
+
doc_presenter: doc_presenter
|
|
26
27
|
end
|
|
27
28
|
end
|
|
28
29
|
|
|
@@ -34,7 +35,7 @@ end
|
|
|
34
35
|
|
|
35
36
|
json.included do
|
|
36
37
|
json.array! @presenter.search_facets do |facet|
|
|
37
|
-
json.type
|
|
38
|
+
json.type "facet"
|
|
38
39
|
json.id facet.name
|
|
39
40
|
json.attributes do
|
|
40
41
|
facet_config = facet_configuration_for_field(facet.name)
|
|
@@ -67,7 +68,7 @@ json.included do
|
|
|
67
68
|
end
|
|
68
69
|
|
|
69
70
|
json.array! search_fields do |(label, key)|
|
|
70
|
-
json.type
|
|
71
|
+
json.type "search_field"
|
|
71
72
|
json.id key
|
|
72
73
|
json.attributes do
|
|
73
74
|
json.label label
|
|
@@ -78,7 +79,7 @@ json.included do
|
|
|
78
79
|
end
|
|
79
80
|
|
|
80
81
|
json.array! active_sort_fields do |key, field|
|
|
81
|
-
json.type
|
|
82
|
+
json.type "sort"
|
|
82
83
|
json.id key
|
|
83
84
|
json.attributes do
|
|
84
85
|
json.label field.label
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
json.links do
|
|
3
4
|
json.self url_for(search_state.to_h.merge(only_path: false))
|
|
4
5
|
json.prev url_for(search_state.to_h.merge(only_path: false, page: @response.prev_page.to_s)) if @response.prev_page
|
|
@@ -19,10 +20,10 @@ json.data do
|
|
|
19
20
|
doc_presenter = index_presenter(document)
|
|
20
21
|
|
|
21
22
|
doc_presenter.fields_to_render.each do |field_name, field|
|
|
22
|
-
json.partial!
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
json.partial! "field", field: field,
|
|
24
|
+
field_name: field_name,
|
|
25
|
+
document_url: document_url,
|
|
26
|
+
doc_presenter: doc_presenter
|
|
26
27
|
end
|
|
27
28
|
end
|
|
28
29
|
|
|
@@ -34,7 +35,7 @@ end
|
|
|
34
35
|
|
|
35
36
|
json.included do
|
|
36
37
|
json.array! @presenter.search_facets do |facet|
|
|
37
|
-
json.type
|
|
38
|
+
json.type "facet"
|
|
38
39
|
json.id facet.name
|
|
39
40
|
json.attributes do
|
|
40
41
|
facet_config = facet_configuration_for_field(facet.name)
|
|
@@ -63,7 +64,7 @@ json.included do
|
|
|
63
64
|
end
|
|
64
65
|
|
|
65
66
|
json.array! search_fields do |(label, key)|
|
|
66
|
-
json.type
|
|
67
|
+
json.type "search_field"
|
|
67
68
|
json.id key
|
|
68
69
|
json.attributes do
|
|
69
70
|
json.label label
|
|
@@ -74,7 +75,7 @@ json.included do
|
|
|
74
75
|
end
|
|
75
76
|
|
|
76
77
|
json.array! active_sort_fields do |key, field|
|
|
77
|
-
json.type
|
|
78
|
+
json.type "sort"
|
|
78
79
|
json.id key
|
|
79
80
|
json.attributes do
|
|
80
81
|
json.label field.label
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
json.links do
|
|
3
4
|
json.self url_for(search_state.to_h.merge(only_path: false))
|
|
4
5
|
json.prev url_for(search_state.to_h.merge(only_path: false, page: @response.prev_page.to_s)) if @response.prev_page
|
|
@@ -19,10 +20,10 @@ json.data do
|
|
|
19
20
|
doc_presenter = document_presenter(document)
|
|
20
21
|
|
|
21
22
|
doc_presenter.fields_to_render.each do |field_name, field|
|
|
22
|
-
json.partial!
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
json.partial! "field", field: field,
|
|
24
|
+
field_name: field_name,
|
|
25
|
+
document_url: document_url,
|
|
26
|
+
doc_presenter: doc_presenter
|
|
26
27
|
end
|
|
27
28
|
end
|
|
28
29
|
|
|
@@ -34,7 +35,7 @@ end
|
|
|
34
35
|
|
|
35
36
|
json.included do
|
|
36
37
|
json.array! @presenter.search_facets do |facet|
|
|
37
|
-
json.type
|
|
38
|
+
json.type "facet"
|
|
38
39
|
json.id facet.name
|
|
39
40
|
json.attributes do
|
|
40
41
|
facet_config = facet_configuration_for_field(facet.name)
|
|
@@ -67,7 +68,7 @@ json.included do
|
|
|
67
68
|
end
|
|
68
69
|
|
|
69
70
|
json.array! search_fields do |(label, key)|
|
|
70
|
-
json.type
|
|
71
|
+
json.type "search_field"
|
|
71
72
|
json.id key
|
|
72
73
|
json.attributes do
|
|
73
74
|
json.label label
|
|
@@ -78,7 +79,7 @@ json.included do
|
|
|
78
79
|
end
|
|
79
80
|
|
|
80
81
|
json.array! active_sort_fields do |key, field|
|
|
81
|
-
json.type
|
|
82
|
+
json.type "sort"
|
|
82
83
|
json.id key
|
|
83
84
|
json.attributes do
|
|
84
85
|
json.label field.label
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<p id="notice"><%= notice %></p>
|
|
2
2
|
|
|
3
|
-
<h1>Bookmarks (<%= current_user.bookmarks.size %>)</h1>
|
|
3
|
+
<h1>Bookmarks (<%= current_user.bookmarks.where(document_type: 'Kithe::Model').size %>)</h1>
|
|
4
4
|
|
|
5
5
|
<p>
|
|
6
6
|
<%= render "admin/documents/result_toggle" %>
|
|
@@ -16,6 +16,6 @@
|
|
|
16
16
|
|
|
17
17
|
<ol id='results' class='list-unstyled' data-controller='results'>
|
|
18
18
|
<% @bookmarks.each_with_index do |bookmark, index| %>
|
|
19
|
-
<%= render 'admin/documents/document', document: bookmark.
|
|
19
|
+
<%= render 'admin/documents/document', document: Kithe::Model.find(bookmark.document_id), index: index %>
|
|
20
20
|
<% end %>
|
|
21
21
|
</ol>
|