bulkrax 9.3.4 → 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 (104) 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/import_export.scss +9 -2
  12. data/app/assets/stylesheets/bulkrax/stepper/_header.scss +83 -0
  13. data/app/assets/stylesheets/bulkrax/stepper/_mixins.scss +26 -0
  14. data/app/assets/stylesheets/bulkrax/stepper/_navigation.scss +103 -0
  15. data/app/assets/stylesheets/bulkrax/stepper/_responsive.scss +46 -0
  16. data/app/assets/stylesheets/bulkrax/stepper/_review.scss +92 -0
  17. data/app/assets/stylesheets/bulkrax/stepper/_settings.scss +106 -0
  18. data/app/assets/stylesheets/bulkrax/stepper/_success.scss +26 -0
  19. data/app/assets/stylesheets/bulkrax/stepper/_summary.scss +171 -0
  20. data/app/assets/stylesheets/bulkrax/stepper/_upload.scss +339 -0
  21. data/app/assets/stylesheets/bulkrax/stepper/_validation.scss +237 -0
  22. data/app/assets/stylesheets/bulkrax/stepper/_variables.scss +46 -0
  23. data/app/assets/stylesheets/bulkrax/stepper.scss +32 -0
  24. data/app/controllers/bulkrax/guided_imports_controller.rb +175 -0
  25. data/app/controllers/bulkrax/importers_controller.rb +34 -28
  26. data/app/controllers/concerns/bulkrax/guided_import_demo_scenarios.rb +201 -0
  27. data/app/controllers/concerns/bulkrax/importer_file_handler.rb +217 -0
  28. data/app/factories/bulkrax/object_factory.rb +3 -2
  29. data/app/factories/bulkrax/valkyrie_object_factory.rb +61 -17
  30. data/app/jobs/bulkrax/export_work_job.rb +1 -3
  31. data/app/jobs/bulkrax/importer_job.rb +11 -4
  32. data/app/models/bulkrax/csv_entry.rb +27 -7
  33. data/app/models/bulkrax/entry.rb +4 -0
  34. data/app/models/bulkrax/importer.rb +31 -1
  35. data/app/models/concerns/bulkrax/has_matchers.rb +2 -2
  36. data/app/models/concerns/bulkrax/importer_exporter_behavior.rb +6 -5
  37. data/app/parsers/bulkrax/application_parser.rb +31 -5
  38. data/app/parsers/bulkrax/csv_parser.rb +42 -10
  39. data/app/parsers/concerns/bulkrax/csv_parser/csv_template_generation.rb +73 -0
  40. data/app/parsers/concerns/bulkrax/csv_parser/csv_validation.rb +133 -0
  41. data/app/parsers/concerns/bulkrax/csv_parser/csv_validation_helpers.rb +282 -0
  42. data/app/parsers/concerns/bulkrax/csv_parser/csv_validation_hierarchy.rb +96 -0
  43. data/app/services/bulkrax/csv_template/column_builder.rb +60 -0
  44. data/app/services/bulkrax/csv_template/column_descriptor.rb +58 -0
  45. data/app/services/bulkrax/csv_template/csv_builder.rb +83 -0
  46. data/app/services/bulkrax/csv_template/explanation_builder.rb +57 -0
  47. data/app/services/bulkrax/csv_template/field_analyzer.rb +56 -0
  48. data/app/services/bulkrax/csv_template/file_path_generator.rb +47 -0
  49. data/app/services/bulkrax/csv_template/file_validator.rb +68 -0
  50. data/app/services/bulkrax/csv_template/mapping_manager.rb +55 -0
  51. data/app/services/bulkrax/csv_template/model_loader.rb +50 -0
  52. data/app/services/bulkrax/csv_template/row_builder.rb +35 -0
  53. data/app/services/bulkrax/csv_template/schema_analyzer.rb +70 -0
  54. data/app/services/bulkrax/csv_template/split_formatter.rb +44 -0
  55. data/app/services/bulkrax/csv_template/value_determiner.rb +68 -0
  56. data/app/services/bulkrax/stepper_response_formatter.rb +347 -0
  57. data/app/services/bulkrax/validation_error_csv_builder.rb +99 -0
  58. data/app/validators/bulkrax/csv_row/child_reference.rb +56 -0
  59. data/app/validators/bulkrax/csv_row/circular_reference.rb +71 -0
  60. data/app/validators/bulkrax/csv_row/controlled_vocabulary.rb +74 -0
  61. data/app/validators/bulkrax/csv_row/duplicate_identifier.rb +63 -0
  62. data/app/validators/bulkrax/csv_row/missing_source_identifier.rb +31 -0
  63. data/app/validators/bulkrax/csv_row/parent_reference.rb +59 -0
  64. data/app/validators/bulkrax/csv_row/required_values.rb +64 -0
  65. data/app/views/bulkrax/entries/_parsed_metadata.html.erb +1 -1
  66. data/app/views/bulkrax/entries/_raw_metadata.html.erb +1 -1
  67. data/app/views/bulkrax/entries/show.html.erb +6 -6
  68. data/app/views/bulkrax/exporters/_form.html.erb +19 -43
  69. data/app/views/bulkrax/exporters/edit.html.erb +2 -2
  70. data/app/views/bulkrax/exporters/index.html.erb +5 -5
  71. data/app/views/bulkrax/exporters/new.html.erb +3 -5
  72. data/app/views/bulkrax/exporters/show.html.erb +3 -3
  73. data/app/views/bulkrax/guided_imports/new.html.erb +567 -0
  74. data/app/views/bulkrax/importers/_bagit_fields.html.erb +9 -9
  75. data/app/views/bulkrax/importers/_browse_everything.html.erb +1 -1
  76. data/app/views/bulkrax/importers/_csv_fields.html.erb +11 -11
  77. data/app/views/bulkrax/importers/_edit_form_buttons.html.erb +23 -23
  78. data/app/views/bulkrax/importers/_edit_item_buttons.html.erb +2 -2
  79. data/app/views/bulkrax/importers/_file_uploader.html.erb +3 -3
  80. data/app/views/bulkrax/importers/_form.html.erb +4 -5
  81. data/app/views/bulkrax/importers/_oai_fields.html.erb +8 -18
  82. data/app/views/bulkrax/importers/_xml_fields.html.erb +13 -13
  83. data/app/views/bulkrax/importers/edit.html.erb +2 -2
  84. data/app/views/bulkrax/importers/index.html.erb +19 -14
  85. data/app/views/bulkrax/importers/new.html.erb +10 -9
  86. data/app/views/bulkrax/importers/show.html.erb +23 -7
  87. data/app/views/bulkrax/importers/upload_corrected_entries.html.erb +6 -6
  88. data/app/views/bulkrax/shared/_bulkrax_errors.html.erb +11 -11
  89. data/app/views/bulkrax/shared/_bulkrax_field_mapping.html.erb +3 -3
  90. data/config/i18n-tasks.yml +195 -0
  91. data/config/locales/bulkrax.de.yml +504 -0
  92. data/config/locales/bulkrax.en.yml +487 -28
  93. data/config/locales/bulkrax.es.yml +504 -0
  94. data/config/locales/bulkrax.fr.yml +504 -0
  95. data/config/locales/bulkrax.it.yml +504 -0
  96. data/config/locales/bulkrax.pt-BR.yml +504 -0
  97. data/config/locales/bulkrax.zh.yml +503 -0
  98. data/config/routes.rb +10 -0
  99. data/lib/bulkrax/data/demo_scenarios.json +2235 -0
  100. data/lib/bulkrax/version.rb +1 -1
  101. data/lib/bulkrax.rb +31 -3
  102. data/lib/tasks/bulkrax_tasks.rake +0 -102
  103. metadata +55 -3
  104. /data/{app/services → lib}/wings/custom_queries/find_by_source_identifier.rb +0 -0
