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.
Files changed (346) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +18 -0
  3. data/.gitignore +75 -0
  4. data/.standard.yml +4 -0
  5. data/Gemfile +59 -0
  6. data/LICENSE +21 -0
  7. data/README.md +84 -0
  8. data/Rakefile +72 -0
  9. data/app/assets/images/.keep +0 -0
  10. data/app/assets/images/aerial_photo.jpg +0 -0
  11. data/app/assets/images/archive-solid.svg +1 -0
  12. data/app/assets/images/bookmark-regular.svg +1 -0
  13. data/app/assets/images/bookmark-solid.svg +1 -0
  14. data/app/assets/images/btaa-logo.jpg +0 -0
  15. data/app/assets/images/cloud-download-alt-solid.svg +1 -0
  16. data/app/assets/images/file-import-solid.svg +1 -0
  17. data/app/assets/images/trash-alt-solid.svg +1 -0
  18. data/app/assets/javascripts/geoblacklight_admin/chosen.js +4 -0
  19. data/app/assets/javascripts/geoblacklight_admin/date_range_picker.js +173 -0
  20. data/app/assets/javascripts/geoblacklight_admin/datepicker.js +22 -0
  21. data/app/assets/javascripts/geoblacklight_admin/elements.js +38 -0
  22. data/app/assets/javascripts/geoblacklight_admin/exports.js +3 -0
  23. data/app/assets/javascripts/geoblacklight_admin/fields.js +11 -0
  24. data/app/assets/javascripts/geoblacklight_admin/geoblacklight_admin.js +2 -0
  25. data/app/assets/javascripts/geoblacklight_admin/inputmask.js +4 -0
  26. data/app/assets/javascripts/geoblacklight_admin/locale.js +5 -0
  27. data/app/assets/javascripts/geoblacklight_admin/sortable.js +2544 -0
  28. data/app/assets/javascripts/geoblacklight_admin/tooltips.js +3 -0
  29. data/app/assets/javascripts/geoblacklight_admin/truncate.js +4 -0
  30. data/app/assets/javascripts/geoblacklight_admin.js +40 -0
  31. data/app/assets/stylesheets/geoblacklight_admin/_core.scss +47 -0
  32. data/app/assets/stylesheets/geoblacklight_admin/modules/_autocomplete.scss +32 -0
  33. data/app/assets/stylesheets/geoblacklight_admin/modules/_blazer.scss +3 -0
  34. data/app/assets/stylesheets/geoblacklight_admin/modules/_code.scss +3 -0
  35. data/app/assets/stylesheets/geoblacklight_admin/modules/_datepicker.scss +477 -0
  36. data/app/assets/stylesheets/geoblacklight_admin/modules/_elements.scss +3 -0
  37. data/app/assets/stylesheets/geoblacklight_admin/modules/_forms.scss +28 -0
  38. data/app/assets/stylesheets/geoblacklight_admin/modules/_icons.scss +15 -0
  39. data/app/assets/stylesheets/geoblacklight_admin/modules/_nav.scss +9 -0
  40. data/app/assets/stylesheets/geoblacklight_admin/modules/_tables.scss +4 -0
  41. data/app/assets/stylesheets/geoblacklight_admin/modules/_toasts.scss +7 -0
  42. data/app/assets/stylesheets/geoblacklight_admin/modules/_visibility.scss +3 -0
  43. data/app/assets/stylesheets/geoblacklight_admin/settings/_variables.scss +1 -0
  44. data/app/channels/export_channel.rb +12 -0
  45. data/app/controllers/admin/admin_controller.rb +16 -0
  46. data/app/controllers/admin/advanced_search_controller.rb +365 -0
  47. data/app/controllers/admin/api_controller.rb +386 -0
  48. data/app/controllers/admin/bookmarks_controller.rb +68 -0
  49. data/app/controllers/admin/bulk_actions_controller.rb +94 -0
  50. data/app/controllers/admin/concerns/.keep +0 -0
  51. data/app/controllers/admin/concerns/upload_util.rb +8 -0
  52. data/app/controllers/admin/document_accesses_controller.rb +125 -0
  53. data/app/controllers/admin/document_assets_controller.rb +198 -0
  54. data/app/controllers/admin/document_downloads_controller.rb +127 -0
  55. data/app/controllers/admin/documents_controller.rb +219 -0
  56. data/app/controllers/admin/elements_controller.rb +81 -0
  57. data/app/controllers/admin/form_elements_controller.rb +81 -0
  58. data/app/controllers/admin/ids_controller.rb +379 -0
  59. data/app/controllers/admin/import_documents_controller.rb +18 -0
  60. data/app/controllers/admin/imports_controller.rb +105 -0
  61. data/app/controllers/admin/mappings_controller.rb +95 -0
  62. data/app/controllers/admin/notifications_controller.rb +51 -0
  63. data/app/controllers/admin/search_controller.rb +10 -0
  64. data/app/controllers/admin/users_controller.rb +10 -0
  65. data/app/helpers/bulk_actions_helper.rb +9 -0
  66. data/app/helpers/document_helper.rb +60 -0
  67. data/app/helpers/form_input_helper.rb +73 -0
  68. data/app/helpers/geoblacklight_admin_helper.rb +118 -0
  69. data/app/helpers/import_documents_helper.rb +5 -0
  70. data/app/helpers/mappings_helper.rb +27 -0
  71. data/app/indexers/document_indexer.rb +34 -0
  72. data/app/jobs/bulk_action_revert_document_job.rb +49 -0
  73. data/app/jobs/bulk_action_revert_job.rb +25 -0
  74. data/app/jobs/bulk_action_run_document_job.rb +42 -0
  75. data/app/jobs/bulk_action_run_job.rb +27 -0
  76. data/app/jobs/export_job.rb +72 -0
  77. data/app/jobs/export_json_job.rb +120 -0
  78. data/app/jobs/import_document_job.rb +25 -0
  79. data/app/jobs/import_run_job.rb +33 -0
  80. data/app/models/active_storage_attachment.rb +5 -0
  81. data/app/models/active_storage_blob.rb +5 -0
  82. data/app/models/api_search_builder.rb +12 -0
  83. data/app/models/application_record.rb +6 -0
  84. data/app/models/blacklight_api.rb +93 -0
  85. data/app/models/blacklight_api_facets.rb +15 -0
  86. data/app/models/blacklight_api_ids.rb +103 -0
  87. data/app/models/bookmark.rb +17 -0
  88. data/app/models/bulk_action.rb +88 -0
  89. data/app/models/bulk_action_document.rb +22 -0
  90. data/app/models/bulk_action_document_state_machine.rb +16 -0
  91. data/app/models/bulk_action_document_transition.rb +19 -0
  92. data/app/models/bulk_action_state_machine.rb +16 -0
  93. data/app/models/bulk_action_transition.rb +26 -0
  94. data/app/models/concerns/.keep +0 -0
  95. data/app/models/document/bbox_validator.rb +70 -0
  96. data/app/models/document/controlled_lists.rb +104 -0
  97. data/app/models/document/date_range_validator.rb +63 -0
  98. data/app/models/document/geom_validator.rb +117 -0
  99. data/app/models/document/reference.rb +107 -0
  100. data/app/models/document.rb +264 -0
  101. data/app/models/document_access.rb +35 -0
  102. data/app/models/document_download.rb +35 -0
  103. data/app/models/document_state_machine.rb +14 -0
  104. data/app/models/document_transition.rb +26 -0
  105. data/app/models/element.rb +90 -0
  106. data/app/models/form_control.rb +2 -0
  107. data/app/models/form_element.rb +19 -0
  108. data/app/models/form_feature.rb +2 -0
  109. data/app/models/form_group.rb +2 -0
  110. data/app/models/form_header.rb +2 -0
  111. data/app/models/geoblacklight_admin/field_mappings_btaa_aardvark.rb +379 -0
  112. data/app/models/geoblacklight_admin/field_mappings_gblv1.rb +344 -0
  113. data/app/models/geoblacklight_admin/iso_language_codes.rb +515 -0
  114. data/app/models/geoblacklight_admin/schema.rb +194 -0
  115. data/app/models/geoblacklight_admin.rb +3 -0
  116. data/app/models/import/csv_duplicates_validator.rb +36 -0
  117. data/app/models/import/csv_header_validator.rb +24 -0
  118. data/app/models/import.rb +186 -0
  119. data/app/models/import_btaa.rb +91 -0
  120. data/app/models/import_btaa_aardvark.rb +109 -0
  121. data/app/models/import_document.rb +34 -0
  122. data/app/models/import_document_state_machine.rb +12 -0
  123. data/app/models/import_document_transition.rb +19 -0
  124. data/app/models/import_gblv1.rb +92 -0
  125. data/app/models/import_state_machine.rb +16 -0
  126. data/app/models/import_transition.rb +26 -0
  127. data/app/models/mapping.rb +10 -0
  128. data/app/models/notification.rb +9 -0
  129. data/app/models/user.rb +26 -0
  130. data/app/notifications/export_notification.rb +30 -0
  131. data/app/services/export_csv_document_access_links_service.rb +47 -0
  132. data/app/services/export_csv_document_downloads_service.rb +47 -0
  133. data/app/services/export_csv_service.rb +44 -0
  134. data/app/services/export_json_service.rb +35 -0
  135. data/app/services/zip_file_generator.rb +56 -0
  136. data/app/views/admin/advanced_search/facets.json.jbuilder +80 -0
  137. data/app/views/admin/advanced_search/index.json.jbuilder +90 -0
  138. data/app/views/admin/api/_field.json.jbuilder +10 -0
  139. data/app/views/admin/api/fetch.json.jbuilder +86 -0
  140. data/app/views/admin/api/index.json.jbuilder +90 -0
  141. data/app/views/admin/bookmarks/_bookmark.json.jbuilder +4 -0
  142. data/app/views/admin/bookmarks/create.js.erb +7 -0
  143. data/app/views/admin/bookmarks/destroy.js.erb +7 -0
  144. data/app/views/admin/bookmarks/index.html.erb +21 -0
  145. data/app/views/admin/bookmarks/index.json.jbuilder +3 -0
  146. data/app/views/admin/bulk_actions/_bulk_action.json.jbuilder +4 -0
  147. data/app/views/admin/bulk_actions/_form.html.erb +17 -0
  148. data/app/views/admin/bulk_actions/edit.html.erb +6 -0
  149. data/app/views/admin/bulk_actions/index.html.erb +54 -0
  150. data/app/views/admin/bulk_actions/index.json.jbuilder +3 -0
  151. data/app/views/admin/bulk_actions/new.html.erb +5 -0
  152. data/app/views/admin/bulk_actions/show.html.erb +100 -0
  153. data/app/views/admin/bulk_actions/show.json.jbuilder +3 -0
  154. data/app/views/admin/devise/confirmations/new.html.erb +16 -0
  155. data/app/views/admin/devise/invitations/edit.html.erb +15 -0
  156. data/app/views/admin/devise/invitations/new.html.erb +15 -0
  157. data/app/views/admin/devise/mailer/invitation_instructions.html.erb +11 -0
  158. data/app/views/admin/devise/mailer/invitation_instructions.text.erb +11 -0
  159. data/app/views/admin/devise/passwords/edit.html.erb +26 -0
  160. data/app/views/admin/devise/passwords/new.html.erb +16 -0
  161. data/app/views/admin/devise/registrations/edit.html.erb +35 -0
  162. data/app/views/admin/devise/registrations/new.html.erb +30 -0
  163. data/app/views/admin/devise/sessions/new.html.erb +28 -0
  164. data/app/views/admin/devise/shared/_links.html.erb +27 -0
  165. data/app/views/admin/devise/unlocks/new.html.erb +16 -0
  166. data/app/views/admin/document_accesses/_document_access.json.jbuilder +4 -0
  167. data/app/views/admin/document_accesses/_form.html.erb +17 -0
  168. data/app/views/admin/document_accesses/destroy_all.html.erb +70 -0
  169. data/app/views/admin/document_accesses/edit.html.erb +5 -0
  170. data/app/views/admin/document_accesses/import.html.erb +70 -0
  171. data/app/views/admin/document_accesses/index.html.erb +74 -0
  172. data/app/views/admin/document_accesses/index.json.jbuilder +3 -0
  173. data/app/views/admin/document_accesses/new.html.erb +6 -0
  174. data/app/views/admin/document_accesses/show.html.erb +19 -0
  175. data/app/views/admin/document_accesses/show.json.jbuilder +3 -0
  176. data/app/views/admin/document_assets/display_attach_form.html.erb +44 -0
  177. data/app/views/admin/document_assets/index.html.erb +65 -0
  178. data/app/views/admin/document_downloads/_document_download.json.jbuilder +4 -0
  179. data/app/views/admin/document_downloads/_form.html.erb +15 -0
  180. data/app/views/admin/document_downloads/destroy_all.html.erb +70 -0
  181. data/app/views/admin/document_downloads/edit.html.erb +6 -0
  182. data/app/views/admin/document_downloads/import.html.erb +74 -0
  183. data/app/views/admin/document_downloads/index.html.erb +70 -0
  184. data/app/views/admin/document_downloads/index.json.jbuilder +3 -0
  185. data/app/views/admin/document_downloads/new.html.erb +5 -0
  186. data/app/views/admin/document_downloads/show.html.erb +24 -0
  187. data/app/views/admin/document_downloads/show.json.jbuilder +3 -0
  188. data/app/views/admin/documents/_document.html.erb +29 -0
  189. data/app/views/admin/documents/_document_bookmark.html.erb +17 -0
  190. data/app/views/admin/documents/_document_fields.html.erb +24 -0
  191. data/app/views/admin/documents/_form.html.erb +49 -0
  192. data/app/views/admin/documents/_form_control.html.erb +86 -0
  193. data/app/views/admin/documents/_form_group.html.erb +1 -0
  194. data/app/views/admin/documents/_form_header.html.erb +1 -0
  195. data/app/views/admin/documents/_form_nav.html.erb +21 -0
  196. data/app/views/admin/documents/_json_aardvark.jbuilder +47 -0
  197. data/app/views/admin/documents/_json_btaa_aardvark.jbuilder +16 -0
  198. data/app/views/admin/documents/_json_gbl_v1.jbuilder +32 -0
  199. data/app/views/admin/documents/_result_facets.html.erb +35 -0
  200. data/app/views/admin/documents/_result_pagination.html.erb +21 -0
  201. data/app/views/admin/documents/_result_selected_options.html.erb +54 -0
  202. data/app/views/admin/documents/_result_selection_options.html.erb +10 -0
  203. data/app/views/admin/documents/_result_toggle.html.erb +13 -0
  204. data/app/views/admin/documents/edit.html.erb +7 -0
  205. data/app/views/admin/documents/features/_assets.html.erb +3 -0
  206. data/app/views/admin/documents/features/_institutional_access_links.html.erb +3 -0
  207. data/app/views/admin/documents/features/_multiple_download_links.html.erb +27 -0
  208. data/app/views/admin/documents/fetch.json_aardvark.jbuilder +9 -0
  209. data/app/views/admin/documents/fetch.json_btaa_aardvark.jbuilder +9 -0
  210. data/app/views/admin/documents/fetch.json_gbl_v1.jbuilder +9 -0
  211. data/app/views/admin/documents/index.html.erb +49 -0
  212. data/app/views/admin/documents/index.json_aardvark.jbuilder +9 -0
  213. data/app/views/admin/documents/index.json_btaa_aardvark.jbuilder +9 -0
  214. data/app/views/admin/documents/index.json_gbl_v1.jbuilder +9 -0
  215. data/app/views/admin/documents/show.json_aardvark.jbuilder +3 -0
  216. data/app/views/admin/documents/show.json_btaa_aardvark.jbuilder +3 -0
  217. data/app/views/admin/documents/show.json_gbl_v1.jbuilder +3 -0
  218. data/app/views/admin/documents/versions.html.erb +110 -0
  219. data/app/views/admin/elements/_element.json.jbuilder +2 -0
  220. data/app/views/admin/elements/_form.html.erb +45 -0
  221. data/app/views/admin/elements/edit.html.erb +6 -0
  222. data/app/views/admin/elements/index.html.erb +68 -0
  223. data/app/views/admin/elements/index.json.jbuilder +1 -0
  224. data/app/views/admin/elements/new.html.erb +5 -0
  225. data/app/views/admin/elements/show.html.erb +121 -0
  226. data/app/views/admin/elements/show.json.jbuilder +1 -0
  227. data/app/views/admin/form_elements/_form.html.erb +46 -0
  228. data/app/views/admin/form_elements/_form_element.json.jbuilder +2 -0
  229. data/app/views/admin/form_elements/edit.html.erb +6 -0
  230. data/app/views/admin/form_elements/index.html.erb +49 -0
  231. data/app/views/admin/form_elements/index.json.jbuilder +1 -0
  232. data/app/views/admin/form_elements/new.html.erb +5 -0
  233. data/app/views/admin/form_elements/show.html.erb +19 -0
  234. data/app/views/admin/form_elements/show.json.jbuilder +1 -0
  235. data/app/views/admin/ids/fetch.json.jbuilder +86 -0
  236. data/app/views/admin/ids/index.json.jbuilder +41 -0
  237. data/app/views/admin/import_documents/show.html.haml +20 -0
  238. data/app/views/admin/imports/_form.html.erb +27 -0
  239. data/app/views/admin/imports/_import.json.jbuilder +4 -0
  240. data/app/views/admin/imports/_show_failed_tab.html.erb +37 -0
  241. data/app/views/admin/imports/_show_success_tab.html.erb +31 -0
  242. data/app/views/admin/imports/edit.html.erb +8 -0
  243. data/app/views/admin/imports/index.html.erb +56 -0
  244. data/app/views/admin/imports/index.json.jbuilder +3 -0
  245. data/app/views/admin/imports/new.html.erb +7 -0
  246. data/app/views/admin/imports/show.html.erb +123 -0
  247. data/app/views/admin/imports/show.json.jbuilder +3 -0
  248. data/app/views/admin/layouts/application.html.erb +30 -0
  249. data/app/views/admin/layouts/blazer/application.html.erb +23 -0
  250. data/app/views/admin/layouts/mailer.html.erb +13 -0
  251. data/app/views/admin/layouts/mailer.text.erb +1 -0
  252. data/app/views/admin/mappings/_form.html.erb +17 -0
  253. data/app/views/admin/mappings/_mapping.json.jbuilder +4 -0
  254. data/app/views/admin/mappings/edit.html.erb +6 -0
  255. data/app/views/admin/mappings/index.html.erb +37 -0
  256. data/app/views/admin/mappings/index.json.jbuilder +3 -0
  257. data/app/views/admin/mappings/new.html.erb +5 -0
  258. data/app/views/admin/mappings/show.html.erb +27 -0
  259. data/app/views/admin/mappings/show.json.jbuilder +3 -0
  260. data/app/views/admin/notifications/_notification.html.haml +31 -0
  261. data/app/views/admin/notifications/index.html.erb +54 -0
  262. data/app/views/admin/notifications/update.js.erb +7 -0
  263. data/app/views/admin/search/index.html.erb +38 -0
  264. data/app/views/admin/shared/_flash_messages.html.erb +5 -0
  265. data/app/views/admin/shared/_footer.html.erb +56 -0
  266. data/app/views/admin/shared/_js_behaviors.html.erb +147 -0
  267. data/app/views/admin/shared/_navbar.html.erb +78 -0
  268. data/app/views/admin/shared/_navbar_blazer.html.erb +42 -0
  269. data/app/views/admin/shared/_schema_timestamp.html.erb +16 -0
  270. data/app/views/admin/shared/_toast.html.erb +13 -0
  271. data/app/views/admin/users/index.html.erb +21 -0
  272. data/config/authorities/formats.yml +25 -0
  273. data/config/authorities/languages.yml +50 -0
  274. data/config/authorities/resource_type.yml +82 -0
  275. data/config/blazer.yml +79 -0
  276. data/config/gbl_v1_schema.json +118 -0
  277. data/config/geomg_aardvark_schema.json +211 -0
  278. data/config/geomg_schema.json +123 -0
  279. data/config/locales/devise.en.yml +65 -0
  280. data/config/locales/devise_invitable.en.yml +31 -0
  281. data/config/locales/documents.en.yml +189 -0
  282. data/config/locales/en.yml +51 -0
  283. data/config/locales/geoblacklight.en.yml +178 -0
  284. data/config/locales/simple_form.en.yml +31 -0
  285. data/config/routes.rb +162 -0
  286. data/db/migrate/20230316183001_add_geoblacklight_admin.rb +399 -0
  287. data/db/seeds.rb +26 -0
  288. data/db/seeds_elements.csv +56 -0
  289. data/db/seeds_elements.numbers +0 -0
  290. data/db/seeds_form_elements.csv +71 -0
  291. data/db/seeds_form_elements.numbers +0 -0
  292. data/db/structure.sql +816 -0
  293. data/geoblacklight_admin.gemspec +67 -0
  294. data/lib/generators/geoblacklight_admin/config_generator.rb +336 -0
  295. data/lib/generators/geoblacklight_admin/example_docs_generator.rb +18 -0
  296. data/lib/generators/geoblacklight_admin/helpers_generator.rb +18 -0
  297. data/lib/generators/geoblacklight_admin/install_generator.rb +60 -0
  298. data/lib/generators/geoblacklight_admin/jobs_generator.rb +21 -0
  299. data/lib/generators/geoblacklight_admin/models_generator.rb +23 -0
  300. data/lib/generators/geoblacklight_admin/templates/.env.development.example +28 -0
  301. data/lib/generators/geoblacklight_admin/templates/.solr_wrapper.yml +7 -0
  302. data/lib/generators/geoblacklight_admin/templates/_user_util_links.html.erb +30 -0
  303. data/lib/generators/geoblacklight_admin/templates/config/database.yml +18 -0
  304. data/lib/generators/geoblacklight_admin/templates/config/geomg_aardvark_schema.json +211 -0
  305. data/lib/generators/geoblacklight_admin/templates/config/initializers/geoblacklight_admin.rb +25 -0
  306. data/lib/generators/geoblacklight_admin/templates/config/initializers/kithe.rb +31 -0
  307. data/lib/generators/geoblacklight_admin/templates/config/initializers/pagy.rb +158 -0
  308. data/lib/generators/geoblacklight_admin/templates/config/initializers/statesman.rb +7 -0
  309. data/lib/generators/geoblacklight_admin/templates/javascript/channels/consumer.js +6 -0
  310. data/lib/generators/geoblacklight_admin/templates/javascript/channels/export_channel.js +30 -0
  311. data/lib/generators/geoblacklight_admin/templates/javascript/channels/index.js +5 -0
  312. data/lib/generators/geoblacklight_admin/templates/javascript/controllers/application_controller.js +17 -0
  313. data/lib/generators/geoblacklight_admin/templates/javascript/controllers/document_controller.js +26 -0
  314. data/lib/generators/geoblacklight_admin/templates/javascript/controllers/index.js +10 -0
  315. data/lib/generators/geoblacklight_admin/templates/javascript/controllers/results_controller.js +310 -0
  316. data/lib/generators/geoblacklight_admin/templates/javascript/packs/application.js +23 -0
  317. data/lib/generators/geoblacklight_admin/templates/javascript/src/js/admin/qa_autocomplete.js +1134 -0
  318. data/lib/generators/geoblacklight_admin/templates/package.json +32 -0
  319. data/lib/generators/geoblacklight_admin/templates/solr/README-geoblacklight-solr-development.txt +3 -0
  320. data/lib/generators/geoblacklight_admin/templates/solr/conf/_rest_managed.json +3 -0
  321. data/lib/generators/geoblacklight_admin/templates/solr/conf/admin-extra.html +31 -0
  322. data/lib/generators/geoblacklight_admin/templates/solr/conf/core.properties +5 -0
  323. data/lib/generators/geoblacklight_admin/templates/solr/conf/elevate.xml +36 -0
  324. data/lib/generators/geoblacklight_admin/templates/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  325. data/lib/generators/geoblacklight_admin/templates/solr/conf/protwords.txt +21 -0
  326. data/lib/generators/geoblacklight_admin/templates/solr/conf/schema.xml +229 -0
  327. data/lib/generators/geoblacklight_admin/templates/solr/conf/scripts.conf +24 -0
  328. data/lib/generators/geoblacklight_admin/templates/solr/conf/solrconfig.xml +266 -0
  329. data/lib/generators/geoblacklight_admin/templates/solr/conf/spellings.txt +2 -0
  330. data/lib/generators/geoblacklight_admin/templates/solr/conf/stopwords.txt +58 -0
  331. data/lib/generators/geoblacklight_admin/templates/solr/conf/stopwords_en.txt +58 -0
  332. data/lib/generators/geoblacklight_admin/templates/solr/conf/synonyms.txt +43 -0
  333. data/lib/generators/geoblacklight_admin/templates/solr/conf/xslt/example.xsl +132 -0
  334. data/lib/generators/geoblacklight_admin/templates/solr/conf/xslt/example_atom.xsl +67 -0
  335. data/lib/generators/geoblacklight_admin/templates/solr/conf/xslt/example_rss.xsl +66 -0
  336. data/lib/generators/geoblacklight_admin/templates/solr/conf/xslt/luke.xsl +337 -0
  337. data/lib/generators/geoblacklight_admin/templates/solr/snapshots/.keep +0 -0
  338. data/lib/generators/geoblacklight_admin/views_generator.rb +19 -0
  339. data/lib/geoblacklight_admin/engine.rb +20 -0
  340. data/lib/geoblacklight_admin/version.rb +5 -0
  341. data/lib/geoblacklight_admin.rb +7 -0
  342. data/lib/tasks/.keep +0 -0
  343. data/lib/tasks/geoblacklight_admin.rake +209 -0
  344. data/spec/test_app_templates/lib/generators/test_app_generator.rb +35 -0
  345. data/template.rb +16 -0
  346. 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,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ImportDocumentsHelper
4
+ module ImportDocumentsHelper
5
+ 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