lcms-engine 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -1
  3. data/.dockerignore +25 -0
  4. data/.env.docker +1 -1
  5. data/.eslintignore +2 -1
  6. data/.eslintrc +23 -73
  7. data/.nvmrc +1 -1
  8. data/.overcommit.yml +8 -2
  9. data/.prettierrc +7 -0
  10. data/.rubocop.yml +12 -8
  11. data/.ruby-version +1 -1
  12. data/.stylelintignore +9 -0
  13. data/.stylelintrc +8 -0
  14. data/CHANGELOG.md +50 -1
  15. data/Dockerfile +3 -3
  16. data/Gemfile.lock +408 -322
  17. data/README.md +20 -17
  18. data/app/assets/config/lcms_engine_manifest.js +4 -2
  19. data/app/assets/javascripts/lcms/engine/admin/{application.js → lcms_engine_application.js} +1 -3
  20. data/app/assets/javascripts/lcms/engine/initializers/foundation.js +1 -1
  21. data/app/assets/javascripts/lcms/engine/{application.js → lcms_engine_application.js} +0 -0
  22. data/app/assets/stylesheets/lcms/engine/admin/collections.scss +2 -1
  23. data/app/assets/stylesheets/lcms/engine/admin/components.scss +60 -19
  24. data/app/assets/stylesheets/lcms/engine/admin/curriculums.scss +12 -10
  25. data/app/assets/stylesheets/lcms/engine/admin/lessons.scss +21 -15
  26. data/app/assets/stylesheets/lcms/engine/admin/materials.scss +25 -17
  27. data/app/assets/stylesheets/lcms/engine/admin/resources.scss +8 -7
  28. data/app/assets/stylesheets/lcms/engine/admin/standards.scss +4 -1
  29. data/app/assets/stylesheets/lcms/engine/admin/users.scss +1 -1
  30. data/app/assets/stylesheets/lcms/engine/base/_colors.scss +8 -10
  31. data/app/assets/stylesheets/lcms/engine/base/_ld-colors.scss +10 -10
  32. data/app/assets/stylesheets/lcms/engine/components/_assoc-picker.scss +4 -5
  33. data/app/assets/stylesheets/lcms/engine/components/lesson/_activity.scss +6 -2
  34. data/app/assets/stylesheets/lcms/engine/components/lesson/_callout.scss +19 -5
  35. data/app/assets/stylesheets/lcms/engine/components/lesson/_columns.scss +4 -3
  36. data/app/assets/stylesheets/lcms/engine/components/lesson/_curriculum-map.scss +16 -7
  37. data/app/assets/stylesheets/lcms/engine/components/lesson/_def.scss +2 -2
  38. data/app/assets/stylesheets/lcms/engine/components/lesson/_expand.scss +9 -9
  39. data/app/assets/stylesheets/lcms/engine/components/lesson/_foundational-divider.scss +0 -1
  40. data/app/assets/stylesheets/lcms/engine/components/lesson/_group.scss +3 -1
  41. data/app/assets/stylesheets/lcms/engine/components/lesson/_icons.scss +1 -1
  42. data/app/assets/stylesheets/lcms/engine/components/lesson/_image-wrap.scss +2 -2
  43. data/app/assets/stylesheets/lcms/engine/components/lesson/_inset.scss +7 -2
  44. data/app/assets/stylesheets/lcms/engine/components/lesson/_materials.scss +1 -1
  45. data/app/assets/stylesheets/lcms/engine/components/lesson/_multiple-choice.scss +4 -1
  46. data/app/assets/stylesheets/lcms/engine/components/lesson/_override.scss +28 -9
  47. data/app/assets/stylesheets/lcms/engine/components/lesson/_pd.scss +7 -7
  48. data/app/assets/stylesheets/lcms/engine/components/lesson/_pv.scss +5 -4
  49. data/app/assets/stylesheets/lcms/engine/components/lesson/_section.scss +10 -3
  50. data/app/assets/stylesheets/lcms/engine/components/lesson/_selection-control.scss +14 -8
  51. data/app/assets/stylesheets/lcms/engine/components/lesson/_sidebar.scss +25 -10
  52. data/app/assets/stylesheets/lcms/engine/components/lesson/_title.scss +3 -1
  53. data/app/assets/stylesheets/lcms/engine/components/lesson/_unit-map.scss +1 -1
  54. data/app/assets/stylesheets/lcms/engine/components/material/_material.scss +3 -3
  55. data/app/assets/stylesheets/lcms/engine/components/material/_overlay.scss +12 -4
  56. data/app/assets/stylesheets/lcms/engine/components/material/_preview.scss +1 -1
  57. data/app/assets/stylesheets/lcms/engine/components/support/_survey.scss +3 -1
  58. data/app/assets/stylesheets/lcms/engine/layout/_footer.scss +29 -11
  59. data/app/assets/stylesheets/lcms/engine/layout/_header.scss +5 -5
  60. data/app/assets/stylesheets/lcms/engine/layout/_navigation.scss +4 -6
  61. data/app/assets/stylesheets/lcms/engine/layout/_page.scss +2 -2
  62. data/app/assets/stylesheets/lcms/engine/{admin.scss → lcms_engine_admin.scss} +26 -15
  63. data/app/assets/stylesheets/lcms/engine/lcms_engine_application.scss +9 -0
  64. data/app/assets/stylesheets/lcms/engine/pdf.scss +5 -26
  65. data/app/assets/stylesheets/lcms/engine/pdf_plain.scss +5 -23
  66. data/app/assets/stylesheets/lcms/engine/print/_base.scss +41 -12
  67. data/app/assets/stylesheets/lcms/engine/print/_cover.scss +12 -12
  68. data/app/assets/stylesheets/lcms/engine/print/_footer.scss +8 -3
  69. data/app/assets/stylesheets/lcms/engine/print/_gdoc-base.scss +10 -37
  70. data/app/assets/stylesheets/lcms/engine/print/_helpers.scss +5 -2
  71. data/app/assets/stylesheets/lcms/engine/print/_lesson-base.scss +2 -14
  72. data/app/assets/stylesheets/lcms/engine/print/_material-base.scss +1 -3
  73. data/app/assets/stylesheets/lcms/engine/print/_print.scss +15 -8
  74. data/app/assets/stylesheets/lcms/engine/print/_toc.scss +24 -9
  75. data/app/assets/stylesheets/lcms/engine/print/gdoc/_base-typography.scss +24 -6
  76. data/app/assets/stylesheets/lcms/engine/print/gdoc/_base.scss +10 -3
  77. data/app/assets/stylesheets/lcms/engine/print/gdoc/_colors.scss +3 -3
  78. data/app/assets/stylesheets/lcms/engine/print/gdoc/_header.scss +2 -2
  79. data/app/assets/stylesheets/lcms/engine/print/gdoc/_helpers.scss +1 -0
  80. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_activity.scss +1 -1
  81. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_agenda.scss +8 -2
  82. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_callout.scss +16 -6
  83. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_def.scss +1 -1
  84. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_dialogue.scss +3 -1
  85. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_expand.scss +5 -2
  86. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_image-wrap.scss +5 -3
  87. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_image.scss +1 -1
  88. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_optbreak.scss +1 -0
  89. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_section.scss +4 -1
  90. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_smp.scss +1 -0
  91. data/app/assets/stylesheets/lcms/engine/print/gdoc/lesson/_tables.scss +11 -3
  92. data/app/assets/stylesheets/lcms/engine/print/gdoc/material/_header.scss +5 -2
  93. data/app/assets/stylesheets/lcms/engine/print/lesson/_base-typography.scss +33 -9
  94. data/app/assets/stylesheets/lcms/engine/print/lesson/_group.scss +3 -1
  95. data/app/assets/stylesheets/lcms/engine/print/lesson/_image.scss +3 -1
  96. data/app/assets/stylesheets/lcms/engine/print/lesson/_materials.scss +1 -1
  97. data/app/assets/stylesheets/lcms/engine/print/lesson/_pd.scss +8 -4
  98. data/app/assets/stylesheets/lcms/engine/print/lesson/_section.scss +1 -1
  99. data/app/assets/stylesheets/lcms/engine/print/material/_header.scss +4 -1
  100. data/app/assets/stylesheets/lcms/engine/themes/_material.scss +11 -11
  101. data/app/assets/stylesheets/lcms/engine/utils/_colorcodes.scss +15 -5
  102. data/app/assets/stylesheets/lcms/engine/utils/_functions.scss +1 -1
  103. data/app/assets/stylesheets/lcms/engine/utils/_helpers.scss +23 -11
  104. data/app/assets/stylesheets/lcms/engine/utils/_placeholders.scss +1 -1
  105. data/app/assets/stylesheets/lcms/engine/utils/_variables.scss +11 -11
  106. data/app/assets/stylesheets/lcms/engine/vendors/{mathjax.css → mathjax.scss} +0 -0
  107. data/app/assets/stylesheets/lcms/engine/vendors/react-tagsinput.css +48 -0
  108. data/app/controllers/concerns/lcms/engine/reimportable.rb +12 -2
  109. data/app/controllers/lcms/engine/admin/access_codes_controller.rb +8 -3
  110. data/app/controllers/lcms/engine/admin/admin_controller.rb +6 -40
  111. data/app/controllers/lcms/engine/admin/association_picker_controller.rb +4 -1
  112. data/app/controllers/lcms/engine/admin/batch_reimports_controller.rb +2 -2
  113. data/app/controllers/lcms/engine/admin/curriculums_controller.rb +21 -2
  114. data/app/controllers/lcms/engine/admin/documents_controller.rb +41 -14
  115. data/app/controllers/lcms/engine/admin/materials_controller.rb +32 -13
  116. data/app/controllers/lcms/engine/admin/resource_bulk_edits_controller.rb +2 -2
  117. data/app/controllers/lcms/engine/admin/resources_controller.rb +9 -7
  118. data/app/controllers/lcms/engine/admin/settings_controller.rb +1 -1
  119. data/app/controllers/lcms/engine/admin/standards_controller.rb +7 -2
  120. data/app/controllers/lcms/engine/admin/users_controller.rb +15 -7
  121. data/app/controllers/lcms/engine/application_controller.rb +1 -1
  122. data/app/controllers/lcms/engine/resources_controller.rb +5 -5
  123. data/app/controllers/lcms/engine/welcome_controller.rb +11 -0
  124. data/app/entities/lcms/engine/grades.rb +17 -6
  125. data/app/entities/lcms/engine/hierarchical_position.rb +1 -2
  126. data/app/entities/lcms/engine/media_embed.rb +2 -2
  127. data/app/entities/lcms/engine/pagination.rb +14 -10
  128. data/app/entities/lcms/engine/roman_numerals.rb +2 -2
  129. data/app/exceptions/lcms/engine/document_error.rb +8 -0
  130. data/app/exceptions/lcms/engine/material_error.rb +8 -0
  131. data/app/forms/lcms/engine/document_form.rb +19 -14
  132. data/app/forms/lcms/engine/material_form.rb +3 -2
  133. data/app/helpers/admin/components_helper.rb +3 -3
  134. data/app/helpers/lcms/engine/path_helper.rb +32 -0
  135. data/app/helpers/lcms/engine/resource_helper.rb +1 -1
  136. data/app/helpers/lcms/engine/view_helper.rb +1 -9
  137. data/app/interactors/lcms/engine/explore_curriculum_interactor.rb +2 -2
  138. data/app/javascript/components/admin/ImportStatus.jsx +90 -56
  139. data/app/javascript/components/admin/Initializer.jsx +33 -35
  140. data/app/javascript/components/admin/MultiSelectedOperation.jsx +43 -18
  141. data/app/javascript/components/admin/association-picker/AssociationPicker.jsx +68 -47
  142. data/app/javascript/components/admin/association-picker/AssociationPickerItem.jsx +18 -7
  143. data/app/javascript/components/admin/association-picker/AssociationPickerResults.jsx +42 -17
  144. data/app/javascript/components/admin/association-picker/AssociationPickerWindow.jsx +47 -27
  145. data/app/javascript/components/admin/curriculum/CurriculumEditor.jsx +54 -32
  146. data/app/javascript/components/admin/curriculum/DirectoryPicker.jsx +80 -53
  147. data/app/javascript/components/admin/picker/PickerButton.jsx +16 -11
  148. data/app/javascript/components/admin/picker/pickerModal.jsx +6 -6
  149. data/app/javascript/components/admin/picker/pickerWindowWrapper.jsx +61 -40
  150. data/app/javascript/components/admin/resource-picker/ResourcePicker.jsx +54 -39
  151. data/app/javascript/components/admin/resource-picker/ResourcePickerResource.jsx +14 -3
  152. data/app/javascript/components/admin/resource-picker/ResourcePickerWindow.jsx +50 -21
  153. data/app/javascript/components/paginate/PageView.jsx +20 -8
  154. data/app/javascript/components/paginate/PaginationBoxView.jsx +78 -66
  155. data/app/javascript/components/paginate/PaginationListView.jsx +59 -45
  156. data/app/javascript/packs/lcms_engine_admin.js +15 -0
  157. data/app/javascript/packs/{application.js → lcms_engine_application.js} +5 -4
  158. data/app/javascript/packs/server_rendering.js +1 -0
  159. data/app/javascript/vendor/jstree/jstree.min.js +6 -0
  160. data/app/javascript/vendor/jstree/themes/default/32px.png +0 -0
  161. data/app/javascript/vendor/jstree/themes/default/40px.png +0 -0
  162. data/app/javascript/vendor/jstree/themes/default/style.css +1106 -0
  163. data/app/javascript/vendor/jstree/themes/default/style.min.css +1 -0
  164. data/app/javascript/vendor/jstree/themes/default/throbber.gif +0 -0
  165. data/app/javascript/vendor/jstree/themes/default-dark/32px.png +0 -0
  166. data/app/javascript/vendor/jstree/themes/default-dark/40px.png +0 -0
  167. data/app/javascript/vendor/jstree/themes/default-dark/style.css +1150 -0
  168. data/app/javascript/vendor/jstree/themes/default-dark/style.min.css +1 -0
  169. data/app/javascript/vendor/jstree/themes/default-dark/throbber.gif +0 -0
  170. data/app/jobs/concerns/lcms/engine/nested_resque_job.rb +1 -4
  171. data/app/jobs/lcms/engine/document_generate_gdoc_job.rb +2 -2
  172. data/app/jobs/lcms/engine/document_generate_job.rb +2 -2
  173. data/app/jobs/lcms/engine/document_generate_pdf_job.rb +5 -5
  174. data/app/jobs/lcms/engine/document_parse_job.rb +1 -1
  175. data/app/jobs/lcms/engine/material_generate_pdf_job.rb +4 -4
  176. data/app/models/concerns/lcms/engine/navigable.rb +6 -10
  177. data/app/models/concerns/lcms/engine/searchable.rb +7 -0
  178. data/app/models/lcms/engine/document.rb +1 -1
  179. data/app/models/lcms/engine/download.rb +1 -1
  180. data/app/models/lcms/engine/resource.rb +1 -1
  181. data/app/models/lcms/engine/search/document.rb +4 -3
  182. data/app/models/lcms/engine/search/repository.rb +1 -1
  183. data/app/presenters/lcms/engine/content_presenter.rb +1 -1
  184. data/app/presenters/lcms/engine/curriculum_presenter.rb +21 -18
  185. data/app/presenters/lcms/engine/document_presenter.rb +5 -3
  186. data/app/presenters/lcms/engine/resource_presenter.rb +6 -3
  187. data/app/queries/lcms/engine/admin_documents_query.rb +2 -2
  188. data/app/queries/lcms/engine/admin_materials_query.rb +11 -2
  189. data/app/queries/lcms/engine/base_query.rb +1 -1
  190. data/app/serializers/lcms/engine/previews_material_serializer.rb +1 -0
  191. data/app/services/lcms/engine/document_build_service.rb +6 -0
  192. data/app/services/lcms/engine/document_generator.rb +2 -2
  193. data/app/services/lcms/engine/google/drive_service.rb +7 -15
  194. data/app/services/lcms/engine/google/script_service.rb +7 -3
  195. data/app/services/lcms/engine/html_sanitizer.rb +6 -6
  196. data/app/services/lcms/engine/lessons_gdoc_bundler.rb +1 -1
  197. data/app/services/lcms/engine/lti_exporter.rb +1 -1
  198. data/app/services/lcms/engine/material_build_service.rb +6 -2
  199. data/app/services/lcms/engine/material_preview_generator.rb +3 -3
  200. data/app/services/lcms/engine/react_materials_resolver.rb +3 -2
  201. data/app/services/lcms/engine/s3_service.rb +14 -2
  202. data/app/tasks/resource_tasks.rb +2 -2
  203. data/app/views/layouts/lcms/engine/admin.html.erb +3 -3
  204. data/app/views/layouts/lcms/engine/application.html.erb +2 -2
  205. data/app/views/layouts/lcms/engine/lti.html.erb +1 -1
  206. data/app/views/lcms/engine/admin/access_codes/_form.html.erb +1 -1
  207. data/app/views/lcms/engine/admin/access_codes/index.html.erb +3 -3
  208. data/app/views/lcms/engine/admin/batch_reimports/_search_form.html.erb +2 -2
  209. data/app/views/lcms/engine/admin/curriculums/edit.html.erb +5 -5
  210. data/app/views/lcms/engine/admin/documents/_materials_links.html.erb +2 -2
  211. data/app/views/lcms/engine/admin/documents/_reimport.html.erb +1 -1
  212. data/app/views/lcms/engine/admin/documents/_search_form.html.erb +2 -2
  213. data/app/views/lcms/engine/admin/documents/import.html.erb +1 -1
  214. data/app/views/lcms/engine/admin/documents/index.html.erb +7 -5
  215. data/app/views/lcms/engine/admin/documents/new.html.erb +6 -2
  216. data/app/views/lcms/engine/admin/materials/_reimport.html.erb +1 -1
  217. data/app/views/lcms/engine/admin/materials/_search_form.html.erb +2 -2
  218. data/app/views/lcms/engine/admin/materials/import.html.erb +1 -1
  219. data/app/views/lcms/engine/admin/materials/index.html.erb +26 -22
  220. data/app/views/lcms/engine/admin/materials/new.html.erb +5 -1
  221. data/app/views/lcms/engine/admin/resource_bulk_edits/new.html.erb +2 -2
  222. data/app/views/lcms/engine/admin/resources/_fields.html.erb +4 -0
  223. data/app/views/lcms/engine/admin/resources/_form.html.erb +1 -1
  224. data/app/views/lcms/engine/admin/resources/_search_form.html.erb +2 -2
  225. data/app/views/lcms/engine/admin/resources/index.html.erb +7 -5
  226. data/app/views/lcms/engine/admin/shared/_header.html.erb +12 -12
  227. data/app/views/lcms/engine/admin/standards/_form.html.erb +3 -1
  228. data/app/views/lcms/engine/admin/standards/_search_form.html.erb +1 -1
  229. data/app/views/lcms/engine/admin/users/_form.html.erb +1 -1
  230. data/app/views/lcms/engine/admin/users/_search_form.html.erb +1 -1
  231. data/app/views/lcms/engine/admin/users/index.html.erb +6 -6
  232. data/app/views/lcms/engine/documents/gdoc/_agenda.html.erb +1 -1
  233. data/app/views/lcms/engine/documents/show.html.erb +1 -1
  234. data/app/views/lcms/engine/materials/show.html.erb +1 -1
  235. data/app/views/lcms/engine/pages/not_found.html.erb +5 -0
  236. data/app/views/lcms/engine/resources/_download.html.erb +2 -2
  237. data/app/views/lcms/engine/resources/_unit_bundles.html.erb +2 -2
  238. data/app/views/lcms/engine/resources/generic.html.erb +0 -4
  239. data/app/views/lcms/engine/resources/media.html.erb +0 -4
  240. data/app/views/lcms/engine/resources/show.html.erb +0 -2
  241. data/config/initializers/airbrake.rb +62 -10
  242. data/config/initializers/bitly.rb +1 -1
  243. data/config/initializers/carrier_wave.rb +6 -4
  244. data/config/initializers/ckeditor.rb +6 -0
  245. data/config/initializers/elasticsearch.rb +1 -1
  246. data/config/initializers/resque.rb +2 -2
  247. data/config/locales/admin/en.yml +1 -2
  248. data/config/locales/ui/en.yml +1 -0
  249. data/config/routes.rb +5 -2
  250. data/db/migrate/.keep +0 -0
  251. data/db/schema.rb +280 -312
  252. data/db/seeds.rb +0 -1
  253. data/docker-compose.ror4.yml +32 -0
  254. data/docker-compose.yml +6 -3
  255. data/docs/env-variables.md +40 -40
  256. data/docs/google-cloud-platform-setup.md +45 -17
  257. data/docs/how-to-build-and-publish.md +1 -0
  258. data/lcms-engine.gemspec +28 -20
  259. data/lib/doc_template/document.rb +3 -4
  260. data/lib/doc_template/document_toc.rb +2 -2
  261. data/lib/doc_template/objects/activity_metadata.rb +1 -1
  262. data/lib/doc_template/objects/agenda_metadata.rb +1 -1
  263. data/lib/doc_template/objects/metadata_helpers.rb +1 -1
  264. data/lib/doc_template/objects/toc_helpers.rb +4 -4
  265. data/lib/doc_template/objects/toc_metadata.rb +4 -6
  266. data/lib/doc_template/tables/base.rb +3 -2
  267. data/lib/doc_template/tags/activity_metadata_type_tag.rb +1 -1
  268. data/lib/doc_template/tags/answer_space_tag.rb +2 -2
  269. data/lib/doc_template/tags/base_tag.rb +5 -5
  270. data/lib/doc_template/tags/block_tag.rb +1 -1
  271. data/lib/doc_template/tags/columns_tag.rb +1 -1
  272. data/lib/doc_template/tags/def_tag.rb +1 -1
  273. data/lib/doc_template/tags/expand_tag.rb +1 -0
  274. data/lib/doc_template/tags/heading_tag.rb +1 -1
  275. data/lib/doc_template/tags/inset_tag.rb +2 -2
  276. data/lib/doc_template/tags/latex_tag.rb +1 -1
  277. data/lib/doc_template/tags/page_break_tag.rb +1 -1
  278. data/lib/doc_template/tags/pd_tag.rb +4 -4
  279. data/lib/doc_template/tags/section_tag.rb +2 -2
  280. data/lib/doc_template/tags/standard_tag.rb +3 -3
  281. data/lib/doc_template/tags/table_preserve_alignment_tag.rb +1 -1
  282. data/lib/doc_template/tags/table_tag.rb +1 -1
  283. data/lib/doc_template/template.rb +1 -1
  284. data/lib/doc_template.rb +9 -9
  285. data/lib/document_exporter/gdoc/base.rb +6 -3
  286. data/lib/document_exporter/pdf/base.rb +1 -1
  287. data/lib/document_exporter/pdf/document.rb +2 -2
  288. data/lib/document_exporter/pdf/material.rb +2 -2
  289. data/lib/document_exporter/pdf/student_material.rb +2 -2
  290. data/lib/document_exporter/pdf/teacher_material.rb +2 -2
  291. data/lib/document_renderer/part.rb +4 -6
  292. data/lib/elasticsearch/persistence/repository/response/results.rb +1 -1
  293. data/lib/lcms/engine/engine.rb +10 -9
  294. data/lib/lcms/engine/version.rb +1 -1
  295. data/lib/lcms/engine.rb +0 -1
  296. data/lib/lt/lcms/metadata/base_service.rb +2 -1
  297. data/lib/lt/lcms/metadata/context.rb +58 -54
  298. data/lib/lt/lcms/metadata/service.rb +6 -3
  299. data/lib/resque_job.rb +3 -6
  300. data/lib/standard_importer.rb +4 -4
  301. data/lib/tasks/cloud66.rake +8 -6
  302. data/lib/tasks/document.rake +7 -7
  303. data/lib/tasks/google.rake +29 -14
  304. data/lib/tasks/lcms/engine_tasks.rake +1 -1
  305. data/package.json +31 -9
  306. data/postcss.config.js +12 -0
  307. data/spec/controllers/admin/association_picker_controller_spec.rb +6 -8
  308. data/spec/controllers/admin/curriculums_controller_spec.rb +23 -0
  309. data/spec/controllers/admin/documents_controller_spec.rb +25 -3
  310. data/spec/controllers/admin/materials_controller_spec.rb +17 -4
  311. data/spec/controllers/admin/resource_bulk_edit_controller_spec.rb +1 -1
  312. data/spec/controllers/admin/resources_controller_spec.rb +3 -3
  313. data/spec/controllers/admin/settings_controller_spec.rb +1 -1
  314. data/spec/controllers/admin/standards_controller_spec.rb +1 -1
  315. data/spec/controllers/admin/welcome_controller_spec.rb +12 -10
  316. data/spec/controllers/resources_controller_spec.rb +3 -3
  317. data/spec/controllers/welcome_controller_spec.rb +38 -0
  318. data/spec/dummy/.env.docker +5 -0
  319. data/spec/dummy/.traceroute.yaml +0 -2
  320. data/spec/dummy/bin/webpack +18 -0
  321. data/spec/dummy/bin/webpack-dev-server +18 -0
  322. data/spec/dummy/config/application.rb +1 -1
  323. data/spec/dummy/config/environments/production.rb +1 -1
  324. data/spec/dummy/config/environments/test.rb +1 -1
  325. data/spec/dummy/config/initializers/assets.rb +6 -0
  326. data/spec/dummy/config/lcms-admin.yml +3 -7
  327. data/spec/dummy/config/puma.rb +3 -3
  328. data/spec/dummy/config/routes.rb +6 -0
  329. data/spec/dummy/db/schema.rb +5 -5
  330. data/spec/entities/grades_spec.rb +12 -0
  331. data/spec/factories/documents.rb +1 -0
  332. data/spec/factories/downloads.rb +1 -1
  333. data/spec/factories/resources.rb +2 -2
  334. data/spec/features/admin/lessons/add_lesson_spec.rb +3 -3
  335. data/spec/features/admin/materials/add_material_spec.rb +5 -3
  336. data/spec/features/admin/users_spec.rb +2 -2
  337. data/spec/forms/document_form_spec.rb +11 -1
  338. data/spec/{controllers/admin/admin_controller_spec.rb → helpers/path_helper_spec.rb} +6 -6
  339. data/spec/lib/doc_template/objects/activity_metadata_spec.rb +1 -1
  340. data/spec/lib/doc_template/objects/agenda_metadata_spec.rb +2 -0
  341. data/spec/lib/doc_template/objects/toc_metadata_spec.rb +1 -1
  342. data/spec/lib/doc_template/tables/shared_examples/remove_table.rb +1 -1
  343. data/spec/lib/doc_template/tags/page_break_tag_spec.rb +1 -1
  344. data/spec/lib/doc_template/tags/pd_tag_spec.rb +1 -1
  345. data/spec/models/document_spec.rb +1 -1
  346. data/spec/models/standard_spec.rb +2 -0
  347. data/spec/queries/lcms/engine/admin_materials_query_spec.rb +34 -0
  348. data/spec/rails_helper.rb +8 -2
  349. data/spec/services/document_build_service_spec.rb +4 -11
  350. data/spec/services/s3_service_spec.rb +31 -0
  351. data/spec/support/concerns/navigable.rb +2 -0
  352. data/spec/support/routes.rb +4 -0
  353. data/spec/support/shared_examples/content_tag.rb +4 -4
  354. data/templates/routes.rb +0 -1
  355. data/yarn.lock +3447 -2993
  356. metadata +208 -303
  357. data/app/assets/stylesheets/lcms/engine/application.scss +0 -36
  358. data/app/assets/stylesheets/lcms/engine/vendors/jquery.tagsinput.css +0 -1
  359. data/app/exceptions/components_api_error.rb +0 -4
  360. data/app/exceptions/document_error.rb +0 -4
  361. data/app/exceptions/material_error.rb +0 -4
  362. data/app/javascript/packs/admin.js +0 -14
  363. data/app/models/lcms/engine/component.rb +0 -88
  364. data/app/presenters/lcms/engine/social_media_presenter.rb +0 -83
  365. data/app/views/lcms/engine/shared/_social_sharing.html.erb +0 -22
  366. data/db/migrate/20200217160930_change_document_parts_to_polymorphic.rb +0 -36
  367. data/db/migrate/20200218144849_drop_material_parts_table.rb +0 -7
  368. data/db/migrate/20200422130652_add_reimported_at_to_documents.rb +0 -7
  369. data/db/migrate/20200429130353_drop_pages.rb +0 -13
  370. data/db/seeds/pages.seeds.rb +0 -26
  371. data/lib/document_exporter.rb +0 -6
  372. data/lib/lcms/engine/migration.rb +0 -16
  373. data/spec/models/component_spec.rb +0 -60
  374. data/vendor/assets/javascripts/jquery.tagsinput.js +0 -1
