bulkrax 9.3.5 → 9.4.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.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -1
  3. data/app/assets/javascripts/bulkrax/application.js +2 -1
  4. data/app/assets/javascripts/bulkrax/bulkrax.js +13 -4
  5. data/app/assets/javascripts/bulkrax/bulkrax_utils.js +96 -0
  6. data/app/assets/javascripts/bulkrax/datatables.js +1 -0
  7. data/app/assets/javascripts/bulkrax/entries.js +17 -10
  8. data/app/assets/javascripts/bulkrax/importers.js.erb +9 -2
  9. data/app/assets/javascripts/bulkrax/importers_stepper.js +2420 -0
  10. data/app/assets/stylesheets/bulkrax/application.css +1 -1
  11. data/app/assets/stylesheets/bulkrax/stepper/_header.scss +83 -0
  12. data/app/assets/stylesheets/bulkrax/stepper/_mixins.scss +26 -0
  13. data/app/assets/stylesheets/bulkrax/stepper/_navigation.scss +103 -0
  14. data/app/assets/stylesheets/bulkrax/stepper/_responsive.scss +46 -0
  15. data/app/assets/stylesheets/bulkrax/stepper/_review.scss +92 -0
  16. data/app/assets/stylesheets/bulkrax/stepper/_settings.scss +106 -0
  17. data/app/assets/stylesheets/bulkrax/stepper/_success.scss +26 -0
  18. data/app/assets/stylesheets/bulkrax/stepper/_summary.scss +171 -0
  19. data/app/assets/stylesheets/bulkrax/stepper/_upload.scss +339 -0
  20. data/app/assets/stylesheets/bulkrax/stepper/_validation.scss +237 -0
  21. data/app/assets/stylesheets/bulkrax/stepper/_variables.scss +46 -0
  22. data/app/assets/stylesheets/bulkrax/stepper.scss +32 -0
  23. data/app/controllers/bulkrax/guided_imports_controller.rb +175 -0
  24. data/app/controllers/bulkrax/importers_controller.rb +28 -31
  25. data/app/controllers/concerns/bulkrax/guided_import_demo_scenarios.rb +201 -0
  26. data/app/controllers/concerns/bulkrax/importer_file_handler.rb +217 -0
  27. data/app/factories/bulkrax/object_factory.rb +3 -2
  28. data/app/factories/bulkrax/valkyrie_object_factory.rb +61 -17
  29. data/app/jobs/bulkrax/importer_job.rb +11 -4
  30. data/app/models/bulkrax/csv_entry.rb +27 -7
  31. data/app/models/bulkrax/entry.rb +4 -0
  32. data/app/models/bulkrax/importer.rb +31 -1
  33. data/app/models/concerns/bulkrax/has_matchers.rb +2 -2
  34. data/app/models/concerns/bulkrax/importer_exporter_behavior.rb +6 -5
  35. data/app/parsers/bulkrax/application_parser.rb +31 -5
  36. data/app/parsers/bulkrax/csv_parser.rb +42 -10
  37. data/app/parsers/concerns/bulkrax/csv_parser/csv_template_generation.rb +73 -0
  38. data/app/parsers/concerns/bulkrax/csv_parser/csv_validation.rb +133 -0
  39. data/app/parsers/concerns/bulkrax/csv_parser/csv_validation_helpers.rb +282 -0
  40. data/app/parsers/concerns/bulkrax/csv_parser/csv_validation_hierarchy.rb +96 -0
  41. data/app/services/bulkrax/csv_template/column_builder.rb +60 -0
  42. data/app/services/bulkrax/csv_template/column_descriptor.rb +58 -0
  43. data/app/services/bulkrax/csv_template/csv_builder.rb +83 -0
  44. data/app/services/bulkrax/csv_template/explanation_builder.rb +57 -0
  45. data/app/services/bulkrax/csv_template/field_analyzer.rb +56 -0
  46. data/app/services/bulkrax/csv_template/file_path_generator.rb +47 -0
  47. data/app/services/bulkrax/csv_template/file_validator.rb +68 -0
  48. data/app/services/bulkrax/csv_template/mapping_manager.rb +55 -0
  49. data/app/services/bulkrax/csv_template/model_loader.rb +50 -0
  50. data/app/services/bulkrax/csv_template/row_builder.rb +35 -0
  51. data/app/services/bulkrax/csv_template/schema_analyzer.rb +70 -0
  52. data/app/services/bulkrax/csv_template/split_formatter.rb +44 -0
  53. data/app/services/bulkrax/csv_template/value_determiner.rb +68 -0
  54. data/app/services/bulkrax/stepper_response_formatter.rb +347 -0
  55. data/app/services/bulkrax/validation_error_csv_builder.rb +99 -0
  56. data/app/validators/bulkrax/csv_row/child_reference.rb +56 -0
  57. data/app/validators/bulkrax/csv_row/circular_reference.rb +71 -0
  58. data/app/validators/bulkrax/csv_row/controlled_vocabulary.rb +74 -0
  59. data/app/validators/bulkrax/csv_row/duplicate_identifier.rb +63 -0
  60. data/app/validators/bulkrax/csv_row/missing_source_identifier.rb +31 -0
  61. data/app/validators/bulkrax/csv_row/parent_reference.rb +59 -0
  62. data/app/validators/bulkrax/csv_row/required_values.rb +64 -0
  63. data/app/views/bulkrax/guided_imports/new.html.erb +567 -0
  64. data/app/views/bulkrax/importers/index.html.erb +6 -1
  65. data/app/views/bulkrax/importers/new.html.erb +1 -1
  66. data/app/views/bulkrax/importers/show.html.erb +17 -1
  67. data/config/i18n-tasks.yml +195 -0
  68. data/config/locales/bulkrax.de.yml +504 -0
  69. data/config/locales/bulkrax.en.yml +459 -233
  70. data/config/locales/bulkrax.es.yml +504 -0
  71. data/config/locales/bulkrax.fr.yml +504 -0
  72. data/config/locales/bulkrax.it.yml +504 -0
  73. data/config/locales/bulkrax.pt-BR.yml +504 -0
  74. data/config/locales/bulkrax.zh.yml +503 -0
  75. data/config/routes.rb +10 -1
  76. data/lib/bulkrax/data/demo_scenarios.json +2235 -0
  77. data/lib/bulkrax/version.rb +1 -1
  78. data/lib/bulkrax.rb +31 -0
  79. metadata +55 -16
  80. data/app/services/bulkrax/sample_csv_service/column_builder.rb +0 -58
  81. data/app/services/bulkrax/sample_csv_service/column_descriptor.rb +0 -56
  82. data/app/services/bulkrax/sample_csv_service/csv_builder.rb +0 -82
  83. data/app/services/bulkrax/sample_csv_service/explanation_builder.rb +0 -51
  84. data/app/services/bulkrax/sample_csv_service/field_analyzer.rb +0 -54
  85. data/app/services/bulkrax/sample_csv_service/file_path_generator.rb +0 -16
  86. data/app/services/bulkrax/sample_csv_service/mapping_manager.rb +0 -36
  87. data/app/services/bulkrax/sample_csv_service/model_loader.rb +0 -40
  88. data/app/services/bulkrax/sample_csv_service/row_builder.rb +0 -33
  89. data/app/services/bulkrax/sample_csv_service/schema_analyzer.rb +0 -69
  90. data/app/services/bulkrax/sample_csv_service/split_formatter.rb +0 -42
  91. data/app/services/bulkrax/sample_csv_service/value_determiner.rb +0 -67
  92. data/app/services/bulkrax/sample_csv_service.rb +0 -78
  93. /data/{app/services → lib}/wings/custom_queries/find_by_source_identifier.rb +0 -0
