lcms-engine 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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