@@ -20,29 +20,31 @@ namespace :cloud66 do # rubocop:disable Metrics/BlockLength
20
20
  end
21
21
 
22
22
  namespace :swap do
23
- SWAP_FILE = Rails.root.join 'export-swap.sql'
23
+ def swap_file
24
+ Rails.root.join 'export-swap.sql'
25
+ end
24
26
 
25
27
  desc 'Exports tables to be synced'
26
28
  task export: :environment do
27
29
  cmd = <<-BASH
28
- pg_dump -U #{ENV['POSTGRESQL_USERNAME']} #{ENV['POSTGRESQL_DATABASE']} \
30
+ pg_dump -U #{ENV.fetch('POSTGRESQL_USERNAME', nil)} #{ENV.fetch('POSTGRESQL_DATABASE', nil)} \
29
31
  --no-owner \
30
32
  --table=users \
31
33
  --table=access_codes \
32
- --file=#{SWAP_FILE}
34
+ --file=#{swap_file}
33
35
  BASH
34
36
  system cmd
35
37
  end
36
38
 
37
39
  desc 'Deletes existing tables and creates new one'
38
40
  task import: :environment do
39
- raise 'No data file. Please execute `cloud66:swap:export` prior loading the data.' unless File.exist?(SWAP_FILE)
41
+ raise 'No data file. Please execute `cloud66:swap:export` prior loading the data.' unless File.exist?(swap_file)
40
42
 