@@ -1,31 +1,42 @@
1
+ ---
1
2
  en:
2
- helpers:
3
- action:
4
- importer:
5
- new: "New"
6
- exporter:
7
- new: "New"
8
3
  bulkrax:
9
4
  admin:
10
5
  sidebar:
11
6
  exporters: Exporters
12
7
  importers: Importers
13
- 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
14
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
15
24
  labels:
16
25
  all: All
17
26
  collection: Collection
27
+ collection_entries: Collection Entries
18
28
  export_format: Export Format
19
29
  export_from: Export From
20
30
  export_source: Export Source
21
31
  export_type: Type of Export
22
32
  field_mapping: Field Mapping
33
+ file_set_entries: File Set Entries
23
34
  filter_by_date: Filter By Date
24
35
  finish_date: End Date
25
36
  full: Metadata and Files
26
- include_thumbnails: Include Thumbnails?
27
37
  generated_metadata: Include Generated Metadata?
28
38
  importer: Importer
39
+ include_thumbnails: Include Thumbnails?
29
40
  limit: Limit
30
41
  metadata: Metadata Only
31
42
  name: Name
@@ -33,27 +44,80 @@ en:
33
44
  parser_klass: Parser
34
45
  start_date: Start Date
35
46
  status: Status
36
- total_work_entries: Total Works
37
47
  total_entries: Total Entries
