diff --git a/.gitignore b/.gitignore index feeb43d3..b3199946 100644 --- a/.gitignore +++ b/.gitignore @@ -7,5 +7,6 @@ spec/test_app/log/*.log spec/test_app/tmp/ coverage/** .byebug_history +.DS_Store tmp/** .env.* \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 8bc3395c..68594864 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -12,6 +12,7 @@ PATH specs: bulkrax (0.1.0) bagit (~> 0.4) + coderay iso8601 (~> 0.9.0) language_list (~> 1.2, >= 1.2.1) libxml-ruby (~> 3.1.0) @@ -164,6 +165,7 @@ GEM activesupport (>= 4.0.0) mime-types (>= 1.16) clipboard-rails (1.7.1) + coderay (1.1.3) concurrent-ruby (1.1.6) connection_pool (2.2.2) crass (1.0.6) diff --git a/app/assets/javascripts/bulkrax/application.js b/app/assets/javascripts/bulkrax/application.js index dd80ecef..4890b662 100644 --- a/app/assets/javascripts/bulkrax/application.js +++ b/app/assets/javascripts/bulkrax/application.js @@ -11,4 +11,6 @@ // about supported directives. // +//= require jquery +//= require bootstrap-sprockets //= require_tree . diff --git a/app/assets/stylesheets/bulkrax/accordion.scss b/app/assets/stylesheets/bulkrax/accordion.scss new file mode 100644 index 00000000..944c2a1f --- /dev/null +++ b/app/assets/stylesheets/bulkrax/accordion.scss @@ -0,0 +1,40 @@ +.accordion-icon { + float: right; + margin: 0 auto; + font-size: 22px; + transform: rotate(45deg); + margin-top: -2px; +} + +.accordion-container { + width: 100%; + padding: 0px; + margin: 10px 0px; + border-radius: 4px; + border: 1px solid #dedede; +} + +.accordion-heading { + padding: 14px 15px; + background-color: #f5f5f5; + border-radius: 3px; +} + +.accordion-title { + font-size: 14px; + font-weight: bold; + color: #4E4A42; + &:hover { + color: #4E4A42; + } +} + +.accordion-collapse { + width: 100%; + padding: 0px; +} + +.accordion-body { + padding: 14px; + width: 100%; +} \ No newline at end of file diff --git a/app/assets/stylesheets/bulkrax/application.css b/app/assets/stylesheets/bulkrax/application.css index 7e2ed8f8..5dddbfc2 100644 --- a/app/assets/stylesheets/bulkrax/application.css +++ b/app/assets/stylesheets/bulkrax/application.css @@ -12,22 +12,4 @@ * *= require_tree . *= require_self - */ - -div.importer_parser_fields_file_style span.radio { - display: inline; - margin-right: 20px; -} - -div#file_upload, div#file_path { - display: none -} - -div.hide-required-tag .required-tag { - display: none; -} - -div#s2id_exporter_export_source_collection { - border: none; - padding: 0; -} + */ \ No newline at end of file diff --git a/app/assets/stylesheets/bulkrax/coderay.scss b/app/assets/stylesheets/bulkrax/coderay.scss new file mode 100644 index 00000000..c781bb1c --- /dev/null +++ b/app/assets/stylesheets/bulkrax/coderay.scss @@ -0,0 +1,264 @@ +#bulkrax-raw-toggle-1, #bulkrax-raw-toggle-2 { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 13px; +} + +.CodeRay { + background-color: #FFF; + border: 1px solid #CCC; + font-family: Monaco, "Courier New", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", monospace; + color: #000; +} + +.CodeRay pre { + margin: auto 0px; + width: 100%; +} + +span.CodeRay { + white-space: pre; + border: 0px; + padding: 2px +} + +table.CodeRay { + border-collapse: collapse; + width: 100%; + padding: 2px; +} + +table.CodeRay td { + padding: 1em 0.5em; + vertical-align: top; +} + +.CodeRay .line-numbers, .CodeRay .no { + background-color: #ECECEC; + color: #AAA; + text-align: right; +} + +.CodeRay .line-numbers a { + color: #AAA; +} + +.CodeRay .line-numbers tt { font-weight: bold; } +.CodeRay .line-numbers .highlighted { color: red; } + +.CodeRay .line { + display: block; + float: left; + width: 100%; +} + +.CodeRay span.line-numbers { padding: 0px 4px; } +.CodeRay .code { width: 100%; } + +ol.CodeRay { font-size: 10pt; } +ol.CodeRay li { white-space: pre; } + +.CodeRay .code pre { overflow: auto; } + +.CodeRay .annotation { color: #007; } +.CodeRay .attribute-name { color: #f08; } +.CodeRay .attribute-value { color: #700; } + +.CodeRay .binary { + color: #509; + font-weight: bold; +} + +.CodeRay .comment { + color: #998; + font-style: italic; +} + +.CodeRay .char { color: #04D; } +.CodeRay .char .content { color: #04D; } +.CodeRay .char .delimiter { color: #039; } + +.CodeRay .class { + color: #458; + font-weight: bold; +} + +.CodeRay .complex { + color: #A08; + font-weight: bold; +} + +.CodeRay .constant { color: teal; } +.CodeRay .color { color: #0A0; } +.CodeRay .class-variable { color: #369; } +.CodeRay .decorator { color: #B0B; } + +.CodeRay .definition { + color: #099; + font-weight: bold; +} + +.CodeRay .directive { + color: #088; + font-weight: bold; +} + +.CodeRay .delimiter { color: black; } +.CodeRay .doc { color: #970; } +.CodeRay .doctype { color: #34b; } + +.CodeRay .doc-string { + color: #D42; + font-weight: bold; +} + +.CodeRay .escape { + color: #666; + font-weight: bold; +} + +.CodeRay .entity { + color: #800; + font-weight: bold; +} + +.CodeRay .error { + color: #F00; + background-color: #FAA; +} + +.CodeRay .exception { + color: #C00; + font-weight: bold; +} + +.CodeRay .filename { color: #099; } + +.CodeRay .function { + color: #900; + font-weight: bold; +} + +.CodeRay .global-variable { + color: teal; + font-weight: bold; +} + +.CodeRay .hex { + color: #058; + font-weight: bold; +} + +.CodeRay .integer { color: #099; } + +.CodeRay .include { + color: #B44; + font-weight: bold; +} + +.CodeRay .inline { color: #000; } +.CodeRay .inline .inline { background: #ccc; } +.CodeRay .inline .inline .inline { background: #bbb; } +.CodeRay .inline .inline-delimiter { color: #D14; } +.CodeRay .inline-delimiter { color: #D14; } +.CodeRay .important { color: #f00; } + +.CodeRay .interpreted { + color: #B2B; + font-weight: bold; +} + +.CodeRay .instance-variable { color: teal; } + +.CodeRay .label { + color: #970; + font-weight: bold; +} + +.CodeRay .local-variable { color: #963; } + +.CodeRay .octal { + color: #40E; + font-weight: bold; +} + +.CodeRay .predefined-constant { font-weight: bold; } + +.CodeRay .predefined { + color: #369; + font-weight: bold; +} +.CodeRay .preprocessor { color: #579; } + +.CodeRay .pseudo-class { + color: #00C; + font-weight: bold; +} +.CodeRay .predefined-type { color: #074; font-weight: bold; } +.CodeRay .reserved, .keyword { color: #000; font-weight: bold; } + +.CodeRay .key { color: #808; } +.CodeRay .key .delimiter { color: #606; } +.CodeRay .key .char { color: #80f; } +.CodeRay .value { color: #088; } + +.CodeRay .regexp { background-color: #fff0ff; } +.CodeRay .regexp .content { color: #808; } +.CodeRay .regexp .delimiter { color: #404; } +.CodeRay .regexp .modifier { color: #C2C; } + +.CodeRay .regexp .function { + color: #404; + font-weight: bold; +} + +.CodeRay .string { color: #D20; } +.CodeRay .string .string .string { background-color: #ffd0d0; } +.CodeRay .string .content { color: #D14; } +.CodeRay .string .char { color: #D14; } +.CodeRay .string .delimiter { color: #D14; } + +.CodeRay .shell { color: #D14; } +.CodeRay .shell .delimiter { color: #D14; } + +.CodeRay .symbol { color: #990073; } +.CodeRay .symbol .content { color: #A60; } +.CodeRay .symbol .delimiter { color: #630; } + +.CodeRay .tag { color: #070; } + +.CodeRay .tag-special { + color: #D70; + font-weight: bold; +} + +.CodeRay .type { + color: #339; + font-weight: bold; +} + +.CodeRay .variable { color: #036; } +.CodeRay .insert { background: #afa; } +.CodeRay .delete { background: #faa; } + +.CodeRay .change { + color: #aaf; + background: #007; +} + +.CodeRay .head { + color: #f8f; + background: #505; +} + +.CodeRay .insert .insert { + color: #080; + font-weight: bold; +} + +.CodeRay .delete .delete { + color: #800; + font-weight: bold; +} + +.CodeRay .change .change { color: #66f; } +.CodeRay .head .head { color: #f4f; } \ No newline at end of file diff --git a/app/assets/stylesheets/bulkrax/import_export.scss b/app/assets/stylesheets/bulkrax/import_export.scss new file mode 100644 index 00000000..1834840a --- /dev/null +++ b/app/assets/stylesheets/bulkrax/import_export.scss @@ -0,0 +1,37 @@ +div.importer_parser_fields_file_style span.radio { + display: inline; + margin-right: 20px; +} + +div#file_upload, div#file_path { + display: none; +} + +div.hide-required-tag .required-tag { + display: none; +} + +div#s2id_exporter_export_source_collection { + border: none; + padding: 0; +} + +.bulkrax-nav-tab-top-margin { + margin-top: 20px !important; +} + +.bulkrax-nav-tab-bottom-margin { + margin-bottom: 20px; +} + +.bulkrax-nav-tab-table-left-align { + margin-left: 10px; +} + +.bulkrax-p-align { + margin: 15px 0 10px 15px; +} + +.bulkrax-clear-toggles { + clear: both; +} \ No newline at end of file diff --git a/app/views/bulkrax/entries/_parsed_metadata.html.erb b/app/views/bulkrax/entries/_parsed_metadata.html.erb new file mode 100644 index 00000000..f7598450 --- /dev/null +++ b/app/views/bulkrax/entries/_parsed_metadata.html.erb @@ -0,0 +1,19 @@ +<% if @entry.parsed_metadata.present? %> +
<%= notice %>
-+ +
Identifier: <%= @entry.identifier %>
-+
Entry ID: <%= @entry.id %>
-+
Type: <%= @entry.factory_class %>
+ <%= render partial: 'raw_metadata'%> -
- Raw Metadata:
- <% if @entry.raw_metadata.present? %>
-
-
- <% end %>
-
- Parsed Metadata:
- <% if @entry.parsed_metadata.present? %>
-
-
- <% end %>
-
- <% if @entry.last_error.present? %>
- Errored at: <%= @entry.last_error_at %>
- Error: <%= @entry.last_error['error_class'] %> - <%= @entry.last_error['error_message'] %>
- Error Trace:
-
+
<% if @importer.present? %> Importer: <%= link_to @importer.name, importer_path(@importer) %> @@ -68,7 +33,7 @@ <% end %>
-+
<% if @importer.present? %> <% factory_record = @entry.factory.find %> <% if @entry.last_succeeded_at != nil && factory_record.present? %> @@ -95,5 +60,6 @@ <% end %> <% end %>
++ +
<%= t('bulkrax.exporter.labels.name') %>: <%= @exporter.name %>
-+
<%= t('bulkrax.exporter.labels.user') %>: <%= @exporter.user %>
-+
<%= t('bulkrax.exporter.labels.export_type') %>: <%= @exporter.export_type %>
-+
<%= t('bulkrax.exporter.labels.export_from') %>: <%= @exporter.export_from %>
-+
<%= t('bulkrax.exporter.labels.export_source') %>: <% case @exporter.export_from %> <% when 'collection' %> @@ -40,31 +41,22 @@ <% end %>
-+
<%= t('bulkrax.exporter.labels.parser_klass') %>: <%= @exporter.parser_klass %>
-+
<%= t('bulkrax.exporter.labels.limit') %>: <%= @exporter.limit %>
-
- <% if @exporter.last_error.present? %>
- Errored at: <%= @exporter.last_error_at %>
- Error: <%= @exporter.last_error['error_class'] %> - <%= @exporter.last_error['error_message'] %>
- Error Trace:
-
- <% elsif @exporter.last_succeeded_at.present? %>
- Succeeded At: <%= @exporter.last_succeeded_at %>
- <% end %>
-
+
<%= t('bulkrax.exporter.labels.parser_fields') %>:
<% @exporter.parser_fields.each do |k, v| %>
<%= k %>: <%= v %>
@@ -72,74 +64,61 @@
- <%= t('bulkrax.exporter.labels.field_mapping') %>:
- <% if @exporter.field_mapping.present? %>
-
-
- <% end %>
-
<%= t('bulkrax.exporter.labels.field_mapping') %>:
-+
<%= t('bulkrax.exporter.labels.total_work_entries') %>: <%= @exporter.exporter_runs.last&.total_work_entries %>
-Identifier | -Collection | -Entry ID | -Status | -Errors | -Status Set At | -Actions | -
---|
<%= link_to e.identifier, bulkrax.exporter_entry_path(@exporter.id, e.id) %> | - <% if e.parsed_metadata.present? && e.parsed_metadata.dig('collections').present? %> -<%= e.parsed_metadata.dig('collections').map {|c| c['id'] }.join('; ') %> | - <% elsif e.raw_metadata.present? %> -<%= Array.wrap(e.raw_metadata.dig('collection')).join(';') %> | - <% else %> -- <% end %> - | <%= e.id %> | - <% if e.status == 'succeeded' %> -<%= e.status %> | +Identifier | +Collection | +Entry ID | +Status | +Errors | +Status Set At | +Actions | +
---|---|---|---|---|---|---|---|---|---|---|---|---|
<%= link_to e.identifier, bulkrax.exporter_entry_path(@exporter.id, e.id) %> | + <% if e.parsed_metadata.present? && e.parsed_metadata.dig('collections').present? %> +<%= e.parsed_metadata.dig('collections').map {|c| c['id'] }.join('; ') %> | + <% elsif e.raw_metadata.present? %> +<%= Array.wrap(e.raw_metadata.dig('collection')).join(';') %> | <% else %> -<%= e.status %> | - <% end %> - <% if e.last_error.present? %> -<%= link_to e.last_error.dig('error_class'), bulkrax.exporter_entry_path(@exporter.id, e.id) %> | - <% else %>- <% end %> - | <%= e.status_at %> | -<%= link_to raw(""), bulkrax.exporter_entry_path(@exporter.id, e.id) %> | -
+
Name: <%= @importer.name %>
- -+
Admin set: <%= @importer.admin_set_id %>
- -+
User: <%= @importer.user %>
- -+
Frequency: <%= @importer.frequency %>
- -+
Parser klass: <%= @importer.parser_klass %>
- -+
Limit: <%= @importer.limit %>
-
- <% if @importer.last_error.present? %>
- Errored at: <%= @importer.last_error_at %>
- Error: <%= @importer.last_error['error_class'] %> - <%= @importer.last_error['error_message'] %>
- Error Trace:
-
- <% elsif @importer.importer_runs.last&.invalid_records&.present? %>
- Error Trace:
-
- <% elsif @importer.last_succeeded_at.present? %>
- Succeeded At: <%= @importer.last_succeeded_at %>
- <% end %>
-
- Parser fields:
- <% @importer.parser_fields.each do |key,value| %>
- <%= key %>: <%= value %>
- <% end %>
-
- Field mapping:
- <% if @importer.field_mapping.present? %>
-
-
+ Succeeded At: <%= item.last_succeeded_at %> +
+<% else %> ++ Succeeded At: Item has not yet been <%= @importer.present? ? 'imported' : 'exported' %> successfully +
+<% end %> diff --git a/app/views/bulkrax/shared/_bulkrax_field_mapping.html.erb b/app/views/bulkrax/shared/_bulkrax_field_mapping.html.erb new file mode 100644 index 00000000..12dd02d7 --- /dev/null +++ b/app/views/bulkrax/shared/_bulkrax_field_mapping.html.erb @@ -0,0 +1,46 @@ +<% if item.field_mapping.present? %> +