41
- cmd = "psql -U #{ENV['POSTGRESQL_USERNAME']} #{ENV['POSTGRESQL_DATABASE']}"
43
+ cmd = "psql -U #{ENV.fetch('POSTGRESQL_USERNAME', nil)} #{ENV.fetch('POSTGRESQL_DATABASE', nil)}"
42
44
  # Drops old tables
43
45
  system "#{cmd} -c 'drop table access_codes, users;'"
44
46
  # Create new and load the data
45
- system "#{cmd} < #{SWAP_FILE}"
47
+ system "#{cmd} < #{swap_file}"
46
48
  end
47
49
  end
48
50
  end
@@ -12,21 +12,21 @@ namespace :document do
12
12
  hierarchy = {}
13
13
 
14
14
  documents.each do |document|
15
- grade_key = 'grade-' + document.metadata['grade']
15
+ grade_key = "grade-#{document.metadata['grade']}"
16
16
  hierarchy[grade_key] ||= {}
17
17
  grade = hierarchy[grade_key]
18
18
 
19
19
  grade['subject'] ||= 'math'
20
20
  grade['modules'] ||= {}
21
21
 
22
- module_key = 'module-' + document.metadata['unit']
22
+ module_key = "module-#{document.metadata['unit']}"
23
23
  grade['modules'][module_key] ||= {}
