geoblacklight_admin 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.editorconfig +18 -0
- data/.gitignore +75 -0
- data/.standard.yml +4 -0
- data/Gemfile +59 -0
- data/LICENSE +21 -0
- data/README.md +84 -0
- data/Rakefile +72 -0
- data/app/assets/images/.keep +0 -0
- data/app/assets/images/aerial_photo.jpg +0 -0
- data/app/assets/images/archive-solid.svg +1 -0
- data/app/assets/images/bookmark-regular.svg +1 -0
- data/app/assets/images/bookmark-solid.svg +1 -0
- data/app/assets/images/btaa-logo.jpg +0 -0
- data/app/assets/images/cloud-download-alt-solid.svg +1 -0
- data/app/assets/images/file-import-solid.svg +1 -0
- data/app/assets/images/trash-alt-solid.svg +1 -0
- data/app/assets/javascripts/geoblacklight_admin/chosen.js +4 -0
- data/app/assets/javascripts/geoblacklight_admin/date_range_picker.js +173 -0
- data/app/assets/javascripts/geoblacklight_admin/datepicker.js +22 -0
- data/app/assets/javascripts/geoblacklight_admin/elements.js +38 -0
- data/app/assets/javascripts/geoblacklight_admin/exports.js +3 -0
- data/app/assets/javascripts/geoblacklight_admin/fields.js +11 -0
- data/app/assets/javascripts/geoblacklight_admin/geoblacklight_admin.js +2 -0
- data/app/assets/javascripts/geoblacklight_admin/inputmask.js +4 -0
- data/app/assets/javascripts/geoblacklight_admin/locale.js +5 -0
- data/app/assets/javascripts/geoblacklight_admin/sortable.js +2544 -0
- data/app/assets/javascripts/geoblacklight_admin/tooltips.js +3 -0
- data/app/assets/javascripts/geoblacklight_admin/truncate.js +4 -0
- data/app/assets/javascripts/geoblacklight_admin.js +40 -0
- data/app/assets/stylesheets/geoblacklight_admin/_core.scss +47 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_autocomplete.scss +32 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_blazer.scss +3 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_code.scss +3 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_datepicker.scss +477 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_elements.scss +3 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_forms.scss +28 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_icons.scss +15 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_nav.scss +9 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_tables.scss +4 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_toasts.scss +7 -0
- data/app/assets/stylesheets/geoblacklight_admin/modules/_visibility.scss +3 -0
- data/app/assets/stylesheets/geoblacklight_admin/settings/_variables.scss +1 -0
- data/app/channels/export_channel.rb +12 -0
- data/app/controllers/admin/admin_controller.rb +16 -0
- data/app/controllers/admin/advanced_search_controller.rb +365 -0
- data/app/controllers/admin/api_controller.rb +386 -0
- data/app/controllers/admin/bookmarks_controller.rb +68 -0
- data/app/controllers/admin/bulk_actions_controller.rb +94 -0
- data/app/controllers/admin/concerns/.keep +0 -0
- data/app/controllers/admin/concerns/upload_util.rb +8 -0
- data/app/controllers/admin/document_accesses_controller.rb +125 -0
- data/app/controllers/admin/document_assets_controller.rb +198 -0
- data/app/controllers/admin/document_downloads_controller.rb +127 -0
- data/app/controllers/admin/documents_controller.rb +219 -0
- data/app/controllers/admin/elements_controller.rb +81 -0
- data/app/controllers/admin/form_elements_controller.rb +81 -0
- data/app/controllers/admin/ids_controller.rb +379 -0
- data/app/controllers/admin/import_documents_controller.rb +18 -0
- data/app/controllers/admin/imports_controller.rb +105 -0
- data/app/controllers/admin/mappings_controller.rb +95 -0
- data/app/controllers/admin/notifications_controller.rb +51 -0
- data/app/controllers/admin/search_controller.rb +10 -0
- data/app/controllers/admin/users_controller.rb +10 -0
- data/app/helpers/bulk_actions_helper.rb +9 -0
- data/app/helpers/document_helper.rb +60 -0
- data/app/helpers/form_input_helper.rb +73 -0
- data/app/helpers/geoblacklight_admin_helper.rb +118 -0
- data/app/helpers/import_documents_helper.rb +5 -0
- data/app/helpers/mappings_helper.rb +27 -0
- data/app/indexers/document_indexer.rb +34 -0
- data/app/jobs/bulk_action_revert_document_job.rb +49 -0
- data/app/jobs/bulk_action_revert_job.rb +25 -0
- data/app/jobs/bulk_action_run_document_job.rb +42 -0
- data/app/jobs/bulk_action_run_job.rb +27 -0
- data/app/jobs/export_job.rb +72 -0
- data/app/jobs/export_json_job.rb +120 -0
- data/app/jobs/import_document_job.rb +25 -0
- data/app/jobs/import_run_job.rb +33 -0
- data/app/models/active_storage_attachment.rb +5 -0
- data/app/models/active_storage_blob.rb +5 -0
- data/app/models/api_search_builder.rb +12 -0
- data/app/models/application_record.rb +6 -0
- data/app/models/blacklight_api.rb +93 -0
- data/app/models/blacklight_api_facets.rb +15 -0
- data/app/models/blacklight_api_ids.rb +103 -0
- data/app/models/bookmark.rb +17 -0
- data/app/models/bulk_action.rb +88 -0
- data/app/models/bulk_action_document.rb +22 -0
- data/app/models/bulk_action_document_state_machine.rb +16 -0
- data/app/models/bulk_action_document_transition.rb +19 -0
- data/app/models/bulk_action_state_machine.rb +16 -0
- data/app/models/bulk_action_transition.rb +26 -0
- data/app/models/concerns/.keep +0 -0
- data/app/models/document/bbox_validator.rb +70 -0
- data/app/models/document/controlled_lists.rb +104 -0
- data/app/models/document/date_range_validator.rb +63 -0
- data/app/models/document/geom_validator.rb +117 -0
- data/app/models/document/reference.rb +107 -0
- data/app/models/document.rb +264 -0
- data/app/models/document_access.rb +35 -0
- data/app/models/document_download.rb +35 -0
- data/app/models/document_state_machine.rb +14 -0
- data/app/models/document_transition.rb +26 -0
- data/app/models/element.rb +90 -0
- data/app/models/form_control.rb +2 -0
- data/app/models/form_element.rb +19 -0
- data/app/models/form_feature.rb +2 -0
- data/app/models/form_group.rb +2 -0
- data/app/models/form_header.rb +2 -0
- data/app/models/geoblacklight_admin/field_mappings_btaa_aardvark.rb +379 -0
- data/app/models/geoblacklight_admin/field_mappings_gblv1.rb +344 -0
- data/app/models/geoblacklight_admin/iso_language_codes.rb +515 -0
- data/app/models/geoblacklight_admin/schema.rb +194 -0
- data/app/models/geoblacklight_admin.rb +3 -0
- data/app/models/import/csv_duplicates_validator.rb +36 -0
- data/app/models/import/csv_header_validator.rb +24 -0
- data/app/models/import.rb +186 -0
- data/app/models/import_btaa.rb +91 -0
- data/app/models/import_btaa_aardvark.rb +109 -0
- data/app/models/import_document.rb +34 -0
- data/app/models/import_document_state_machine.rb +12 -0
- data/app/models/import_document_transition.rb +19 -0
- data/app/models/import_gblv1.rb +92 -0
- data/app/models/import_state_machine.rb +16 -0
- data/app/models/import_transition.rb +26 -0
- data/app/models/mapping.rb +10 -0
- data/app/models/notification.rb +9 -0
- data/app/models/user.rb +26 -0
- data/app/notifications/export_notification.rb +30 -0
- data/app/services/export_csv_document_access_links_service.rb +47 -0
- data/app/services/export_csv_document_downloads_service.rb +47 -0
- data/app/services/export_csv_service.rb +44 -0
- data/app/services/export_json_service.rb +35 -0
- data/app/services/zip_file_generator.rb +56 -0
- data/app/views/admin/advanced_search/facets.json.jbuilder +80 -0
- data/app/views/admin/advanced_search/index.json.jbuilder +90 -0
- data/app/views/admin/api/_field.json.jbuilder +10 -0
- data/app/views/admin/api/fetch.json.jbuilder +86 -0
- data/app/views/admin/api/index.json.jbuilder +90 -0
- data/app/views/admin/bookmarks/_bookmark.json.jbuilder +4 -0
- data/app/views/admin/bookmarks/create.js.erb +7 -0
- data/app/views/admin/bookmarks/destroy.js.erb +7 -0
- data/app/views/admin/bookmarks/index.html.erb +21 -0
- data/app/views/admin/bookmarks/index.json.jbuilder +3 -0
- data/app/views/admin/bulk_actions/_bulk_action.json.jbuilder +4 -0
- data/app/views/admin/bulk_actions/_form.html.erb +17 -0
- data/app/views/admin/bulk_actions/edit.html.erb +6 -0
- data/app/views/admin/bulk_actions/index.html.erb +54 -0
- data/app/views/admin/bulk_actions/index.json.jbuilder +3 -0
- data/app/views/admin/bulk_actions/new.html.erb +5 -0
- data/app/views/admin/bulk_actions/show.html.erb +100 -0
- data/app/views/admin/bulk_actions/show.json.jbuilder +3 -0
- data/app/views/admin/devise/confirmations/new.html.erb +16 -0
- data/app/views/admin/devise/invitations/edit.html.erb +15 -0
- data/app/views/admin/devise/invitations/new.html.erb +15 -0
- data/app/views/admin/devise/mailer/invitation_instructions.html.erb +11 -0
- data/app/views/admin/devise/mailer/invitation_instructions.text.erb +11 -0
- data/app/views/admin/devise/passwords/edit.html.erb +26 -0
- data/app/views/admin/devise/passwords/new.html.erb +16 -0
- data/app/views/admin/devise/registrations/edit.html.erb +35 -0
- data/app/views/admin/devise/registrations/new.html.erb +30 -0
- data/app/views/admin/devise/sessions/new.html.erb +28 -0
- data/app/views/admin/devise/shared/_links.html.erb +27 -0
- data/app/views/admin/devise/unlocks/new.html.erb +16 -0
- data/app/views/admin/document_accesses/_document_access.json.jbuilder +4 -0
- data/app/views/admin/document_accesses/_form.html.erb +17 -0
- data/app/views/admin/document_accesses/destroy_all.html.erb +70 -0
- data/app/views/admin/document_accesses/edit.html.erb +5 -0
- data/app/views/admin/document_accesses/import.html.erb +70 -0
- data/app/views/admin/document_accesses/index.html.erb +74 -0
- data/app/views/admin/document_accesses/index.json.jbuilder +3 -0
- data/app/views/admin/document_accesses/new.html.erb +6 -0
- data/app/views/admin/document_accesses/show.html.erb +19 -0
- data/app/views/admin/document_accesses/show.json.jbuilder +3 -0
- data/app/views/admin/document_assets/display_attach_form.html.erb +44 -0
- data/app/views/admin/document_assets/index.html.erb +65 -0
- data/app/views/admin/document_downloads/_document_download.json.jbuilder +4 -0
- data/app/views/admin/document_downloads/_form.html.erb +15 -0
- data/app/views/admin/document_downloads/destroy_all.html.erb +70 -0
- data/app/views/admin/document_downloads/edit.html.erb +6 -0
- data/app/views/admin/document_downloads/import.html.erb +74 -0
- data/app/views/admin/document_downloads/index.html.erb +70 -0
- data/app/views/admin/document_downloads/index.json.jbuilder +3 -0
- data/app/views/admin/document_downloads/new.html.erb +5 -0
- data/app/views/admin/document_downloads/show.html.erb +24 -0
- data/app/views/admin/document_downloads/show.json.jbuilder +3 -0
- data/app/views/admin/documents/_document.html.erb +29 -0
- data/app/views/admin/documents/_document_bookmark.html.erb +17 -0
- data/app/views/admin/documents/_document_fields.html.erb +24 -0
- data/app/views/admin/documents/_form.html.erb +49 -0
- data/app/views/admin/documents/_form_control.html.erb +86 -0
- data/app/views/admin/documents/_form_group.html.erb +1 -0
- data/app/views/admin/documents/_form_header.html.erb +1 -0
- data/app/views/admin/documents/_form_nav.html.erb +21 -0
- data/app/views/admin/documents/_json_aardvark.jbuilder +47 -0
- data/app/views/admin/documents/_json_btaa_aardvark.jbuilder +16 -0
- data/app/views/admin/documents/_json_gbl_v1.jbuilder +32 -0
- data/app/views/admin/documents/_result_facets.html.erb +35 -0
- data/app/views/admin/documents/_result_pagination.html.erb +21 -0
- data/app/views/admin/documents/_result_selected_options.html.erb +54 -0
- data/app/views/admin/documents/_result_selection_options.html.erb +10 -0
- data/app/views/admin/documents/_result_toggle.html.erb +13 -0
- data/app/views/admin/documents/edit.html.erb +7 -0
- data/app/views/admin/documents/features/_assets.html.erb +3 -0
- data/app/views/admin/documents/features/_institutional_access_links.html.erb +3 -0
- data/app/views/admin/documents/features/_multiple_download_links.html.erb +27 -0
- data/app/views/admin/documents/fetch.json_aardvark.jbuilder +9 -0
- data/app/views/admin/documents/fetch.json_btaa_aardvark.jbuilder +9 -0
- data/app/views/admin/documents/fetch.json_gbl_v1.jbuilder +9 -0
- data/app/views/admin/documents/index.html.erb +49 -0
- data/app/views/admin/documents/index.json_aardvark.jbuilder +9 -0
- data/app/views/admin/documents/index.json_btaa_aardvark.jbuilder +9 -0
- data/app/views/admin/documents/index.json_gbl_v1.jbuilder +9 -0
- data/app/views/admin/documents/show.json_aardvark.jbuilder +3 -0
- data/app/views/admin/documents/show.json_btaa_aardvark.jbuilder +3 -0
- data/app/views/admin/documents/show.json_gbl_v1.jbuilder +3 -0
- data/app/views/admin/documents/versions.html.erb +110 -0
- data/app/views/admin/elements/_element.json.jbuilder +2 -0
- data/app/views/admin/elements/_form.html.erb +45 -0
- data/app/views/admin/elements/edit.html.erb +6 -0
- data/app/views/admin/elements/index.html.erb +68 -0
- data/app/views/admin/elements/index.json.jbuilder +1 -0
- data/app/views/admin/elements/new.html.erb +5 -0
- data/app/views/admin/elements/show.html.erb +121 -0
- data/app/views/admin/elements/show.json.jbuilder +1 -0
- data/app/views/admin/form_elements/_form.html.erb +46 -0
- data/app/views/admin/form_elements/_form_element.json.jbuilder +2 -0
- data/app/views/admin/form_elements/edit.html.erb +6 -0
- data/app/views/admin/form_elements/index.html.erb +49 -0
- data/app/views/admin/form_elements/index.json.jbuilder +1 -0
- data/app/views/admin/form_elements/new.html.erb +5 -0
- data/app/views/admin/form_elements/show.html.erb +19 -0
- data/app/views/admin/form_elements/show.json.jbuilder +1 -0
- data/app/views/admin/ids/fetch.json.jbuilder +86 -0
- data/app/views/admin/ids/index.json.jbuilder +41 -0
- data/app/views/admin/import_documents/show.html.haml +20 -0
- data/app/views/admin/imports/_form.html.erb +27 -0
- data/app/views/admin/imports/_import.json.jbuilder +4 -0
- data/app/views/admin/imports/_show_failed_tab.html.erb +37 -0
- data/app/views/admin/imports/_show_success_tab.html.erb +31 -0
- data/app/views/admin/imports/edit.html.erb +8 -0
- data/app/views/admin/imports/index.html.erb +56 -0
- data/app/views/admin/imports/index.json.jbuilder +3 -0
- data/app/views/admin/imports/new.html.erb +7 -0
- data/app/views/admin/imports/show.html.erb +123 -0
- data/app/views/admin/imports/show.json.jbuilder +3 -0
- data/app/views/admin/layouts/application.html.erb +30 -0
- data/app/views/admin/layouts/blazer/application.html.erb +23 -0
- data/app/views/admin/layouts/mailer.html.erb +13 -0
- data/app/views/admin/layouts/mailer.text.erb +1 -0
- data/app/views/admin/mappings/_form.html.erb +17 -0
- data/app/views/admin/mappings/_mapping.json.jbuilder +4 -0
- data/app/views/admin/mappings/edit.html.erb +6 -0
- data/app/views/admin/mappings/index.html.erb +37 -0
- data/app/views/admin/mappings/index.json.jbuilder +3 -0
- data/app/views/admin/mappings/new.html.erb +5 -0
- data/app/views/admin/mappings/show.html.erb +27 -0
- data/app/views/admin/mappings/show.json.jbuilder +3 -0
- data/app/views/admin/notifications/_notification.html.haml +31 -0
- data/app/views/admin/notifications/index.html.erb +54 -0
- data/app/views/admin/notifications/update.js.erb +7 -0
- data/app/views/admin/search/index.html.erb +38 -0
- data/app/views/admin/shared/_flash_messages.html.erb +5 -0
- data/app/views/admin/shared/_footer.html.erb +56 -0
- data/app/views/admin/shared/_js_behaviors.html.erb +147 -0
- data/app/views/admin/shared/_navbar.html.erb +78 -0
- data/app/views/admin/shared/_navbar_blazer.html.erb +42 -0
- data/app/views/admin/shared/_schema_timestamp.html.erb +16 -0
- data/app/views/admin/shared/_toast.html.erb +13 -0
- data/app/views/admin/users/index.html.erb +21 -0
- data/config/authorities/formats.yml +25 -0
- data/config/authorities/languages.yml +50 -0
- data/config/authorities/resource_type.yml +82 -0
- data/config/blazer.yml +79 -0
- data/config/gbl_v1_schema.json +118 -0
- data/config/geomg_aardvark_schema.json +211 -0
- data/config/geomg_schema.json +123 -0
- data/config/locales/devise.en.yml +65 -0
- data/config/locales/devise_invitable.en.yml +31 -0
- data/config/locales/documents.en.yml +189 -0
- data/config/locales/en.yml +51 -0
- data/config/locales/geoblacklight.en.yml +178 -0
- data/config/locales/simple_form.en.yml +31 -0
- data/config/routes.rb +162 -0
- data/db/migrate/20230316183001_add_geoblacklight_admin.rb +399 -0
- data/db/seeds.rb +26 -0
- data/db/seeds_elements.csv +56 -0
- data/db/seeds_elements.numbers +0 -0
- data/db/seeds_form_elements.csv +71 -0
- data/db/seeds_form_elements.numbers +0 -0
- data/db/structure.sql +816 -0
- data/geoblacklight_admin.gemspec +67 -0
- data/lib/generators/geoblacklight_admin/config_generator.rb +336 -0
- data/lib/generators/geoblacklight_admin/example_docs_generator.rb +18 -0
- data/lib/generators/geoblacklight_admin/helpers_generator.rb +18 -0
- data/lib/generators/geoblacklight_admin/install_generator.rb +60 -0
- data/lib/generators/geoblacklight_admin/jobs_generator.rb +21 -0
- data/lib/generators/geoblacklight_admin/models_generator.rb +23 -0
- data/lib/generators/geoblacklight_admin/templates/.env.development.example +28 -0
- data/lib/generators/geoblacklight_admin/templates/.solr_wrapper.yml +7 -0
- data/lib/generators/geoblacklight_admin/templates/_user_util_links.html.erb +30 -0
- data/lib/generators/geoblacklight_admin/templates/config/database.yml +18 -0
- data/lib/generators/geoblacklight_admin/templates/config/geomg_aardvark_schema.json +211 -0
- data/lib/generators/geoblacklight_admin/templates/config/initializers/geoblacklight_admin.rb +25 -0
- data/lib/generators/geoblacklight_admin/templates/config/initializers/kithe.rb +31 -0
- data/lib/generators/geoblacklight_admin/templates/config/initializers/pagy.rb +158 -0
- data/lib/generators/geoblacklight_admin/templates/config/initializers/statesman.rb +7 -0
- data/lib/generators/geoblacklight_admin/templates/javascript/channels/consumer.js +6 -0
- data/lib/generators/geoblacklight_admin/templates/javascript/channels/export_channel.js +30 -0
- data/lib/generators/geoblacklight_admin/templates/javascript/channels/index.js +5 -0
- data/lib/generators/geoblacklight_admin/templates/javascript/controllers/application_controller.js +17 -0
- data/lib/generators/geoblacklight_admin/templates/javascript/controllers/document_controller.js +26 -0
- data/lib/generators/geoblacklight_admin/templates/javascript/controllers/index.js +10 -0
- data/lib/generators/geoblacklight_admin/templates/javascript/controllers/results_controller.js +310 -0
- data/lib/generators/geoblacklight_admin/templates/javascript/packs/application.js +23 -0
- data/lib/generators/geoblacklight_admin/templates/javascript/src/js/admin/qa_autocomplete.js +1134 -0
- data/lib/generators/geoblacklight_admin/templates/package.json +32 -0
- data/lib/generators/geoblacklight_admin/templates/solr/README-geoblacklight-solr-development.txt +3 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/_rest_managed.json +3 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/admin-extra.html +31 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/core.properties +5 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/elevate.xml +36 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/protwords.txt +21 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/schema.xml +229 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/scripts.conf +24 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/solrconfig.xml +266 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/spellings.txt +2 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/stopwords.txt +58 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/stopwords_en.txt +58 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/synonyms.txt +43 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/xslt/example.xsl +132 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/xslt/example_atom.xsl +67 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/xslt/example_rss.xsl +66 -0
- data/lib/generators/geoblacklight_admin/templates/solr/conf/xslt/luke.xsl +337 -0
- data/lib/generators/geoblacklight_admin/templates/solr/snapshots/.keep +0 -0
- data/lib/generators/geoblacklight_admin/views_generator.rb +19 -0
- data/lib/geoblacklight_admin/engine.rb +20 -0
- data/lib/geoblacklight_admin/version.rb +5 -0
- data/lib/geoblacklight_admin.rb +7 -0
- data/lib/tasks/.keep +0 -0
- data/lib/tasks/geoblacklight_admin.rake +209 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +35 -0
- data/template.rb +16 -0
- metadata +1037 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# DocumentHelper
|
|
4
|
+
module DocumentHelper
|
|
5
|
+
def publication_state_badge(document)
|
|
6
|
+
case document.publication_state
|
|
7
|
+
when "draft"
|
|
8
|
+
link_to("#document_publication_state") do
|
|
9
|
+
tag.span("Draft", class: "badge badge-secondary")
|
|
10
|
+
end
|
|
11
|
+
when "published"
|
|
12
|
+
link_to("#document_publication_state") do
|
|
13
|
+
tag.span("Published", class: "badge badge-success")
|
|
14
|
+
end
|
|
15
|
+
when "unpublished"
|
|
16
|
+
link_to("#document_publication_state") do
|
|
17
|
+
tag.span("Unpublished", class: "badge badge-danger")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def localize_link(link)
|
|
23
|
+
uri = URI.parse(link)
|
|
24
|
+
"/admin/documents?#{uri.query}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def sort_link(link)
|
|
28
|
+
link_to link["attributes"]["label"], localize_link(link["links"]["self"]), {class: "dropdown-item"}
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def link_from_api(link)
|
|
32
|
+
# Append facet - Full URI returned
|
|
33
|
+
uri = URI.parse(link["links"]["self"])
|
|
34
|
+
{action: "add", link: "/admin/documents?#{uri.query}"}
|
|
35
|
+
rescue
|
|
36
|
+
# Remove facet - Only path and query returned
|
|
37
|
+
uri = URI.parse(link["links"]["remove"])
|
|
38
|
+
{action: "remove", link: "/admin/documents?#{uri.query}"}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def previous_link(links)
|
|
42
|
+
if links["prev"]
|
|
43
|
+
link_to "Previous", localize_link(links["prev"]), {class: "btn btn-outline-primary btn-sm"}
|
|
44
|
+
else
|
|
45
|
+
link_to "Previous", "javascript:;", {class: "btn btn-outline-primary btn-sm disabled", "aria-disabled": true}
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def next_link(links)
|
|
50
|
+
if links["next"]
|
|
51
|
+
link_to "Next", localize_link(links["next"]), {class: "btn btn-outline-primary btn-sm"}
|
|
52
|
+
else
|
|
53
|
+
link_to "Next", "javascript:;", {class: "btn btn-outline-primary btn-sm disabled", "aria-disabled": true}
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def blacklight_link(document)
|
|
58
|
+
"#{BLACKLIGHT_URL}/catalog/#{document.friendlier_id}"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# We could have done these as methods on a custom local SimpleForm::FormBuilder class?
|
|
4
|
+
# But for now we use ugly ugly helpers, first arg is always form builder.
|
|
5
|
+
#
|
|
6
|
+
# These also could arguably have been done somewhat more readably with template partials
|
|
7
|
+
# (and in some cases may call out to render partials?), but ruby methods are both somewhat
|
|
8
|
+
# more performant (especially in dev mode), and more clear to add parameterization via arguments to
|
|
9
|
+
# (`locals` in partials are confusing and lead to confusing ERB code for defaults etc.)
|
|
10
|
+
#
|
|
11
|
+
# Arguably we should extract some of these to helper classes. Rails does not provide
|
|
12
|
+
# a great architecture for complex view generation code.
|
|
13
|
+
module FormInputHelper
|
|
14
|
+
# We have a variety of inputs that are a category (with a select input)
|
|
15
|
+
# followed by a value. They always map to custom AttrJson::Model classes, which
|
|
16
|
+
# this helper assumes -- and gets that class for reflection from builder.object.class.
|
|
17
|
+
#
|
|
18
|
+
# By default the attribute names are assumed to be :category and :value,
|
|
19
|
+
# but you can pass in others.
|
|
20
|
+
#
|
|
21
|
+
# You must pass in valid category db values in category_list. (Future, some
|
|
22
|
+
# kind of introspection to default maybe)
|
|
23
|
+
#
|
|
24
|
+
# There is some translation of values to human-displayable labels, using i18n.
|
|
25
|
+
# For instance, if your class is Work::ExternalID, attribute is `category`, and one
|
|
26
|
+
# value is "object_id", you can provide an i18n key at:
|
|
27
|
+
# `activemodel.enum_values.work/external_id.category.object_id`
|
|
28
|
+
#
|
|
29
|
+
# @example
|
|
30
|
+
# <%= f.repeatable_attr_input(:external_id) do |sub_form| %>
|
|
31
|
+
# <%= category_and_value(sub_form) %>
|
|
32
|
+
# <% end %>
|
|
33
|
+
#
|
|
34
|
+
# FUTURE:
|
|
35
|
+
# * Extract to helper object?
|
|
36
|
+
# * I18n right now doesn't use superclasses, we could use ActiveModel
|
|
37
|
+
# human_attribute_name as a guide, and make our own human_value_name or something
|
|
38
|
+
# that is more powerful.
|
|
39
|
+
def category_and_value(builder,
|
|
40
|
+
category_list:, category_key: :category,
|
|
41
|
+
value_key: :value,
|
|
42
|
+
input_data_attributes: {})
|
|
43
|
+
model_class = builder.object.class
|
|
44
|
+
|
|
45
|
+
# If existing value (which may be nil) is not in category list, add it to front.
|
|
46
|
+
existing_category_value = builder.object.send(category_key)
|
|
47
|
+
category_list = [existing_category_value] + category_list unless category_list.include?(existing_category_value)
|
|
48
|
+
|
|
49
|
+
# Turn category list into values and human labels, using i18n or rails humanizing.
|
|
50
|
+
category_list = category_list.collect { |key|
|
|
51
|
+
value = if key.nil?
|
|
52
|
+
key
|
|
53
|
+
elsif model_class.respond_to?(:model_name) && key.present?
|
|
54
|
+
I18n.t(key,
|
|
55
|
+
scope: "activemodel.enum_values.#{model_class.model_name.i18n_key}.#{category_key}",
|
|
56
|
+
default: key)
|
|
57
|
+
else
|
|
58
|
+
key
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
[value, key]
|
|
62
|
+
}.to_h
|
|
63
|
+
|
|
64
|
+
tag.div(class: "form-row category-and-value") do
|
|
65
|
+
tag.div(class: "col-left category") {
|
|
66
|
+
builder.input category_key, collection: category_list, label: false, include_blank: false
|
|
67
|
+
} +
|
|
68
|
+
tag.div(class: "col-sm value") {
|
|
69
|
+
builder.input value_key, label: false, input_html: {data: input_data_attributes}
|
|
70
|
+
}
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# GeoblacklightAdminHelper
|
|
4
|
+
module GeoblacklightAdminHelper
|
|
5
|
+
# @TODO:
|
|
6
|
+
# Cannot generate app if uncommented...
|
|
7
|
+
# Uncomment after app is generated to fix view errors
|
|
8
|
+
# include ::Pagy::Frontend
|
|
9
|
+
|
|
10
|
+
# jbuilder helper
|
|
11
|
+
def no_json_blanks(value)
|
|
12
|
+
case value
|
|
13
|
+
when String
|
|
14
|
+
value.presence
|
|
15
|
+
when Array
|
|
16
|
+
value.join.blank? ? nil : value
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# qa (questioning_authoriry) gem oddly gives us no route helpers, so
|
|
21
|
+
# let's make one ourselves, for it's current mount point, we can change
|
|
22
|
+
# it if needed but at least it's DRY.
|
|
23
|
+
def qa_search_vocab_path(vocab, subauthority = nil)
|
|
24
|
+
path = "/authorities/search/#{CGI.escape vocab}"
|
|
25
|
+
|
|
26
|
+
path += "/#{CGI.escape subauthority}" if subauthority
|
|
27
|
+
|
|
28
|
+
path
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def flash_class(level)
|
|
32
|
+
alerts = {
|
|
33
|
+
"notice" => "alert alert-info",
|
|
34
|
+
"success" => "alert alert-success",
|
|
35
|
+
"error" => "alert alert-error",
|
|
36
|
+
"alert" => "alert alert-error"
|
|
37
|
+
}
|
|
38
|
+
alerts[level]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def b1g_institution_codes
|
|
42
|
+
{
|
|
43
|
+
"01" => "Indiana University",
|
|
44
|
+
"02" => "University of Illinois Urbana-Champaign",
|
|
45
|
+
"03" => "University of Iowa",
|
|
46
|
+
"04" => "University of Maryland",
|
|
47
|
+
"05" => "University of Minnesota",
|
|
48
|
+
"06" => "Michigan State University",
|
|
49
|
+
"07" => "University of Michigan",
|
|
50
|
+
"08" => "Purdue University",
|
|
51
|
+
"09" => "Pennsylvania State University",
|
|
52
|
+
"10" => "University of Wisconsin-Madison",
|
|
53
|
+
"11" => "The Ohio State University",
|
|
54
|
+
"12" => "University of Chicago",
|
|
55
|
+
"13" => "University of Nebraska-Lincoln",
|
|
56
|
+
"14" => "Rutgers University-New Brunswick"
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def notifications_badge
|
|
61
|
+
notifications_classes = ["badge"]
|
|
62
|
+
notifications_classes << "badge-dark" if current_user.notifications.unread.empty?
|
|
63
|
+
notifications_classes << "badge-danger" if current_user.notifications.unread.size.positive?
|
|
64
|
+
"<span class='#{notifications_classes.join(" ")}' id='notification-count'>#{current_user.notifications.unread.size}</span>"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# From Blacklight::HiddenSearchStateComponent
|
|
68
|
+
def params_as_hidden_fields(params)
|
|
69
|
+
hidden_fields = []
|
|
70
|
+
flatten_hash(params).each do |name, value|
|
|
71
|
+
value = Array.wrap(value)
|
|
72
|
+
value.each do |v|
|
|
73
|
+
hidden_fields << hidden_field_tag(name, v.to_s, id: nil)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
safe_join(hidden_fields, "\n")
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def flatten_hash(hash, ancestor_names = [])
|
|
81
|
+
flat_hash = {}
|
|
82
|
+
hash.each do |k, v|
|
|
83
|
+
names = Array.new(ancestor_names)
|
|
84
|
+
names << k
|
|
85
|
+
if v.is_a?(Hash)
|
|
86
|
+
flat_hash.merge!(flatten_hash(v, names))
|
|
87
|
+
else
|
|
88
|
+
key = flat_hash_key(names)
|
|
89
|
+
key += "[]" if v.is_a?(Array)
|
|
90
|
+
flat_hash[key] = v
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
flat_hash
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def flat_hash_key(names)
|
|
98
|
+
names = Array.new(names)
|
|
99
|
+
name = names.shift.to_s.dup
|
|
100
|
+
names.each do |n|
|
|
101
|
+
name << "[#{n}]"
|
|
102
|
+
end
|
|
103
|
+
name
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def diff_class(char)
|
|
107
|
+
case char
|
|
108
|
+
when "~"
|
|
109
|
+
"table-warning"
|
|
110
|
+
when "-"
|
|
111
|
+
"table-danger"
|
|
112
|
+
when "+"
|
|
113
|
+
"table-success"
|
|
114
|
+
else
|
|
115
|
+
""
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# MappingsHelper
|
|
4
|
+
module MappingsHelper
|
|
5
|
+
def attribute_collection
|
|
6
|
+
attrs = Element.importable.map(&:solr_field).sort
|
|
7
|
+
attrs.prepend("")
|
|
8
|
+
attrs.prepend("Discard")
|
|
9
|
+
attrs
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def mapping_suggestion(import, header)
|
|
13
|
+
if import.mapping_configuration.include?(header.to_sym)
|
|
14
|
+
import.mapping_configuration[header.to_sym][:destination]
|
|
15
|
+
else
|
|
16
|
+
false
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def delimiter_suggestion(import, header)
|
|
21
|
+
if import.mapping_configuration.include?(header.to_sym)
|
|
22
|
+
import.mapping_configuration[header.to_sym][:delimited]
|
|
23
|
+
else
|
|
24
|
+
false
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Solr indexing for our document class. Still a work in progress.
|
|
4
|
+
class DocumentIndexer < Kithe::Indexer
|
|
5
|
+
configure do
|
|
6
|
+
# Kithe
|
|
7
|
+
to_field "model_pk_ssi", obj_extract("id") # the actual db pk, a UUID
|
|
8
|
+
|
|
9
|
+
# GeoBlacklight
|
|
10
|
+
to_field "gbl_mdVersion_s", literal("Aardvark")
|
|
11
|
+
|
|
12
|
+
# to_field 'geomg_id_s', obj_extract('friendlier_id') # the actual db pk, a UUID
|
|
13
|
+
|
|
14
|
+
# Define `to_field`(s) via Element
|
|
15
|
+
Element.indexable.each do |elm|
|
|
16
|
+
to_field elm.solr_field, obj_extract(elm.index_value)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
to_field "gbl_mdModified_dt", obj_extract("gbl_mdModified_dt")
|
|
20
|
+
|
|
21
|
+
# May want to switch to or add a 'date published' instead, right
|
|
22
|
+
# now we only have date added to DB, which is what we had in sufia.
|
|
23
|
+
to_field "date_created_dtsi" do |rec, _acc|
|
|
24
|
+
rec.created_at.utc.iso8601 if rec&.created_at
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
to_field "date_modified_dtsi" do |rec, _acc|
|
|
28
|
+
rec.updated_at.utc.iso8601 if rec&.updated_at
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# - GEOMG
|
|
32
|
+
to_field "b1g_geom_import_id_ssi", obj_extract("import_id")
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# BulkActionRevertDocumentJob
|
|
4
|
+
class BulkActionRevertDocumentJob < ApplicationJob
|
|
5
|
+
queue_as :default
|
|
6
|
+
|
|
7
|
+
def perform(action, doc)
|
|
8
|
+
case action
|
|
9
|
+
when :revert_publication_status
|
|
10
|
+
revert_publication_status(doc)
|
|
11
|
+
when :revert_delete
|
|
12
|
+
revert_delete(doc)
|
|
13
|
+
else
|
|
14
|
+
logger.debug("@TODO - #{field_name} => #{field_value}")
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def revert_publication_status(doc)
|
|
19
|
+
document = Document.find_by!(friendlier_id: doc.friendlier_id)
|
|
20
|
+
|
|
21
|
+
logger.debug("Revert PubStatus - #{document.friendlier_id}")
|
|
22
|
+
|
|
23
|
+
versions = document.versions
|
|
24
|
+
document = versions[doc.version].reify
|
|
25
|
+
document.skip_callbacks = true
|
|
26
|
+
|
|
27
|
+
if document.save
|
|
28
|
+
doc.state_machine.transition_to!(:success)
|
|
29
|
+
else
|
|
30
|
+
doc.state_machine.transition_to!(:failed)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def revert_delete(doc)
|
|
35
|
+
document = Document.new(id: doc.document_id)
|
|
36
|
+
|
|
37
|
+
logger.debug("Revert Delete - #{document.id}")
|
|
38
|
+
|
|
39
|
+
versions = document.versions
|
|
40
|
+
document = versions.last.reify
|
|
41
|
+
document.skip_callbacks = true
|
|
42
|
+
|
|
43
|
+
if document.save
|
|
44
|
+
doc.state_machine.transition_to!(:success)
|
|
45
|
+
else
|
|
46
|
+
doc.state_machine.transition_to!(:failed)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# BulkActionRevertJob
|
|
4
|
+
class BulkActionRevertJob < ApplicationJob
|
|
5
|
+
queue_as :default
|
|
6
|
+
|
|
7
|
+
def perform(bulk_action)
|
|
8
|
+
action = case bulk_action.field_name
|
|
9
|
+
when "Publication State"
|
|
10
|
+
logger.debug("BulkAction: Revert Publication Status")
|
|
11
|
+
:revert_publication_status
|
|
12
|
+
when "Delete"
|
|
13
|
+
logger.debug("BulkAction: Revert Delete")
|
|
14
|
+
:revert_delete
|
|
15
|
+
else
|
|
16
|
+
logger.debug("BulkAction: Revert Field Value")
|
|
17
|
+
:revert_field_value
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
bulk_action.documents.each do |doc|
|
|
21
|
+
BulkActionRevertDocumentJob.perform_later(action, doc)
|
|
22
|
+
doc.state_machine.transition_to!(:queued)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# BulkActionRunDocumentJob
|
|
4
|
+
class BulkActionRunDocumentJob < ApplicationJob
|
|
5
|
+
queue_as :default
|
|
6
|
+
|
|
7
|
+
def perform(action, doc, field_name, field_value)
|
|
8
|
+
case action
|
|
9
|
+
when :update_publication_status
|
|
10
|
+
update_publication_status(doc, field_value)
|
|
11
|
+
when :update_delete
|
|
12
|
+
update_delete(doc, field_value)
|
|
13
|
+
# @TODO: Field Level changes
|
|
14
|
+
else
|
|
15
|
+
logger.debug("@TODO - #{field_name} => #{field_value}")
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def update_publication_status(doc, field_value)
|
|
20
|
+
document = Document.find_by!(friendlier_id: doc.friendlier_id)
|
|
21
|
+
|
|
22
|
+
logger.debug("Update PubStatus - #{document.friendlier_id} => #{field_value}")
|
|
23
|
+
|
|
24
|
+
if document.update!(publication_state: field_value.to_sym)
|
|
25
|
+
doc.state_machine.transition_to!(:success)
|
|
26
|
+
else
|
|
27
|
+
doc.state_machine.transition_to!(:failed)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def update_delete(doc, field_value)
|
|
32
|
+
document = Document.find_by!(friendlier_id: doc.friendlier_id)
|
|
33
|
+
|
|
34
|
+
logger.debug("Update Delete - #{document.friendlier_id} => #{field_value}")
|
|
35
|
+
|
|
36
|
+
if document.destroy
|
|
37
|
+
doc.state_machine.transition_to!(:success)
|
|
38
|
+
else
|
|
39
|
+
doc.state_machine.transition_to!(:failed)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# BulkActionRunJob
|
|
4
|
+
class BulkActionRunJob < ApplicationJob
|
|
5
|
+
queue_as :default
|
|
6
|
+
|
|
7
|
+
def perform(bulk_action)
|
|
8
|
+
action = case bulk_action.field_name
|
|
9
|
+
when "Publication State"
|
|
10
|
+
logger.debug("BulkAction: Update Publication Status")
|
|
11
|
+
:update_publication_status
|
|
12
|
+
when "Delete"
|
|
13
|
+
logger.debug("BulkAction: Delete")
|
|
14
|
+
:update_delete
|
|
15
|
+
else
|
|
16
|
+
:update_field_value
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
bulk_action.documents.each do |doc|
|
|
20
|
+
BulkActionRunDocumentJob.perform_later(action, doc, bulk_action.field_name, bulk_action.field_value)
|
|
21
|
+
doc.state_machine.transition_to!(:queued)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Capture State
|
|
25
|
+
bulk_action.state_machine.transition_to!(:queued)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "csv"
|
|
4
|
+
|
|
5
|
+
# ExportJob
|
|
6
|
+
class ExportJob < ApplicationJob
|
|
7
|
+
queue_as :default
|
|
8
|
+
|
|
9
|
+
def perform(current_user, query_params, export_service)
|
|
10
|
+
logger.debug("\n\n Background Job: ♞")
|
|
11
|
+
logger.debug("User: #{current_user.inspect}")
|
|
12
|
+
logger.debug("Query: #{query_params.inspect}")
|
|
13
|
+
logger.debug("Export Service: #{export_service.inspect}")
|
|
14
|
+
logger.debug("\n\n")
|
|
15
|
+
|
|
16
|
+
# Test broadcast
|
|
17
|
+
ActionCable.server.broadcast("export_channel", {data: "Hello from Export Job!"})
|
|
18
|
+
|
|
19
|
+
# Query params into Doc ids
|
|
20
|
+
document_ids = query_params[:ids] || crawl_query(query_params)
|
|
21
|
+
|
|
22
|
+
logger.debug("Document Ids: #{document_ids}")
|
|
23
|
+
|
|
24
|
+
# Send progress
|
|
25
|
+
file_content = export_service.call(document_ids)
|
|
26
|
+
|
|
27
|
+
# Write into tempfile
|
|
28
|
+
@tempfile = Tempfile.new(["export-#{Time.zone.today}", ".csv"]).tap do |file|
|
|
29
|
+
CSV.open(file, "wb") do |csv|
|
|
30
|
+
file_content.each do |row|
|
|
31
|
+
csv << row
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Create notification
|
|
37
|
+
# Message: "Download Type|Row Count|Button Label"
|
|
38
|
+
notification = ExportNotification.with(message: "CSV (#{export_service.short_name})|#{ActionController::Base.helpers.number_with_delimiter(file_content.size - 1)} rows|CSV")
|
|
39
|
+
|
|
40
|
+
# Deliver notification
|
|
41
|
+
notification.deliver(current_user)
|
|
42
|
+
|
|
43
|
+
# Attach CSV file (can only attach after persisted)
|
|
44
|
+
notification.record.file.attach(io: @tempfile, filename: "geomg-export-#{Time.zone.today}.csv", content_type: "text/csv")
|
|
45
|
+
|
|
46
|
+
# Update UI
|
|
47
|
+
ActionCable.server.broadcast("export_channel", {
|
|
48
|
+
data: "Notification ready!",
|
|
49
|
+
actions: [
|
|
50
|
+
{
|
|
51
|
+
method: "RefreshNotifications",
|
|
52
|
+
payload: current_user.notifications.unread.count
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
})
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def crawl_query(query_params, doc_ids = [])
|
|
59
|
+
logger.debug("\n\n CRAWL Query: #{query_params}")
|
|
60
|
+
api_results = BlacklightApiIds.new(query_params)
|
|
61
|
+
logger.debug("API Results: #{api_results.results.inspect}")
|
|
62
|
+
|
|
63
|
+
doc_ids << api_results.results.pluck("id")
|
|
64
|
+
|
|
65
|
+
unless api_results.meta["pages"]["next_page"].nil?
|
|
66
|
+
crawl_query(query_params.merge!({page: api_results.meta["pages"]["next_page"]}),
|
|
67
|
+
doc_ids)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
doc_ids
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
require "pathname"
|
|
5
|
+
|
|
6
|
+
# ExportJob
|
|
7
|
+
class ExportJsonJob < ApplicationJob
|
|
8
|
+
queue_as :default
|
|
9
|
+
|
|
10
|
+
def perform(current_user, query_params, export_service)
|
|
11
|
+
Rails.logger.debug("\n\n Background Job: ♞")
|
|
12
|
+
Rails.logger.debug { "User: #{current_user.inspect}" }
|
|
13
|
+
Rails.logger.debug { "Query: #{query_params.inspect}" }
|
|
14
|
+
Rails.logger.debug { "Export Service: #{export_service.inspect}" }
|
|
15
|
+
Rails.logger.debug("\n\n")
|
|
16
|
+
|
|
17
|
+
# Test broadcast
|
|
18
|
+
ActionCable.server.broadcast("export_channel", {data: "Hello from Export JSON Job!"})
|
|
19
|
+
|
|
20
|
+
# Query params into Doc ids
|
|
21
|
+
document_ids = query_params[:ids] || crawl_query(query_params)
|
|
22
|
+
|
|
23
|
+
# Rails.logger.debug("Document Ids: #{document_ids}")
|
|
24
|
+
|
|
25
|
+
# Send progress
|
|
26
|
+
documents = export_service.call(document_ids)
|
|
27
|
+
|
|
28
|
+
# Write files into tempdir, zip together
|
|
29
|
+
FileUtils.mkdir_p("ogm")
|
|
30
|
+
|
|
31
|
+
Dir.mktmpdir do |dir|
|
|
32
|
+
documents.each do |doc|
|
|
33
|
+
# ===== Final Directory Structure =====
|
|
34
|
+
# => Zip
|
|
35
|
+
# ==> Provider
|
|
36
|
+
# ===> Resource class (first)
|
|
37
|
+
# ====> id.json
|
|
38
|
+
|
|
39
|
+
Rails.logger.debug { "==== Query Format #{query_params[:format]} ====" }
|
|
40
|
+
Rails.logger.debug { "==== Writing - #{doc.friendlier_id} - #{query_params[:format]} ====" }
|
|
41
|
+
|
|
42
|
+
begin
|
|
43
|
+
# File Path
|
|
44
|
+
code = doc.b1g_code_s.presence || "_b1g_code_s_missing"
|
|
45
|
+
resource_class = doc.gbl_resourceClass_sm.present? ? doc.gbl_resourceClass_sm.first : "_gbl_resourceClass_sm_missing"
|
|
46
|
+
tree = Pathname("#{dir}/#{resource_class}/#{code}/#{doc.friendlier_id}.json")
|
|
47
|
+
tree.dirname.mkpath
|
|
48
|
+
Rails.logger.debug tree.inspect
|
|
49
|
+
|
|
50
|
+
json_output = DocumentsController.render("_#{query_params[:format]}",
|
|
51
|
+
locals: {document: doc})
|
|
52
|
+
|
|
53
|
+
json_obj = JSON.parse(json_output)
|
|
54
|
+
Rails.logger.debug json_obj
|
|
55
|
+
|
|
56
|
+
# Remove nil/null values from JSON
|
|
57
|
+
json_obj.compact!
|
|
58
|
+
|
|
59
|
+
tree.write(JSON.pretty_generate(json_obj))
|
|
60
|
+
rescue NoMethodError => e
|
|
61
|
+
Rails.logger.debug { "==== Error! - #{doc.friendlier_id} ====" }
|
|
62
|
+
Rails.logger.debug e.inspect
|
|
63
|
+
next
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# ===== Local debugging =====
|
|
68
|
+
# Sanity check dir
|
|
69
|
+
# Rails.logger.debug '==== Dir GLOB - START ===='
|
|
70
|
+
# Rails.logger.debug Dir.glob("#{dir}/*")
|
|
71
|
+
# Rails.logger.debug '==== Dir GLOB - END ===='
|
|
72
|
+
|
|
73
|
+
# Zip dir and attach
|
|
74
|
+
@zip_file = Rails.root.join("tmp", "export-json-#{Time.zone.today}-#{SecureRandom.hex(8)}.zip")
|
|
75
|
+
zf = ZipFileGenerator.new(dir, @zip_file)
|
|
76
|
+
zf.write
|
|
77
|
+
|
|
78
|
+
Rails.logger.debug { "File size: #{@zip_file.size}" }
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Create notification
|
|
82
|
+
# Message: "Download Type|Row Count|Button Label"
|
|
83
|
+
notification = ExportNotification.with(message: "#{query_params[:format].humanize.upcase}|#{ActionController::Base.helpers.number_with_delimiter(documents.size)} rows|ZIP")
|
|
84
|
+
|
|
85
|
+
# Deliver notification
|
|
86
|
+
notification.deliver(current_user)
|
|
87
|
+
|
|
88
|
+
# Attach CSV file (can only attach after persisted)
|
|
89
|
+
notification.record.file.attach(io: File.open(@zip_file), filename: "geomg-export-#{Time.zone.today}.zip",
|
|
90
|
+
content_type: "application/zip")
|
|
91
|
+
|
|
92
|
+
Rails.logger.debug "Notification File attached!"
|
|
93
|
+
|
|
94
|
+
# Update UI
|
|
95
|
+
ActionCable.server.broadcast("export_channel", {
|
|
96
|
+
data: "Notification ready!",
|
|
97
|
+
actions: [
|
|
98
|
+
{
|
|
99
|
+
method: "RefreshNotifications",
|
|
100
|
+
payload: current_user.notifications.unread.count
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
})
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def crawl_query(query_params, doc_ids = [])
|
|
107
|
+
logger.debug("\n\n CRAWL Query: #{query_params}")
|
|
108
|
+
api_results = BlacklightApiIds.new(query_params)
|
|
109
|
+
logger.debug("API Results: #{api_results.results.inspect}")
|
|
110
|
+
|
|
111
|
+
doc_ids << api_results.results.pluck("id")
|
|
112
|
+
|
|
113
|
+
unless api_results.meta["pages"]["next_page"].nil?
|
|
114
|
+
crawl_query(query_params.merge!({page: api_results.meta["pages"]["next_page"]}),
|
|
115
|
+
doc_ids)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
doc_ids
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# ImportDocumentJob class
|
|
4
|
+
class ImportDocumentJob < ApplicationJob
|
|
5
|
+
queue_as :default
|
|
6
|
+
|
|
7
|
+
def perform(import_document)
|
|
8
|
+
# @TODO: Check for friendlier_id or raise error
|
|
9
|
+
document = Document.where(
|
|
10
|
+
friendlier_id: import_document.friendlier_id
|
|
11
|
+
).first_or_create
|
|
12
|
+
|
|
13
|
+
# Set the geom
|
|
14
|
+
document.set_geometry
|
|
15
|
+
|
|
16
|
+
if document.update(import_document.to_hash)
|
|
17
|
+
import_document.state_machine.transition_to!(:success)
|
|
18
|
+
else
|
|
19
|
+
import_document.state_machine.transition_to!(:failed, "Failed - #{document.errors.inspect}")
|
|
20
|
+
end
|
|
21
|
+
rescue => e
|
|
22
|
+
logger.debug("Error: #{e}")
|
|
23
|
+
import_document.state_machine.transition_to!(:failed, "Error - #{e.inspect}")
|
|
24
|
+
end
|
|
25
|
+
end
|