48
+ total_work_entries: Total Works
38
49
  user: User
39
- worktype: Work Type
40
50
  work_entries: Work Entries
41
- collection_entries: Collection Entries
42
- file_set_entries: File Set Entries
43
51
  workflow_status:
44
- approved: "Approved"
45
- deleted: "Deleted"
46
- in_process: "In Process"
47
- broken_url: "Broken Url"
48
- ingested: "Ingested"
49
- unapproved: "Unapproved"
50
- needs_repair: "Needs Repair"
51
- hints:
52
- include_thumbnails: "These exported fields currently cannot be imported."
53
- generated_metadata: "These exported fields currently cannot be imported."
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
60
+ prompts:
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 ...
65
+ validations:
66
+ errors_prohibited:
67
+ one: '1 error prohibited this exporter from being saved:'
68
+ other: "%{count} errors prohibited this exporter from being saved:"
69
+ headings:
70
+ importers: Importers
71
+ upload_corrected_entries: 'Upload Corrected Entries: %{name}'
54
72
  importer:
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.
55
119
  labels:
56
- admin_set: Admin set
120
+ admin_set: Administrative set
57
121
  collection_entries: Collection Entries
58
122
  entry_id: Entry ID
59
123
  exporter: Exporter
@@ -63,20 +127,415 @@ en:
63
127
  importer: Importer
64
128
  limit: Limit
65
129
  name: Name
66
- parser_klass: Parser klass
130
+ parser_klass: Parser
67
131
  total_collections: Total Collections
68
132
  total_file_sets: Total File Sets
69
133
  total_work_entries: Total Works
70
134
  type: Type
71
135
  user: User
72
136
  work_entries: Work Entries
137
+ oai:
138
+ hints:
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.
141
+ thumbnail_url_html: |
142
+ <p>
143
+ The Thumbnail URL allows for basic templating and substitution on any identified information in to the url. For example:
144
+ </p>
145
+ <p>
146
+ http://commons.ptsem.edu/?cover=&lt;&#37;= identifier.split(':').last &#37;&gt;&amp;size=L
147
+ </p>
148
+ <p>
149
+ http://commons.ptsem.edu/?cover=&lt;&#37;= record.header.identifier.split(':').last &#37;&gt;&amp;size=L
150
+ </p>
151
+ labels:
152
+ set: Set (source)
153
+ refresh_sets: Refresh Sets
154
+ visibility:
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:
390
+ file_style:
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
402
+ labels:
403
+ visibility: Visibility
404
+ xml_and_files: 'XML and files to Import:'
405
+ visibility:
406
+ institution: Institution
407
+ private: Private
408
+ public: Public
409
+ shared:
410
+ errors:
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
73
424
  table_header:
74
425
  labels:
75
- identifier: Identifier
426
+ actions: Actions
427
+ date_exported: Date Exported
428
+ downloadable_files: Downloadable Files
429
+ entries_deleted_upstream: Entries Deleted Upstream
430
+ entries_enqueued: Entries Enqueued
431
+ entries_failed: Entries Failed
432
+ entries_processed: Entries Processed
76
433
  entry_id: Entry ID
434
+ errors: Errors
435
+ identifier: Identifier
436
+ last_run: Last Run
437
+ name: Name
438
+ next_run: Next Run
77
439
  status: Status
440
+ status_set_at: Status Set At
441
+ total_collection_entries: Total Collection Entries
442
+ total_file_set_entries: Total File Set Entries
443
+ total_work_entries: Total Work Entries
78
444
  type: Type
79
445
  updated_at: Updated At
80
- errors: Errors
81
- status_set_at: Status Set At
82
- actions: Actions
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