24
24
  module_ = grade['modules'][module_key]
25
25
 
26
26
  module_['name'] ||= '[name]'
27
27
  module_['topics'] ||= {}
28
28
 
29
- topic_key = 'topic-' + document.metadata['topic']
29
+ topic_key = "topic-#{document.metadata['topic']}"
30
30
  module_['topics'][topic_key] ||= {}
31
31
  topic = module_['topics'][topic_key]
32
32
 
@@ -39,10 +39,10 @@ namespace :document do
39
39
  topic['lessons'].push(
40
40
  'file_name' => file_name,
41
41
  'identifier' => 'ENY-' \
42
- "G#{grade_key.split('-').last}-" \
43
- "M#{module_key.split('-').last}-" \
44
- "T#{topic_key.split('-').last}-" \
45
- "L#{lesson_number}",
42
+ "G#{grade_key.split('-').last}-" \
43
+ "M#{module_key.split('-').last}-" \
44
+ "T#{topic_key.split('-').last}-" \
45
+ "L#{lesson_number}",
46
46
  'name' => document.metadata['title_text'],
47
47
  'standards' => document.metadata['standard'],
48
48
  'description' => Nokogiri::HTML(document.metadata['description']).text,
@@ -4,22 +4,37 @@ require 'googleauth'
4
4
  require 'googleauth/stores/file_token_store'
5
5
  require 'lt/google/api/auth/cli'
6
6
 
7
- OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'
8
-
9
7
  namespace :google do
10
- desc 'set up google credentials'
11
- task setup_auth: :environment do
8
+ desc 'Set up google credentials. Specify `domain` argument which will be used as a base for redirect URI'
9
+ task :setup_auth, [:domain] => [:environment] do |_task, args|
12
10
  service = ::Lt::Google::Api::Auth::Cli.new
13
- if service.credentials.nil?
14
- authorizer = service.authorizer
15
- url = authorizer.get_authorization_url(base_url: OOB_URI)
16
- puts "Open \n>> #{url}\n in your browser and enter the resulting code:"
17
- code = STDIN.gets.strip
18
- authorizer.get_and_store_credentials_from_code(
19
- user_id: ::Lt::Google::Api::Auth::Cli::USER_ID, code: code, base_url: OOB_URI
20
- )
21
- else
22
- puts 'No need in action, everything is already set up'
11
+
12
+ # Check if there is existing auth token
13
+ if service.credentials.present?
14
+ puts <<~TEXT
15
+ Auth token already exists. Do you want to request new one?
16
+ Type Y for Yes, N for No
17
+ TEXT
18
+ next unless $stdin.gets.to_s.strip.downcase == 'y'
23
19
  end
20
+
21
+ authorizer = service.authorizer
22
+ url = authorizer.get_authorization_url(base_url: args[:domain])
23
+
24
+ puts <<~TEXT
25
+ Open this URL in your browser:
26
+ >>>>>
27
+ #{url}
28
+ >>>>>
29
+ Copy auth code and paste it below.
30
+ TEXT
31
+
32
+ code = $stdin.gets.to_s.strip
33
+
34
+ authorizer.get_and_store_credentials_from_code(
35
+ user_id: ::Lt::Google::Api::Auth::Cli::USER_ID,
36
+ code: code,
37
+ base_url: args[:domain]
38
+ )
24
39
  end
25
40
  end
@@ -70,7 +70,7 @@ def enhance_assets_precompile
70
70
  end
71
71
 
72
72
  # Compile packs after we've compiled all other assets during precompilation
73
- skip_webpacker_precompile = %w(no false n f).include?(ENV['WEBPACKER_PRECOMPILE'])
73
+ skip_webpacker_precompile = %w(no false n f).include?(ENV.fetch('WEBPACKER_PRECOMPILE', nil))
74
74
 
75
75
  unless skip_webpacker_precompile
76
76
  if Rake::Task.task_defined?('assets:precompile')
data/package.json CHANGED
@@ -5,30 +5,52 @@
5
5
  "dependencies": {
6
6
  "@babel/core": "^7.6.0",
7
7
  "@babel/preset-react": "^7.0.0",
8
- "@rails/webpacker": "~4",
8
+ "@rails/webpacker": "~5.4.3",
9
9
  "babel-plugin-transform-react-remove-prop-types": "^0.4.24",
10
10
  "classnames": "^2.2.6",
11
+ "foundation-sites": "^6.7.4",
12
+ "jquery": "^3.6.0",
13
+ "lodash": "^4.17.21",
11
14
  "prop-types": "^15.7.2",
12
15
  "react": "^16.9.0",
13
16
  "react-dom": "^16.9.0",
14
- "react_ujs": "^2.6.0"
17
+ "react-tagsinput": "^3.19.0",
18
+ "react_ujs": "^2.6.0",
19
+ "webpack": "^4.46.0",
20
+ "webpack-cli": "^3.3.12"
15
21
  },
16
22
  "devDependencies": {
17
- "eslint": "^6.5.1",
18
- "eslint-plugin-import": "^2.18.2",
19
- "eslint-plugin-react": "^7.16.0",
20
- "webpack": "~4",
21
- "webpack-dev-server": "^3.8.1"
23
+ "babel-eslint": "^10.1.0",
24
+ "eslint": "^7.23.0",
25
+ "eslint-config-prettier": "^8.1.0",
26
+ "eslint-config-react-app": "^6.0.0",
27
+ "eslint-plugin-flowtype": "^5.6.0",
28
+ "eslint-plugin-import": "^2.22.1",
29
+ "eslint-plugin-jsx-a11y": "^6.4.1",
30
+ "eslint-plugin-prettier": "^3.3.1",
31
+ "eslint-plugin-react": "^7.23.1",
32
+ "eslint-plugin-react-hooks": "^4.2.0",
33
+ "prettier": "^2.2.1",
34
+ "stylelint": "^13.12.0",
35
+ "stylelint-config-prettier": "^8.0.2",
36
+ "stylelint-config-sass-guidelines": "^8.0.0",
37
+ "stylelint-prettier": "^1.2.0",
38
+ "stylelint-selector-bem-pattern": "^2.1.0",
39
+ "webpack-dev-server": "^3"
22
40
  },
23
41
  "scripts": {
24
- "lint:scss": "sass-lint '**/*.scss' -v -q"
42
+ "lint": "eslint --ext .js --ext .jsx app/javascript && stylelint 'app/assets/stylesheets/**/*.{css,scss}' --quiet",
43
+ "lint:js": "eslint --ext .js --ext .jsx app/javascript",
44
+ "lint:js:fix": "eslint --ext .js --ext .jsx app/javascript --quiet --fix",
45
+ "lint:scss": "stylelint 'app/assets/stylesheets/**/*.{css,scss}' --quiet",
46
+ "lint:scss:fix": "stylelint 'app/assets/stylesheets/**/*.{css,scss}' --quiet --fix"
25
47
  },
26
48
  "repository": {
27
49
  "type": "git",
28
50
  "url": "git+https://github.com/learningtapestry/lcms-engine.git"
29
51
  },
30
52
  "engines": {
31
- "node": ">=10.16.1",
53
+ "node": ">=14.17.0",
32
54
  "yarn": ">=1.17.1"
33
55
  },
34
56
  "author": "Alexander Kuznetsov <paranoic.san@gmail.com>",
data/postcss.config.js ADDED
@@ -0,0 +1,12 @@
1
+ module.exports = {
2
+ plugins: [
3
+ require('postcss-import'),
4
+ require('postcss-flexbugs-fixes'),
5
+ require('postcss-preset-env')({
6
+ autoprefixer: {
7
+ flexbox: 'no-2009'
8
+ },
9
+ stage: 3
10
+ })
11
+ ]
12
+ }
@@ -3,19 +3,17 @@
3
3
  require 'rails_helper'
4
4
 
5
5
  describe Lcms::Engine::Admin::AssociationPickerController do
6
- ASSOCIATIONS = %w(content_sources tags grades topics reading_assignment_authors
7
- reading_assignment_texts standards).freeze
8
-
9
6
  let(:user) { create :admin }
10
7
 
11
8
  before { sign_in user }
12
9
 
13
10
  describe '#index' do
14
- ASSOCIATIONS.each do |assoc|
15
- it "list #{assoc} association items" do
16
- get :index, params: { association: assoc, format: :json }
17
- expect(response).to be_successful
11
+ %w(content_sources tags grades topics reading_assignment_authors reading_assignment_texts standards)
12
+ .each do |assoc|
13
+ it "list #{assoc} association items" do
14
+ get :index, params: { association: assoc, format: :json }
15
+ expect(response).to be_successful
16
+ end
18
17
  end
19
- end
20
18
  end
21
19
  end
@@ -12,4 +12,27 @@ describe Lcms::Engine::Admin::CurriculumsController do
12
12
 
13
13
  it { is_expected.to be_successful }
14
14
  end
15
+
16
+ describe '#children' do
17
+ let(:id) { resource.id }
18
+ let(:resource) { create(:resource, :module) }
19
+ let!(:children) { create_list(:resource, 3, parent: resource) }
20
+
21
+ subject { get :children, params: { id: id } }
22
+
23
+ it 'returns children of the requested resource' do
24
+ JSON.parse(subject.body).each do |data|
25
+ child = ::Lcms::Engine::Resource.find(data['id'])
26
+ expect(child.parent_id).to eq id
27
+ end
28
+ end
29
+
30
+ context 'when # is requested' do
31
+ let(:id) { '#' }
32
+
33
+ it 'returns root resources' do
34
+ expect(JSON.parse(subject.body).first['id']).to eq resource.id
35
+ end
36
+ end
37
+ end
15
38
  end
@@ -9,7 +9,9 @@ describe Lcms::Engine::Admin::DocumentsController do
9
9
 
10
10
  describe '#create' do
11
11
  let(:document) { create :document }
12
- let(:form) { instance_double('Lcms::Engine::DocumentForm', document: document, save: valid) }
12
+ let(:form) do
13
+ instance_double('Lcms::Engine::DocumentForm', document: document, save: valid, service_errors: [])
14
+ end
13
15
  let(:link) { 'link' }
14
16
  let(:params) { { link: link, link_fs: 'link_fs', reimport: '1' } }
15
17
  let(:valid) { true }
@@ -25,7 +27,7 @@ describe Lcms::Engine::Admin::DocumentsController do
25
27
 
26
28
  it 'redirects to document' do
27
29
  subject
28
- expect(response).to redirect_to Lcms::Engine::Admin::AdminController.document_path(document)
30
+ expect(response).to redirect_to document_path(document)
29
31
  end
30
32
 
31
33
  # TODO: Rails upgrade - move to system spec
@@ -51,7 +53,7 @@ describe Lcms::Engine::Admin::DocumentsController do
51
53
 
52
54
  it 'calls batch reimport' do
53
55
  expect(Lcms::Engine::DocumentGenerator).to \
54
- receive_message_chain(:document_parse_job, :perform_later).and_return(OpenStruct.new(job_id: 0))
56
+ receive_message_chain(:document_parse_job, :perform_later).and_return(double('response', job_id: 0))
55
57
  subject
56
58
  end
57
59
 
@@ -69,6 +71,18 @@ describe Lcms::Engine::Admin::DocumentsController do
69
71
  end
70
72
  end
71
73
  end
74
+
75
+ context 'when asynchronous import was requested' do
76
+ let(:link) { 'https://google.com/somefile' }
77
+ let(:params) { { async: '1', link: link } }
78
+
79
+ before { allow(controller).to receive(:bulk_import) }
80
+
81
+ it 'calls bulk import for that particular document' do
82
+ expect(controller).to receive(:bulk_import).with(Array.wrap(link))
83
+ subject
84
+ end
85
+ end
72
86
  end
73
87
 
74
88
  describe '#destroy' do
@@ -79,6 +93,14 @@ describe Lcms::Engine::Admin::DocumentsController do
79
93
  it 'deletes the document' do
80
94
  expect { subject }.to change(Lcms::Engine::Document, :count).by(-1)
81
95
  end
96
+
97
+ context 'when there was custom filter' do
98
+ let(:query) { { course: 'value' } }
99
+
100
+ subject { delete :destroy, params: { id: document.id, query: query } }
101
+
102
+ it { is_expected.to redirect_to "/lcms-engine/admin/documents?#{{ query: query }.to_param}" }
103
+ end
82
104
  end
83
105
 
84
106
  describe '#new' do
@@ -3,6 +3,8 @@
3
3
  require 'rails_helper'
4
4
 
5
5
  describe Lcms::Engine::Admin::MaterialsController do
6
+ include Lcms::Engine::PathHelper
7
+
6
8
  let(:user) { create :admin }
7
9
 
8
10
  before { sign_in user }
@@ -25,7 +27,7 @@ describe Lcms::Engine::Admin::MaterialsController do
25
27
 
26
28
  it 'redirects to material' do
27
29
  subject
28
- expect(response).to redirect_to Lcms::Engine::Admin::AdminController.material_path(material)
30
+ expect(response).to redirect_to material_path(material)
29
31
  end
30
32
 
31
33
  context 'when there is an error' do
@@ -51,7 +53,7 @@ describe Lcms::Engine::Admin::MaterialsController do
51
53
 
52
54
  it 'calls batch reimport' do
53
55
  expect(Lcms::Engine::DocumentGenerator).to \
54
- receive_message_chain(:material_parse_job, :perform_later).and_return(OpenStruct.new(job_id: 0))
56
+ receive_message_chain(:material_parse_job, :perform_later).and_return(double('response', job_id: 0))
55
57
  subject
56
58
  end
57
59
 
@@ -69,6 +71,17 @@ describe Lcms::Engine::Admin::MaterialsController do
69
71
  end
70
72
  end
71
73
  end
74
+
75
+ context 'when asynchronous import was requested' do
76
+ let(:params) { { async: '1', link: link } }
77
+
78
+ before { allow(controller).to receive(:bulk_import) }
79
+
80
+ it 'calls bulk import for that particular document' do
81
+ expect(controller).to receive(:bulk_import).with(Array.wrap(link))
82
+ subject
83
+ end
84
+ end
72
85
  end
73
86
 
74
87
  describe '#destroy' do
@@ -79,11 +92,11 @@ describe Lcms::Engine::Admin::MaterialsController do
79
92
  it { expect { subject }.to change { Lcms::Engine::Material.count }.by(-1) }
80
93
 
81
94
  context 'when there was custom filter' do
82
- let(:query) { 'filter' }
95
+ let(:query) { { course: 'value' } }
83
96
 
84
97
  subject { delete :destroy, params: { id: material.id, query: query } }
85
98
 
86
- it { is_expected.to redirect_to admin_materials_path(query: query) }
99
+ it { is_expected.to redirect_to "/lcms-engine/admin/materials?#{{ query: query }.to_param}" }
87
100
  end
88
101
  end
89
102
 
@@ -22,7 +22,7 @@ describe Lcms::Engine::Admin::ResourceBulkEditsController do
22
22
  grades = resources.flat_map { |r| r.grades.list }
23
23
  expect(grades).to_not include('grade 11')
24
24
  post :create, params: { ids: ids, resource: { grades: ['grade 11'] } }
25
- expect(response).to redirect_to(:admin_resources)
25
+ expect(response).to redirect_to(lcms_engine(admin_resources_path))
26
26
  resources.each do |r|
27
27
  expect(r.reload.grades.list).to include('grade 11')
28
28
  end
@@ -11,13 +11,13 @@ describe Lcms::Engine::Admin::ResourcesController do
11
11
  describe '#edit' do
12
12
  subject { get :edit, params: { id: resource.to_param } }
13
13
 
14
- it { is_expected.to be_success }
14
+ it { is_expected.to be_successful }
15
15
  end
16
16
 
17
17
  describe '#index' do
18
18
  subject { get :index }
19
19
 
20
- it { is_expected.to be_success }
20
+ it { is_expected.to be_successful }
21
21
  end
22
22
 
23
23
  describe '#update' do
@@ -27,7 +27,7 @@ describe Lcms::Engine::Admin::ResourcesController do
27
27
  subject { post :update, params: { id: resource.to_param, resource: params } }
28
28
 
29
29
  context 'with valid params' do
30
- it { is_expected.to redirect_to admin_resources_path }
30
+ it { is_expected.to redirect_to lcms_engine(admin_resources_path) }
31
31
 
32
32
  it 'passes notice' do
33
33
  subject
@@ -11,6 +11,6 @@ describe Lcms::Engine::Admin::SettingsController do
11
11
  expect(Lcms::Engine::Settings[:editing_enabled]).to be true
12
12
  patch :toggle_editing_enabled
13
13
  expect(Lcms::Engine::Settings[:editing_enabled]).to be false
14
- expect(response).to redirect_to(:admin_resources)
14
+ expect(response).to redirect_to(lcms_engine(admin_resources_path))
15
15
  end
16
16
  end
@@ -60,7 +60,7 @@ describe Lcms::Engine::Admin::StandardsController do
60
60
  subject { post :update, params: { id: standard.to_param, standard: params } }
61
61
 
62
62
  context 'with valid params' do
63
- it { is_expected.to redirect_to admin_standards_path }
63
+ it { is_expected.to redirect_to lcms_engine(admin_standards_path) }
64
64
 
65
65
  it 'passes notice' do
66
66
  subject
@@ -5,17 +5,19 @@ require 'rails_helper'
5
5
  describe Lcms::Engine::Admin::WelcomeController do
6
6
  let(:user) { create :admin }
7
7
 
8
- describe 'requires admin user' do
9
- before { get :index }
10
- it { expect(response).to redirect_to new_user_session_path }
11
- end
12
-
13
- describe 'allow admin' do
14
- before do
15
- sign_in user
16
- get :index
8
+ describe 'GET index' do
9
+ context 'requires admin user' do
10
+ before { get :index }
11
+ it { expect(response).to redirect_to lcms_engine(new_user_session_path) }
17
12
  end
18
13
 
19
- it { expect(response).to be_successful }
14
+ context 'allow admin' do
15
+ before do
16
+ sign_in user
17
+ get :index
18
+ end
19
+
20
+ it { expect(response).to be_successful }
21
+ end
20
22
  end
21
23
  end
@@ -49,19 +49,19 @@ xdescribe Lcms::Engine::ResourcesController do
49
49
  context 'with id' do
50
50
  before { get :show, id: resource.id }
51
51
 
52
- it { expect(response).to redirect_to("/#{resource.slug}") }
52
+ it { expect(response).to redirect_to("/lcms-engine#{resource.slug}") }
53
53
  end
54
54
 
55
55
  context 'grade' do
56
56
  let(:resource) { create(:resource, :grade) }
57
57
  before { get :show, slug: resource.slug }
58
- it { expect(response).to redirect_to explore_curriculum_index_path(p: resource.slug, e: 1) }
58
+ it { expect(response).to redirect_to lcms_engine(explore_curriculum_index_path(p: resource.slug, e: 1)) }
59
59
  end
60
60
 
61
61
  context 'module' do
62
62
  let(:resource) { create(:resource, :module) }
63
63
  before { get :show, slug: resource.slug }
64
- it { expect(response).to redirect_to explore_curriculum_index_path(p: resource.slug, e: 1) }
64
+ it { expect(response).to redirect_to lcms_engine(explore_curriculum_index_path(p: resource.slug, e: 1)) }
65
65
  end
66
66
  end
67
67
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ describe Lcms::Engine::WelcomeController do
6
+ #
7
+ # In the Host application should be a proxy which will redirect
8
+ # request inside mounted engine
9
+ #
10
+ describe 'GET oauth2callback' do
11
+ let(:code) { Faker::Lorem.words.join }
12
+
13
+ before { request.env['HTTP_REFERER'] = Lcms::Engine::WelcomeController::OAUTH_REFERER }
14
+
15
+ subject { get :oauth2callback, params: { code: code } }
16
+
17
+ it 'skips authorization' do
18
+ subject
19
+ expect(response).to be_successful
20
+ end
21
+
22
+ it 'renders passed in params as JSON' do
23
+ subject
24
+ result = JSON.parse(response.body)
25
+ expect(result['text']).to eq Lcms::Engine::WelcomeController::OAUTH_MESSAGE
26
+ expect(result['code']).to eq code
27
+ end
28
+
29
+ context 'when referer is not a Google service' do
30
+ before { request.env['HTTP_REFERER'] = 'test.com' }
31
+
32
+ it 'returns 404' do
33
+ subject
34
+ expect(response).to have_http_status(404)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,5 @@
1
+ GIT_AUTHOR_EMAIL=joe@doe.com
2
+ GIT_AUTHOR_NAME="Joe Doe"
3
+ POSTGRESQL_ADDRESS=db
4
+ POSTGRESQL_USERNAME=postgres
5
+ POSTGRESQL_PASSWORD=
@@ -6,11 +6,9 @@ ignore_unreachable_actions:
6
6
  - lcms_engine
7
7
  - rails_info
8
8
  - rails_mailers
9
- - whoami$
10
9
  ignore_unused_routes:
11
10
  - ^lcms/engine/admin/access_codes#edit # accessed via `edit_admin_access_code_path`
12
11
  - ^lcms/engine/admin\/reading_assignment_texts # accessed via `association_picker_field` helper
13
12
  - ^devise
14
13
  - ^lcms/engine/pages#forthcoming # Used by `LinkTag`
15
14
  - ^pdfjs_viewer
16
- - whoami$
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
4
+ ENV["NODE_ENV"] ||= "development"
5
+
6
+ require "pathname"
7
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
8
+ Pathname.new(__FILE__).realpath)
9
+
10
+ require "bundler/setup"
11
+
12
+ require "webpacker"
13
+ require "webpacker/webpack_runner"
14
+
15
+ APP_ROOT = File.expand_path("..", __dir__)
16
+ Dir.chdir(APP_ROOT) do
17
+ Webpacker::WebpackRunner.run(ARGV)
18
+ end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
4
+ ENV["NODE_ENV"] ||= "development"
5
+
6
+ require "pathname"
7
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
8
+ Pathname.new(__FILE__).realpath)
9
+
10
+ require "bundler/setup"
11
+
12
+ require "webpacker"
13
+ require "webpacker/dev_server_runner"
14
+
15
+ APP_ROOT = File.expand_path("..", __dir__)
16
+ Dir.chdir(APP_ROOT) do
17
+ Webpacker::DevServerRunner.run(ARGV)
18
+ end
@@ -17,7 +17,7 @@ require 'lcms/engine'
17
17
  module Dummy