@@ -1,122 +1,42 @@
1
+ ---
1
2
  en:
2
- simple_form:
3
- labels:
4
- importer:
5
- name: "Name"
6
- admin_set_id: "Administrative Set"
7
- frequency: "Frequency"
8
- limit: "Limit"
9
- parser_klass: "Parser"
10
- exporter:
11
- name: "Name"
12
- export_type: "Type of Export"
13
- export_from: "Export From"
14
- export_source_importer: "Importer"
15
- export_source_collection: "Collection"
16
- export_source_worktype: "Work Type"
17
- limit: "Limit"
18
- generated_metadata?: "Include Generated Metadata?"
19
- include_thumbnails?: "Include Thumbnails?"
20
- date_filter: "Filter By Date"
21
- start_date: "Start Date"
22
- finish_date: "End Date"
23
- work_visibility: "Visibility"
24
- workflow_status: "Status"
25
- parser_klass: "Export Format"
26
- defaults:
27
- visibility: "Visibility"
28
- rights_statement: "Rights Statement"
29
- override_rights_statement: "Override Rights Statement"
30
- file_style: "File Style"
31
- import_file_path: "Import File Path"
32
- base_url: "Base URL"
33
- metadata_prefix: "Metadata Prefix"
34
- metadata_format: "Metadata Format"
35
- record_element: "Record Element"
36
- import_type: "Import Type"
37
- thumbnail_url: "Thumbnail URL"
38
- set: "Set (source)"
39
- hints:
40
- importer:
41
- admin_set_id: "Select the Administrative Set whose policies (such as workflow and access controls) should apply to these imports. If unsure, select the Default Administrative Set."
42
- limit: "Enter any number to run only a subset of records. Leave blank or enter 0 to run all records."
43
- name: "Any name to identify this importer"
44
- frequency: "The frequency with which to run this importer"
45
- parser_fields: "Specific fields for each parser are available only when a parser is selected"
46
- exporter:
47
- generated_metadata?: "These exported fields currently cannot be imported."
48
- include_thumbnails?: "These exported fields currently cannot be imported."
49
- limit: "Enter any number to run only a subset of records. Leave blank or enter 0 to run all records."
50
- name: "Any name to identify this importer"
51
- defaults:
52
- override_rights_statement: "If checked, always use the selected rights statement. If unchecked, use rights or rights_statement from the record and only use the provided value if dc:rights is blank."
53
- default_visibility: "If your CSV includes the visibility field, it will override the default setting."
54
- metadata_prefix: "Such as oai_dc, dcterms or oai_qdc"
55
- record_element: "Provide the xml element name to use to identify the record, or records, eg. ROW - each record in the attached XML is wrapped in a <ROW> tag."
56
- helpers:
57
- action:
58
- importer:
59
- edit_importer: "Edit Importer"
60
- new: "New"
61
- create: "Create"
62
- create_and_import: "Create and Import"
63
- create_and_validate: "Create and Validate"
64
- generate_csv_template: "Generate CSV Import Template"
65
- download_original_file: "Download Original File"
66
- export_errored_entries: "Export Errored Entries"
67
- upload_corrected_entries: "Upload Corrected Entries"
68
- import_corrected_works: "Import Corrected Works"
69
- add_file: "Add file..."
70
- edit: "Edit"
71
- back: "Back"
72
- continue: "Continue"
73
- discard: "Discard"
74
- discard_confirm: "Are you sure?"
75
- build: "Build"
76
- remove_and_build: "Remove and then Build"
77
- update: "Update Importer"
78
- update_and_import: "Update and Import"
79
- update_and_harvest_updated: "Update and Harvest Updated Items"
80
- update_and_re_harvest: "Update and Re-Harvest All Items"
81
- update_metadata: "Update Metadata"
82
- update_metadata_and_files: "Update Metadata and Files"
83
- update_and_replace_files: "Update and Replace Files"
84
- update_and_replace_files_confirm: "Are you sure? This will remove all files before adding them from the import."
85
- remove_and_rerun: "Remove and Rerun"
86
- remove_and_rerun_confirm: "Are you sure? This will delete all the works and any associated files and relationships before re running."
87
- exporter:
88
- new: "New"
89
- create: "Create"
90
- create_and_export: "Create and Export"
91
- download: "Download"
92
- edit: "Edit"
93
- back: "Back"
94
- update: "Update Exporter"
95
- update_and_re_export: "Update and Re-Export All Items"
96
3
  bulkrax:
97
4
  admin:
98
5
  sidebar:
99
6
  exporters: Exporters
100
7
  importers: Importers
101
- headings:
102
- importers: Importers
103
- upload_corrected_entries: "Upload Corrected Entries: %{name}"
104
- cancel: "Cancel"
8
+ cancel: Cancel
9
+ entry:
10
+ labels:
11
+ item_link: Item Link
12
+ item_link_error: Unable to retrieve item (%{message})
13
+ item_no_association: No item associated with this entry or class unknown
14
+ item_not_imported: Item has not yet been imported successfully
15
+ parsed_metadata: Parsed Metadata
16
+ raw_metadata: Raw Metadata
17
+ record_link: "%{record_type} Link"
18
+ unknown: Unknown
105
19
  exporter:
20
+ hints:
21
+ generated_metadata: These exported fields currently cannot be imported.
22
+ include_thumbnails: These exported fields currently cannot be imported.
23
+ limit: leave blank or 0 for all records
106
24
  labels:
107
25
  all: All
108
26
  collection: Collection
27
+ collection_entries: Collection Entries
109
28
  export_format: Export Format
110
29
  export_from: Export From
111
30
  export_source: Export Source
112
31
  export_type: Type of Export
113
32
  field_mapping: Field Mapping
33
+ file_set_entries: File Set Entries
114
34
  filter_by_date: Filter By Date
115
35
  finish_date: End Date
116
36
  full: Metadata and Files
117
- include_thumbnails: Include Thumbnails?
118
37
  generated_metadata: Include Generated Metadata?
119
38
  importer: Importer
39
+ include_thumbnails: Include Thumbnails?
120
40
  limit: Limit
121
41
  metadata: Metadata Only
122
42
  name: Name
@@ -124,39 +44,78 @@ en:
124
44
  parser_klass: Parser
125
45
  start_date: Start Date
126
46
  status: Status
127
- total_work_entries: Total Works
128
47
  total_entries: Total Entries
48
+ total_work_entries: Total Works
129
49
  user: User
130
- worktype: Work Type
131
50
  work_entries: Work Entries
132
- collection_entries: Collection Entries
133
- file_set_entries: File Set Entries
134
51
  workflow_status:
135
- approved: "Approved"
136
- deleted: "Deleted"
137
- in_process: "In Process"
138
- broken_url: "Broken Url"
139
- ingested: "Ingested"
140
- unapproved: "Unapproved"
141
- needs_repair: "Needs Repair"
142
- hints:
143
- include_thumbnails: "These exported fields currently cannot be imported."
144
- generated_metadata: "These exported fields currently cannot be imported."
145
- limit: "leave blank or 0 for all records"
52
+ approved: Approved
53
+ broken_url: Broken Url
54
+ deleted: Deleted
55
+ in_process: In Process
56
+ ingested: Ingested
57
+ needs_repair: Needs Repair
58
+ unapproved: Unapproved
59
+ worktype: Work Type
146
60
  prompts:
147
- export_type: "Please select an export type"
148
- export_from: "Please select an export source"
149
- select_from_list: "Select from the list"
150
- start_typing: "Start typing ..."
61
+ export_from: Please select an export source
62
+ export_type: Please select an export type
63
+ select_from_list: Select from the list
64
+ start_typing: Start typing ...
151
65
  validations:
152
66
  errors_prohibited:
153
- one: "1 error prohibited this exporter from being saved:"
67
+ one: '1 error prohibited this exporter from being saved:'
154
68
  other: "%{count} errors prohibited this exporter from being saved:"
69
+ headings:
70
+ importers: Importers
71
+ upload_corrected_entries: 'Upload Corrected Entries: %{name}'
155
72
  importer:
156
- validations:
157
- errors_prohibited:
158
- one: "1 error prohibited this importer from being saved:"
159
- other: "%{count} errors prohibited this importer from being saved:"
73
+ bagit:
74
+ bags_to_import: 'Bag or Bags to Import:'
75
+ file_style:
76
+ cloud: Add Cloud File
77
+ server_path: Specify a Path on the Server
78
+ upload: Upload a File
79
+ file_upload_hint: File upload and Cloud File upload must be a Zip file containing a single BagIt Bag, or a folder containing multiple BagIt Bags.
80
+ server_path_hint: The Server Path can point to a BagIt Bag, a folder containing BagIt Bags, or a zip file containing either.
81
+ visibility:
82
+ institution: Institution
83
+ private: Private
84
+ public: Public
85
+ browse_everything:
86
+ add_cloud_files: Add Cloud Files
87
+ csv:
88
+ add_csv_to_import: 'Add CSV or ZIP File to Import:'
89
+ add_files_hint: Choose files to upload. The filenames must be unique, and the filenames must be referenced in a column called 'file' in the accompanying CSV file.
90
+ add_files_to_import: 'Add Files to Import:'
91
+ file_style:
92
+ existing_entries: Existing Entries
93
+ server_path: Specify a Path on the Server
94
+ upload: Upload a File
95
+ labels:
96
+ default_visibility: Default Visibility
97
+ visibility:
98
+ institution: Institution
99
+ private: Private
100
+ public: Public
101
+ edit_form:
102
+ modal_title: Options for Updating the Importer
103
+ remove_and_rerun_hint: Remove all works and then run the import again from a clean slate. This will remove all files and associations and any edits made since the last import will be lost.
104
+ update_and_harvest_hint: Update the values in the importer form and update items that have changed at the source.
105
+ update_and_import_hint: Update the values in the importer form and run the importer for the first time.
106
+ update_and_re_harvest_hint: Update the values in the importer form and recreate all items from the source.
107
+ update_and_replace_files_hint: Update the values in the importer form and update the metadata. Completely removes all files attached to works for this importer and recreates the files from scratch.
108
+ update_metadata_and_files_hint: Update the values in the importer form and update the metadata and files for all works. Creates new versions of the files and retains the old versions.
109
+ update_metadata_hint: Update the values in the importer form and update the metadata for all works. Do not update any files.
110
+ update_only_hint: Only update the values in the importer form. Do not import metadata or files for any works or collections.
111
+ update_only_no_update_hint: Only update the values in the importer form. Do not update metadata or files for any works or collections.
112
+ file_uploader:
113
+ add_files: Add Files
114
+ cancel_upload: Cancel Upload
115
+ dropzone: Drop files here to upload
116
+ hints:
117
+ default_visibility: If your CSV includes the visibility field, it will override the default setting.
118
+ override_rights_statement: If checked, always use the selected rights statement. If unchecked, use rights or rights_statement from the record and only use the provided value if dc:rights is blank.
160
119
  labels:
161
120
  admin_set: Administrative set
162
121
  collection_entries: Collection Entries
@@ -175,30 +134,10 @@ en:
175
134
  type: Type
176
135
  user: User
177
136
  work_entries: Work Entries
178
- xml:
179
- hints:
180
- record_element: "Provide the xml element name to use to identify the record, or records, eg. ROW - each record in the attached XML is wrapped in a <ROW> tag."
181
- override_rights_statement: "If checked, always use the selected rights statement. If unchecked, use rights or rights_statement from the record and only use the provided value if dc:rights is blank."
182
- file_upload_hint: "File upload and Cloud File upload MUST be a either a single XML file (for metadata only import) OR a Zip file containing the XML files and data files, each in a separate folder."
183
- server_path_hint: "The Server Path can point to a folder containing XML files and data files to import, or direct to the XML file itself."
184
- labels:
185
- visibility: "Visibility"
186
- xml_and_files: "XML and files to Import:"
187
- import_type:
188
- single: "Single Work per Metadata File"
189
- multiple: "Multiple Works per Metadata File"
190
- visibility:
191
- public: "Public"
192
- private: "Private"
193
- institution: "Institution"
194
- file_style:
195
- upload: "Upload a File"
196
- server_path: "Specify a Path on the Server"
197
- cloud: "Add Cloud File"
198
137
  oai:
199
138
  hints:
200
- metadata_prefix: "Such as oai_dc, dcterms or oai_qdc"
201
- override_rights_statement: "If checked, always use the selected rights statement. If unchecked, use dc:rights from the record and only use the provided value if dc:rights is blank."
139
+ metadata_prefix: Such as oai_dc, dcterms or oai_qdc
140
+ override_rights_statement: If checked, always use the selected rights statement. If unchecked, use dc:rights from the record and only use the provided value if dc:rights is blank.
202
141
  thumbnail_url_html: |
203
142
  <p>
204
143
  The Thumbnail URL allows for basic templating and substitution on any identified information in to the url. For example:
@@ -210,106 +149,393 @@ en:
210
149
  http://commons.ptsem.edu/?cover=&lt;&#37;= record.header.identifier.split(':').last &#37;&gt;&amp;size=L
211
150
  </p>
212
151
  labels:
213
- set: "Set (source)"
214
- visibility:
215
- public: "Public"
216
- private: "Private"
217
- institution: "Institution"
218
- refresh_sets: "Refresh Sets"
219
- bagit:
152
+ set: Set (source)
153
+ refresh_sets: Refresh Sets
220
154
  visibility:
221
- public: "Public"
222
- private: "Private"
223
- institution: "Institution"
224
- bags_to_import: "Bag or Bags to Import:"
225
- file_upload_hint: "File upload and Cloud File upload must be a Zip file containing a single BagIt Bag, or a folder containing multiple BagIt Bags."
226
- server_path_hint: "The Server Path can point to a BagIt Bag, a folder containing BagIt Bags, or a zip file containing either."
155
+ institution: Institution
156
+ private: Private
157
+ public: Public
158
+ upload_corrected_entries:
159
+ click_here: click here
160
+ csv_only: Only CSV files are allowed.
161
+ instructions_html: Upload <b>only</b> the corrected entries for the <b>%{name}</b> importer. To export failed entries for correction,
162
+ guided_import:
163
+ breadcrumb: Guided Import
164
+ flash:
165
+ demo_not_available: Demo scenarios not available
166
+ import_started: Import started successfully.
167
+ js:
168
+ admin_set_prompt: Select an admin set...
169
+ already_uploaded: 'The following files were already uploaded:'
170
+ appears_in_collections: Appears in %{count} collections
171
+ circular_reference: Circular reference detected
172
+ csv_limit: 'Only 1 CSV file allowed. The following files were not added:'
173
+ demo_data_not_loaded: Demo data not loaded. Try selecting a scenario again.
174
+ demo_load_failed: Failed to load demo scenarios
175
+ demo_network_error: Network error - please check your connection
176
+ demo_server_error: Server error while loading demo scenarios
177
+ demo_timeout: Request timed out while loading demo scenarios
178
+ detected_in_zip: detected in ZIP
179
+ file_upload_error: File Upload Error
180
+ files_too_large: Files are too large. Please reduce file size and try again.
181
+ gauge_import_size: 'Import Size: %{count} items'
182
+ gauge_large: Large
183
+ gauge_large_msg: Large imports take longer and are harder to debug. We strongly recommend splitting into batches of %{limit} or fewer.
184
+ gauge_moderate: Moderate
185
+ gauge_moderate_msg: Consider splitting into smaller batches for easier error resolution.
186
+ download_validation_errors_csv: Download errors CSV
187
+ gauge_optimal: Optimal
188
+ gauge_optimal_msg: Great! Smaller imports are easier to validate and troubleshoot.
189
+ hierarchy_too_deep: Hierarchy too deep (max %{max} levels)
190
+ import_hierarchy: Import Hierarchy
191
+ import_name_prefix: 'CSV Import - '
192
+ invalid_file_format: Invalid file format. Please check your files and try again.
193
+ invalid_format: Invalid file format. Only .csv and .zip files are allowed.
194
+ max_files: Maximum of %{count} files reached (1 CSV and 1 ZIP).
195
+ max_files_added: Maximum of %{count} files allowed (1 CSV and 1 ZIP). Only the first %{added} file(s) were added.
196
+ network_error: Network error - please check your connection and try again.
197
+ no_extension: no extension
198
+ not_selected: Not selected
199
+ only_first_files: Only the first %{count} files have been uploaded. You can upload up to %{max} files (1 CSV and 1 ZIP).
200
+ only_one_additional: Only 1 additional file can be added. The first file has been added.
201
+ rejected_files: 'The following files were rejected:'
202
+ remove_file: Remove file
203
+ render_error: Validation completed but results could not be displayed. Please try again.
204
+ review_admin_set: 'Admin Set:'
205
+ review_first_n_records: first %{count} records
206
+ review_limit: 'Limit:'
207
+ review_name: 'Name:'
208
+ review_rights: 'Rights:'
209
+ review_skipped: Validation was skipped — record counts unavailable
210
+ review_total: "%{total} total — %{collections} collections, %{works} works, %{file_sets} file sets"
211
+ review_visibility: 'Visibility:'
212
+ server_error: Server error during validation. Please try again or contact support.
213
+ existing_record_badge: existing
214
+ existing_record_title: This record already exists in the repository and will be linked during import
215
+ shared_badge: shared
216
+ starting: Starting...
217
+ upload_csv_and_zip: CSV + files uploaded separately
218
+ upload_csv_only: No ZIP uploaded — files will be matched from server paths or you can add more files
219
+ upload_single_package: Single package with CSV and files
220
+ upload_zip_only: ZIP file uploaded — validation will check for CSV content
221
+ uploaded_file: Uploaded File
222
+ uploaded_files: Uploaded Files (%{count})
223
+ validate_path: Validate Files from Import Path
224
+ validate_upload: Validate Files from Upload
225
+ validated: Validated
226
+ validating: Validating...
227
+ validation_failed: Validation failed. Please try again.
228
+ validation_timeout: Validation timed out. Your files may be too large. Please try with smaller files or contact support.
229
+ visibility_institution: Institution
230
+ visibility_private: Private
231
+ visibility_public: Public
232
+ zip_limit: 'Only 1 ZIP file allowed. The following files were not added:'
233
+ nav:
234
+ back: Back
235
+ clear_start_over: Clear & Start Over
236
+ next_step: Next
237
+ skip_validation: Skip validation
238
+ start_import: Start Import
239
+ feedback_link: Report a Bug / Feedback
240
+ page_subtitle: Import collections, works, and files via CSV
241
+ page_title: Start a Bulk Import
242
+ step1:
243
+ add_another: Add another file
244
+ add_another_hint_html: Drop a CSV or ZIP file here, or click to <strong class="text-primary">browse</strong>
245
+ admin_set: Admin Set
246
+ admin_set_hint: Admin sets are required for imports and CSV template downloads
247
+ admin_set_prompt: Select an admin set...
248
+ collections: Collections
249
+ description_html: Upload a metadata CSV and a ZIP file containing your files (max 2 uploads), or a single ZIP containing both — if using a single ZIP, the metadata CSV must be the only <code>.csv</code> file at the top level.<br />You can also use a file path on your server.
250
+ download_template: Download a CSV template for your tenant
251
+ dropzone_csv_hint: ".csv — metadata only"
252
+ dropzone_hint: Upload CSV and ZIP (max 2 uploads)
253
+ dropzone_main_html: Drag & drop your files here, or <strong class="text-primary">browse</strong>
254
+ dropzone_zip_hint: ".zip — files or metadata CSV + files"
255
+ file_path_hint: CSV or ZIP file
256
+ file_path_label: Enter the path to the files on your server
257
+ file_path_placeholder: "/path/to/import.csv"
258
+ file_sets: File Sets
259
+ import_path: Import Path
260
+ import_summary: Import Summary
261
+ title: Import Your Files
262
+ upload_files: Upload Files
263
+ file_input_label: Upload CSV or ZIP file
264
+ validate_path: Validate Files from Import Path
265
+ validate_upload: Validate Files from Upload
266
+ warning_ack: I acknowledge these warnings or errors and want to proceed with the import.
267
+ works: Works
268
+ step2:
269
+ default_rights: Default Rights Statement
270
+ default_visibility: Default Visibility
271
+ description: Set parameters that apply to all records in this import.
272
+ import_name: Import Name
273
+ import_name_prefix: 'CSV Import - '
274
+ optional_settings: Optional Settings
275
+ rights_none: None
276
+ rights_required_alert_html: Your CSV does not include a <strong>rights_statement</strong> column. Select a Default Rights Statement below to apply to all records.
277
+ rights_skipped_hint_html: Validation was skipped. If your CSV does not include a <strong>rights_statement</strong> column, you can select a Default Rights Statement below to apply to all records.
278
+ test_limit: Test Limited Records
279
+ test_limit_placeholder: Import only the first N records for testing
280
+ title: Configure Import Settings
281
+ visibility_hint: Applied to records that don't specify a visibility.
282
+ visibility_institution: Institution
283
+ visibility_institution_desc: Logged-in users
284
+ visibility_private: Private
285
+ visibility_private_desc: Administrators only
286
+ visibility_public: Public
287
+ visibility_public_desc: Visible to everyone
288
+ step3:
289
+ background_note: This process will run in the background. You can monitor progress in the Import Queue.
290
+ description: Confirm your import details before starting.
291
+ large_import_message_html: You're about to import <span class="total-items-count">%{count}</span> items. Large imports take longer and are harder to troubleshoot. Consider splitting into smaller batches.
292
+ large_import_warning: Large Import Warning
293
+ ready_to_import: Ready to Import
294
+ section_files: Files
295
+ section_records: Records
296
+ section_settings: Settings
297
+ section_warnings: Warnings
298
+ title: Review & Start Import
299
+ steps:
300
+ configure_settings: Configure Settings
301
+ review_start: Review & Start
302
+ upload_validate: Upload & Validate
303
+ stepper_response_formatter:
304
+ row_errors_issue:
305
+ description: "The following issues exist with data in your CSV:"
306
+ row_label: "Row %{row} · %{column}"
307
+ title_errors: Row Validation Errors
308
+ title_warnings: Row Validation Warnings
309
+ success:
310
+ message: Your import is now processing in the background. You'll be notified when it's complete.
311
+ start_another: Start Another Import
312
+ title: Import Started
313
+ view_queue: View Import Queue
314
+ validation:
315
+ columns_detected: "%{columns} columns detected · %{records} records found"
316
+ controlled_vocabulary_validator:
317
+ errors:
318
+ message: "'%{value}' is not a recognized term for '%{field}'."
319
+ suggestion: Check the controlled vocabulary for valid terms.
320
+ critical_errors: Critical errors must be fixed before import.
321
+ did_you_mean: Did you mean "%{suggestion}"?
322
+ duplicate_identifier_validator:
323
+ errors:
324
+ message: "Duplicate %{field} '%{value}' — also appears in row %{original_row}."
325
+ suggestion: "Each %{field} must be unique within the CSV."
326
+ existing_source_identifier_validator:
327
+ warnings:
328
+ message: "'%{value}' matches an existing repository record — this row will update it."
329
+ suggestion: "If you did not intend to update an existing record, change the %{field} value."
330
+ failed: Validation Failed
331
+ file_path_not_exist: File path does not exist
332
+ file_references_title: File References
333
+ files_found_in_zip: "%{found} of %{total} files found in ZIP."
334
+ files_missing_from_zip: "%{count} %{files_word} referenced in your CSV but missing from the ZIP:"
335
+ files_referenced: "%{count} files referenced in CSV not found in import."
336
+ missing_from_zip: missing from ZIP
337
+ missing_source_identifier_validator:
338
+ errors:
339
+ message: "Row is missing a value for '%{field}'."
340
+ suggestion: "Add a '%{field}' value to this row, or configure Bulkrax to generate source identifiers automatically."
341
+ missing_required_desc: 'These required columns must be added to your CSV:'
342
+ missing_required_hint: add this column to your CSV
343
+ missing_required_title: Missing Required Fields
344
+ missing_rights_desc: Your CSV does not include a rights_statement column. You can add it to your CSV or select a Default Rights Statement in the next step.
345
+ multiple_csv_same_dir: Multiple CSV files found in the same directory within ZIP
346
+ multiple_csv_same_level: Multiple CSV files found at the same level within ZIP
347
+ no_csv_in_zip: No CSV files found in ZIP
348
+ no_csv_uploaded: No CSV metadata file uploaded
349
+ no_files_uploaded: No files uploaded
350
+ no_zip_desc: No ZIP file uploaded. Ensure files are accessible on the server or upload a ZIP.
351
+ parent_reference_validator:
352
+ errors:
353
+ message: "Referenced parent '%{value}' does not exist as a %{field} in this CSV."
354
+ suggestion: "Check for typos or add the parent record."
355
+ child_reference_validator:
356
+ errors:
357
+ message: "Referenced child '%{value}' does not exist as a %{field} in this CSV."
358
+ suggestion: "Check for typos or add the child record."
359
+ circular_reference_validator:
360
+ errors:
361
+ message: "'%{value}' is part of a circular parent-child relationship."
362
+ suggestion: "Review the parent/child columns and remove the incorrect references."
363
+ passed: Validation Passed
364
+ passed_warnings: Validation Passed with Warnings
365
+ recognized_fields: 'Recognized fields: %{fields}'
366
+ default_work_type_notice:
367
+ message_column_missing: "No model column found — all rows will be imported as '%{default_work_type}'."
368
+ message_column_empty: "No model provided — all rows will be imported as '%{default_work_type}'."
369
+ suggestion_column_empty: "Add model values to the 'model' column in your CSV if you want to use a different work type for some rows."
370
+ suggestion_column_missing: "Add a 'model' column to your CSV if you want to use a different work type for some rows."
371
+ default_work_type_validator:
372
+ warnings:
373
+ message: "No model specified — this row will be imported as '%{default_work_type}'."
374
+ suggestion: "Specify a model value in the 'model' column for this row if you want to use a different work type."
375
+ required_field_validator:
376
+ errors:
377
+ message: "Field '%{field}' is required but is empty for this row."
378
+ suggestion: "Add a value for '%{field}'."
379
+ unable_to_process: Unable to process files for validation
380
+ empty_column: 'Column %{column} (no header)'
381
+ notices_desc: 'These notices may affect how your CSV is imported:'
382
+ notices_title: Import Notices
383
+ unrecognized_desc: 'These columns will be ignored during import:'
384
+ unrecognized_title: Unrecognized Fields
385
+ validations:
386
+ errors_prohibited:
387
+ one: '1 error prohibited this importer from being saved:'
388
+ other: "%{count} errors prohibited this importer from being saved:"
389
+ xml:
227
390
  file_style:
228
- upload: "Upload a File"
229
- server_path: "Specify a Path on the Server"
230
- cloud: "Add Cloud File"
231
- hints:
232
- override_rights_statement: "If checked, always use the selected rights statement. If unchecked, use rights or rights_statement from the record and only use the provided value if dc:rights is blank."
233
- default_visibility: "If your CSV includes the visibility field, it will override the default setting."
234
- browse_everything:
235
- add_cloud_files: "Add Cloud Files"
236
- edit_form:
237
- modal_title: "Options for Updating the Importer"
238
- update_only_hint: "Only update the values in the importer form. Do not import metadata or files for any works or collections."
239
- update_only_no_update_hint: "Only update the values in the importer form. Do not update metadata or files for any works or collections."
240
- update_and_import_hint: "Update the values in the importer form and run the importer for the first time."
241
- update_and_harvest_hint: "Update the values in the importer form and update items that have changed at the source."
242
- update_and_re_harvest_hint: "Update the values in the importer form and recreate all items from the source."
243
- update_metadata_hint: "Update the values in the importer form and update the metadata for all works. Do not update any files."
244
- update_metadata_and_files_hint: "Update the values in the importer form and update the metadata and files for all works. Creates new versions of the files and retains the old versions."
245
- update_and_replace_files_hint: "Update the values in the importer form and update the metadata. Completely removes all files attached to works for this importer and recreates the files from scratch."
246
- remove_and_rerun_hint: "Remove all works and then run the import again from a clean slate. This will remove all files and associations and any edits made since the last import will be lost."
247
- csv:
391
+ cloud: Add Cloud File
392
+ server_path: Specify a Path on the Server
393
+ upload: Upload a File
394
+ hints:
395
+ file_upload_hint: File upload and Cloud File upload MUST be a either a single XML file (for metadata only import) OR a Zip file containing the XML files and data files, each in a separate folder.
396
+ override_rights_statement: If checked, always use the selected rights statement. If unchecked, use rights or rights_statement from the record and only use the provided value if dc:rights is blank.
397
+ record_element: Provide the xml element name to use to identify the record, or records, eg. ROW - each record in the attached XML is wrapped in a <ROW> tag.
398
+ server_path_hint: The Server Path can point to a folder containing XML files and data files to import, or direct to the XML file itself.
399
+ import_type:
400
+ multiple: Multiple Works per Metadata File
401
+ single: Single Work per Metadata File
248
402
  labels:
249
- default_visibility: "Default Visibility"
403
+ visibility: Visibility
404
+ xml_and_files: 'XML and files to Import:'
250
405
  visibility:
251
- public: "Public"
252
- private: "Private"
253
- institution: "Institution"
254
- add_csv_to_import: "Add CSV or ZIP File to Import:"
255
- file_style:
256
- upload: "Upload a File"
257
- server_path: "Specify a Path on the Server"
258
- existing_entries: "Existing Entries"
259
- add_files_to_import: "Add Files to Import:"
260
- add_files_hint: "Choose files to upload. The filenames must be unique, and the filenames must be referenced in a column called 'file' in the accompanying CSV file."
261
- file_uploader:
262
- add_files: "Add Files"
263
- cancel_upload: "Cancel Upload"
264
- dropzone: "Drop files here to upload"
265
- upload_corrected_entries:
266
- instructions_html: "Upload <b>only</b> the corrected entries for the <b>%{name}</b> importer. To export failed entries for correction,"
267
- click_here: "click here"
268
- csv_only: "Only CSV files are allowed."
406
+ institution: Institution
407
+ private: Private
408
+ public: Public
269
409
  shared:
270
- field_mapping:
271
- heading: "Field mapping:"
272
- full: "Full"
273
- raw: "Raw"
274
410
  errors:
275
- errors_heading: "Errors:"
276
- full: "Full"
277
- raw: "Raw"
278
- errored_at: "Errored at:"
279
- error: "Error:"
280
- error_trace: "Error Trace:"
281
- succeeded_at: "Succeeded At:"
282
- not_yet_imported: "Item has not yet been imported successfully"
283
- not_yet_exported: "Item has not yet been exported successfully"
284
- entry:
285
- labels:
286
- parsed_metadata: "Parsed Metadata"
287
- raw_metadata: "Raw Metadata"
288
- unknown: "Unknown"
289
- item_link: "Item Link"
290
- item_not_imported: "Item has not yet been imported successfully"
291
- item_link_error: "Unable to retrieve item (%{message})"
292
- item_no_association: "No item associated with this entry or class unknown"
293
- record_link: "%{record_type} Link"
411
+ error: 'Error:'
412
+ error_trace: 'Error Trace:'
413
+ errored_at: 'Errored at:'
414
+ errors_heading: 'Errors:'
415
+ full: Full
416
+ not_yet_exported: Item has not yet been exported successfully
417
+ not_yet_imported: Item has not yet been imported successfully
418
+ raw: Raw
419
+ succeeded_at: 'Succeeded At:'
420
+ field_mapping:
421
+ full: Full
422
+ heading: 'Field mapping:'
423
+ raw: Raw
294
424
  table_header:
295
425
  labels:
296
- identifier: Identifier
297
- entry_id: Entry ID
298
- status: Status
299
- type: Type
300
- updated_at: Updated At
301
- errors: Errors
302
- status_set_at: Status Set At
303
426
  actions: Actions
304
- name: Name
305
427
  date_exported: Date Exported
306
428
  downloadable_files: Downloadable Files
307
- last_run: Last Run
308
- next_run: Next Run
429
+ entries_deleted_upstream: Entries Deleted Upstream
309
430
  entries_enqueued: Entries Enqueued
310
- entries_processed: Entries Processed
311
431
  entries_failed: Entries Failed
312
- entries_deleted_upstream: Entries Deleted Upstream
432
+ entries_processed: Entries Processed
433
+ entry_id: Entry ID
434
+ errors: Errors
435
+ identifier: Identifier
436
+ last_run: Last Run
437
+ name: Name
438
+ next_run: Next Run
439
+ status: Status
440
+ status_set_at: Status Set At
313
441
  total_collection_entries: Total Collection Entries
314
- total_work_entries: Total Work Entries
315
442
  total_file_set_entries: Total File Set Entries
443
+ total_work_entries: Total Work Entries
444
+ type: Type
445
+ updated_at: Updated At
446
+ helpers:
447
+ action:
448
+ exporter:
449
+ back: Back
450
+ create: Create
451
+ create_and_export: Create and Export
452
+ download: Download
453
+ edit: Edit
454
+ new: New
455
+ update: Update Exporter
456
+ update_and_re_export: Update and Re-Export All Items
457
+ importer:
458
+ add_file: Add file...
459
+ back: Back
460
+ build: Build
461
+ continue: Continue
462
+ create: Create
463
+ create_and_import: Create and Import
464
+ create_and_validate: Create and Validate
465
+ discard: Discard
466
+ discard_confirm: Are you sure?
467
+ download_original_file: Download Original File
468
+ download_original_files: Download Original Files
469
+ edit: Edit
470
+ edit_importer: Edit Importer
471
+ export_errored_entries: Export Errored Entries
472
+ generate_csv_template: Generate CSV Import Template
473
+ import_corrected_works: Import Corrected Works
474
+ new: Advanced Import
475
+ guided_import_new: Guided Import
476
+ remove_and_build: Remove and then Build
477
+ remove_and_rerun: Remove and Rerun
478
+ remove_and_rerun_confirm: Are you sure? This will delete all the works and any associated files and relationships before re running.
479
+ update: Update Importer
480
+ update_and_harvest_updated: Update and Harvest Updated Items
481
+ update_and_import: Update and Import
482
+ update_and_re_harvest: Update and Re-Harvest All Items
483
+ update_and_replace_files: Update and Replace Files
484
+ update_and_replace_files_confirm: Are you sure? This will remove all files before adding them from the import.
485
+ update_metadata: Update Metadata
486
+ update_metadata_and_files: Update Metadata and Files
487
+ upload_corrected_entries: Upload Corrected Entries
488
+ simple_form:
489
+ hints:
490
+ defaults:
491
+ default_visibility: If your CSV includes the visibility field, it will override the default setting.
492
+ metadata_prefix: Such as oai_dc, dcterms or oai_qdc
493
+ override_rights_statement: If checked, always use the selected rights statement. If unchecked, use rights or rights_statement from the record and only use the provided value if dc:rights is blank.
494
+ record_element: Provide the xml element name to use to identify the record, or records, eg. ROW - each record in the attached XML is wrapped in a <ROW> tag.
495
+ exporter:
496
+ generated_metadata?: These exported fields currently cannot be imported.
497
+ include_thumbnails?: These exported fields currently cannot be imported.
498
+ limit: Enter any number to run only a subset of records. Leave blank or enter 0 to run all records.
499
+ name: Any name to identify this importer
500
+ importer:
501
+ admin_set_id: Select the Administrative Set whose policies (such as workflow and access controls) should apply to these imports. If unsure, select the Default Administrative Set.
502
+ frequency: The frequency with which to run this importer
503
+ limit: Enter any number to run only a subset of records. Leave blank or enter 0 to run all records.
504
+ name: Any name to identify this importer
505
+ parser_fields: Specific fields for each parser are available only when a parser is selected
506
+ labels:
507
+ defaults:
508
+ base_url: Base URL
509
+ file_style: File Style
510
+ import_file_path: Import File Path
511
+ import_type: Import Type
512
+ metadata_format: Metadata Format
513
+ metadata_prefix: Metadata Prefix
514
+ override_rights_statement: Override Rights Statement
515
+ record_element: Record Element
516
+ rights_statement: Rights Statement
517
+ set: Set (source)
518
+ thumbnail_url: Thumbnail URL
519
+ visibility: Visibility
520
+ exporter:
521
+ date_filter: Filter By Date
522
+ export_from: Export From
523
+ export_source_collection: Collection
524
+ export_source_importer: Importer
525
+ export_source_worktype: Work Type
526
+ export_type: Type of Export
527
+ finish_date: End Date
528
+ generated_metadata?: Include Generated Metadata?
529
+ include_thumbnails?: Include Thumbnails?
530
+ limit: Limit
531
+ name: Name
532
+ parser_klass: Export Format
533
+ start_date: Start Date
534
+ work_visibility: Visibility
535
+ workflow_status: Status
536
+ importer:
537
+ admin_set_id: Administrative Set
538
+ frequency: Frequency
539
+ limit: Limit
540
+ name: Name
541
+ parser_klass: Parser