18
18
  class Application < Rails::Application
19
19
  # Initialize configuration defaults for originally generated Rails version.
20
- config.load_defaults 5.2
20
+ config.load_defaults 6.1
21
21
 
22
22
  # Settings in config/environments/* take precedence over those specified here.
23
23
  # Application configuration can go into files in config/initializers
@@ -87,7 +87,7 @@ Rails.application.configure do
87
87
  # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')
88
88
 
89
89
  if ENV['RAILS_LOG_TO_STDOUT'].present?
90
- logger = ActiveSupport::Logger.new(STDOUT)
90
+ logger = ActiveSupport::Logger.new($stdout)
91
91
  logger.formatter = config.log_formatter
92
92
  config.logger = ActiveSupport::TaggedLogging.new(logger)
93
93
  end
@@ -7,7 +7,7 @@ Rails.application.configure do
7
7
  # test suite. You never need to work with it otherwise. Remember that
8
8
  # your test database is "scratch space" for the test suite and is wiped
9
9
  # and recreated between test runs. Don't rely on the data there!
10
- config.cache_classes = true
10
+ config.cache_classes = false
11
11
 
12
12
  # Do not eager load code on boot. This avoids loading your whole application
13
13
  # just for the purpose of running a single test. If you are using a tool that
@@ -14,3 +14,9 @@ Rails.application.config.assets.version = '1.0'
14
14
  # application.js, application.css, and all non-JS/CSS in the app/assets
15
15
  # folder are already added.
16
16
  # Rails.application.config.assets.precompile += %w( admin.js admin.css )
17
+
18
+ # To prevent Sass errors
19
+ # See https://github.com/rails/sprockets/issues/581
20
+ Rails.application.config.assets.configure do |env|
21
+ env.export_concurrent = false
22
+ end