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
@@ -1,35 +1,46 @@
1
1
  import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import _ from 'lodash';
2
4
 
3
5
  function AssociationPickerResults(props) {
4
- let items
6
+ let items;
5
7
 
6
- const shouldAllowCreate = _.isString(props.value) && props.value.length > 0
7
- && props.allowCreate && props.items.length === 0
8
+ const shouldAllowCreate =
9
+ _.isString(props.value) && props.value.length > 0 && props.allowCreate && props.items.length === 0;
8
10
 
9
- const selectedIds = _.map(props.selectedItems, 'id')
10
- const isSelected = (item) => {
11
- return _.includes(selectedIds, item.id)
12
- }
11
+ const selectedIds = _.map(props.selectedItems, 'id');
12
+ const isSelected = item => {
13
+ return _.includes(selectedIds, item.id);
14
+ };
13
15
 
14
16
  if (shouldAllowCreate) {
15
- let newItem = { id: props.value, name: props.value, _create: true }
16
- items = [(
17
+ let newItem = { id: props.value, name: props.value, _create: true };
18
+ items = [
19
+ /* eslint-disable react/jsx-no-bind */
17
20
  <tr key={newItem.id}>
18
21
  <td onClick={() => props.onSelectItem(newItem)}>
19
22
  {props.value}
20
23
  <span className="o-assocpicker-create">(Create)</span>
21
24
  </td>
22
- </tr>
23
- )]
25
+ </tr>,
26
+ /* eslint-enable react/jsx-no-bind */
27
+ ];
24
28
  } else {
25
29
  items = props.items.map(item => {
26
- let newItem = { id: item.id, name: item.name, _create: false, _selected: isSelected(item) }
30
+ let newItem = {
31
+ id: item.id,
32
+ name: item.name,
33
+ _create: false,
34
+ _selected: isSelected(item),
35
+ };
27
36
  return (
37
+ /* eslint-disable react/jsx-no-bind */
28
38
  <tr key={newItem.id} className={newItem._selected ? 'active' : ''}>
29
39
  <td onClick={() => props.onSelectItem(newItem)}>{newItem.name}</td>
30
40
  </tr>
31
- )
32
- })
41
+ /* eslint-enable react/jsx-no-bind */
42
+ );
43
+ });
33
44
  }
34
45
 
35
46
  return (
@@ -40,10 +51,24 @@ function AssociationPickerResults(props) {
40
51
  </tr>
41
52
  </thead>
42
53
  <tbody>
43
- {items.length ? items : <tr><td>Nothing to select</td></tr> }
54
+ {items.length ? (
55
+ items
56
+ ) : (
57
+ <tr>
58
+ <td>Nothing to select</td>
59
+ </tr>
60
+ )}
44
61
  </tbody>
45
62
  </table>
46
- )
63
+ );
47
64
  }
48
65
 
49
- export default AssociationPickerResults
66
+ AssociationPickerResults.propTypes = {
67
+ value: PropTypes.string,
68
+ allowCreate: PropTypes.bool,
69
+ items: PropTypes.array,
70
+ selectedItems: PropTypes.array,
71
+ onSelectItem: PropTypes.func,
72
+ };
73
+
74
+ export default AssociationPickerResults;
@@ -1,35 +1,39 @@
1
- import React from 'react'
2
- import AssociationPickerResults from './AssociationPickerResults'
1
+ import React from 'react';
2
+ import _ from 'lodash';
3
+ import PropTypes from 'prop-types';
4
+ import AssociationPickerResults from './AssociationPickerResults';
3
5
 
4
6
  class AssociationPickerWindow extends React.Component {
5
7
  constructor(props) {
6
- super(props)
8
+ super(props);
7
9
 
8
- this.state = { ...props, selectedItems: [] }
10
+ this.state = { ...props, selectedItems: [] };
11
+
12
+ this.selectItem = this.selectItem.bind(this);
9
13
  }
10
14
 
11
15
  selectItem(item) {
12
- const operation = this.updateSelectedItems(item)
16
+ const operation = this.updateSelectedItems(item);
13
17
  if ('onSelectItem' in this.props) {
14
- this.props.onSelectItem(item, operation)
18
+ this.props.onSelectItem(item, operation);
15
19
  }
16
20
  }
17
21
 
18
22
  updateSelectedItems(item) {
19
- let operation, newItems
23
+ let operation, newItems;
20
24
  if (item._selected) {
21
- newItems = _.filter(this.state.selectedItems, r => r.id !== item.id)
22
- operation = 'removed'
25
+ newItems = _.filter(this.state.selectedItems, r => r.id !== item.id);
26
+ operation = 'removed';
23
27
  } else {
24
- newItems = [...this.state.selectedItems, item]
25
- operation = 'added'
28
+ newItems = [...this.state.selectedItems, item];
29
+ operation = 'added';
26
30
  }
27
- this.setState(...this.state, { selectedItems: newItems })
28
- return operation
31
+ this.setState(...this.state, { selectedItems: newItems });
32
+ return operation;
29
33
  }
30
34
 
31
35
  render() {
32
- const { q, results } = this.props
36
+ const { q, results } = this.props;
33
37
 
34
38
  return (
35
39
  <div className="o-assocpicker">
@@ -37,8 +41,15 @@ class AssociationPickerWindow extends React.Component {
37
41
  <div className="o-page__module">
38
42
  <h4 className="text-center">Select item</h4>
39
43
  <div className="row">
40
- <label className="medium-3 columns">Name
41
- <input type="text" value={q || ''} onChange={ this.props.onFilterChange.bind(this, 'q') }/>
44
+ <label className="medium-3 columns">
45
+ Name
46
+ {/*
47
+ eslint-disable react/jsx-no-bind
48
+ */}
49
+ <input type="text" value={q || ''} onChange={this.props.onFilterChange.bind(this, 'q')} />
50
+ {/*
51
+ eslint-enable react/jsx-no-bind
52
+ */}
42
53
  </label>
43
54
  </div>
44
55
  </div>
@@ -51,23 +62,32 @@ class AssociationPickerWindow extends React.Component {
51
62
  items={results}
52
63
  selectedItems={this.state.selectedItems}
53
64
  allowCreate={this.props.allowCreate}
54
- // eslint-disable-next-line react/jsx-no-bind
55
- onSelectItem={this.selectItem.bind(this)}
65
+ onSelectItem={this.selectItem}
56
66
  />
57
67
 
58
- { this.props.pagination() }
68
+ {this.props.pagination()}
59
69
 
60
- { (this.props.allowMultiple) ?
61
- <button type="button"
62
- className="button c-assocpicker-submit"
63
- onClick={this.props.onClickDone}>Submit</button>
64
- : null
65
- }
70
+ {this.props.allowMultiple ? (
71
+ <button type="button" className="button c-assocpicker-submit" onClick={this.props.onClickDone}>
72
+ Submit
73
+ </button>
74
+ ) : null}
66
75
  </div>
67
76
  </div>
68
77
  </div>
69
- )
78
+ );
70
79
  }
71
80
  }
72
81
 
73
- export default AssociationPickerWindow
82
+ AssociationPickerWindow.propTypes = {
83
+ onSelectItem: PropTypes.func,
84
+ q: PropTypes.string,
85
+ results: PropTypes.array,
86
+ onFilterChange: PropTypes.func,
87
+ allowCreate: PropTypes.bool,
88
+ pagination: PropTypes.func,
89
+ allowMultiple: PropTypes.bool,
90
+ onClickDone: PropTypes.func,
91
+ };
92
+
93
+ export default AssociationPickerWindow;
@@ -1,38 +1,49 @@
1
- import React from 'react'
2
- import ReactDOM from 'react-dom'
1
+ import React from 'react';
2
+ import ReactDOM from 'react-dom';
3
+ import PropTypes from 'prop-types';
4
+ import _ from 'lodash';
5
+ import $ from 'jquery';
6
+ import '../../../vendor/jstree/jstree.min';
3
7
 
4
8
  class CurriculumEditor extends React.Component {
5
9
  constructor(props) {
6
- super(props)
10
+ super(props);
7
11
  this.state = {
8
- data: props.tree,
9
12
  changeLog: [],
10
13
  createdIds: [],
11
- }
14
+ };
15
+
16
+ this.onSubmit = this.onSubmit.bind(this);
12
17
  }
13
18
 
14
19
  componentDidMount() {
15
- const $this = $(ReactDOM.findDOMNode(this))
16
- $this.parent().addClass('o-curriculum-tree-editor__container')
20
+ // eslint-disable-next-line react/no-find-dom-node
21
+ const $this = $(ReactDOM.findDOMNode(this));
22
+ $this.parent().addClass('o-curriculum-tree-editor__container');
17
23
 
18
- const editor = $this.find('#curriculum-tree-editor')
24
+ const editor = $this.find('#curriculum-tree-editor');
19
25
  editor
20
26
  .on('rename_node.jstree', this.onRenameNode.bind(this))
21
27
  .on('move_node.jstree', this.onMoveNode.bind(this))
22
28
  .on('create_node.jstree', this.onCreateNode.bind(this))
23
29
  .on('delete_node.jstree', this.onDeleteNode.bind(this))
24
30
  .jstree({
25
- core : {
26
- animation : 0,
31
+ core: {
32
+ animation: 0,
27
33
  themes: { dots: true },
28
34
  check_callback: true,
29
- data : this.state.data,
35
+ data: {
36
+ url: this.props.path,
37
+ data: node => {
38
+ return { id: node.id };
39
+ },
40
+ },
30
41
  },
31
- plugins : [ 'contextmenu', 'dnd', 'wholerow', 'changed' ],
32
- })
42
+ plugins: ['contextmenu', 'dnd', 'wholerow', 'changed'],
43
+ });
33
44
 
34
45
  // preserve jsTree reference so we can call methods directly
35
- this.jsTree = editor.data('jstree')
46
+ this.jsTree = editor.data('jstree');
36
47
  }
37
48
 
38
49
  onRenameNode(_e, data) {
@@ -44,9 +55,11 @@ class CurriculumEditor extends React.Component {
44
55
  curriculum: this.hierarchy(data.node.parent),
45
56
  op: 'create',
46
57
  name: data.node.text,
47
- })
48
- this.setState({...this.state, createdIds: _.pull(this.state.createdIds, data.node.id) })
49
-
58
+ });
59
+ this.setState({
60
+ ...this.state,
61
+ createdIds: _.pull(this.state.createdIds, data.node.id),
62
+ });
50
63
  } else {
51
64
  this.appendToChangelog({
52
65
  id: data.node.id,
@@ -54,7 +67,7 @@ class CurriculumEditor extends React.Component {
54
67
  op: 'rename',
55
68
  from: data.old,
56
69
  to: data.text,
57
- })
70
+ });
58
71
  }
59
72
  }
60
73
 
@@ -67,12 +80,12 @@ class CurriculumEditor extends React.Component {
67
80
  curriculum: this.hierarchy(data.old_parent).concat(data.node.text),
68
81
  parent_curriculum: this.hierarchy(data.parent),
69
82
  position: data.position,
70
- })
83
+ });
71
84
  }
72
85
 
73
86
  onCreateNode(_e, data) {
74
- const createdIds = this.state.createdIds.concat(data.node.id)
75
- this.setState({...this.state, createdIds: createdIds})
87
+ const createdIds = this.state.createdIds.concat(data.node.id);
88
+ this.setState({ ...this.state, createdIds: createdIds });
76
89
  }
77
90
 
78
91
  onDeleteNode(_e, data) {
@@ -81,45 +94,54 @@ class CurriculumEditor extends React.Component {
81
94
  op: 'remove',
82
95
  curriculum: this.hierarchy(data.node),
83
96
  name: data.node.text,
84
- })
97
+ });
85
98
  }
86
99
 
87
100
  hierarchy(node) {
88
101
  if (typeof node === 'string') {
89
- node = this.jsTree.get_node(node, false)
102
+ node = this.jsTree.get_node(node, false);
90
103
  }
91
104
  return node.parents
92
105
  .map(el => this.jsTree.get_node(el, false).text)
93
106
  .reverse()
94
107
  .slice(1)
95
- .concat(node.text)
108
+ .concat(node.text);
96
109
  }
97
110
 
98
111
  appendToChangelog(newEntry) {
99
- const changeLog = this.state.changeLog.concat(newEntry)
100
- this.setState({...this.state, changeLog: changeLog})
112
+ const changeLog = this.state.changeLog.concat(newEntry);
113
+ this.setState({ ...this.state, changeLog: changeLog });
101
114
  }
102
115
 
103
116
  onSubmit(_e) {
104
- $(_e.target).find('input[type=submit]').prop('disabled', true)
117
+ $(_e.target).find('input[type=submit]').prop('disabled', true);
105
118
  }
106
119
 
107
120
  render() {
108
- const jsonChangeLog = JSON.stringify(this.state.changeLog)
121
+ const jsonChangeLog = JSON.stringify(this.state.changeLog);
109
122
  return (
110
123
  <div>
111
- <form action={this.props.form_url} acceptCharset="UTF-8" method="post" onSubmit={this.onSubmit.bind(this)}>
124
+ <form action={this.props.form_url} acceptCharset="UTF-8" method="post" onSubmit={this.onSubmit}>
112
125
  <input name="utf8" value="✓" type="hidden" />
113
126
  <input name="_method" value="patch" type="hidden" />
114
127
  <input name="authenticity_token" value={this.props.form_token} type="hidden" />
115
128
  <input name="curriculum[change_log]" type="hidden" value={jsonChangeLog} />
116
129
  <input value="Save Changes" className="button primary" type="submit" />
117
130
  </form>
118
- <p className="o-curriculum-tree-editor__menu-info">(Click on a node with the right button to add/edit/remove)</p>
131
+ <p className="o-curriculum-tree-editor__menu-info">
132
+ (Click on a node with the right button to add/edit/remove)
133
+ </p>
119
134
  <div id="curriculum-tree-editor" className="o-curriculum-tree-editor"></div>
120
135
  </div>
121
- )
136
+ );
122
137
  }
123
138
  }
124
139
 
125
- export default CurriculumEditor
140
+ CurriculumEditor.propTypes = {
141
+ tree: PropTypes.array,
142
+ form_url: PropTypes.string,
143
+ form_token: PropTypes.string,
144
+ path: PropTypes.string,
145
+ };
146
+
147
+ export default CurriculumEditor;
@@ -1,65 +1,68 @@
1
- import React from 'react'
2
- import ReactDOM from 'react-dom'
1
+ import React from 'react';
2
+ import ReactDOM from 'react-dom';
3
+ import PropTypes from 'prop-types';
4
+ import { Foundation } from 'foundation-sites';
5
+ import TagsInput from 'react-tagsinput';
6
+ import $ from 'jquery';
7
+ import '../../../vendor/jstree/jstree.min';
3
8
 
4
9
  class DirectoryPicker extends React.Component {
5
10
  constructor(props) {
6
- super(props)
11
+ super(props);
7
12
  this.state = {
8
- tree: props.tree,
9
13
  directory: props.directory,
10
14
  parent: props.parent,
11
- }
15
+ };
16
+
17
+ this.onClick = this.onClick.bind(this);
18
+ this.handleDirChange = this.handleDirChange.bind(this);
12
19
  }
13
20
 
14
21
  componentDidMount() {
15
- const $this = $(ReactDOM.findDOMNode(this))
16
- $this.parent().addClass('o-curriculum-tree-picker__container')
22
+ // eslint-disable-next-line react/no-find-dom-node
23
+ const $this = $(ReactDOM.findDOMNode(this));
24
+ $this.parent().addClass('o-curriculum-tree-picker__container');
17
25
 
18
- // start jstree
19
- const editor = $this.find('#curriculum-tree-picker')
20
- editor
21
- .on('changed.jstree', this.onChanged.bind(this))
22
- .jstree({
23
- core : {
24
- animation : 0,
25
- themes: { dots: true },
26
- check_callback: true,
27
- data : this.state.tree,
26
+ const editor = $this.find('#curriculum-tree-picker');
27
+ editor.on('changed.jstree', this.onChanged.bind(this)).jstree({
28
+ core: {
29
+ animation: 0,
30
+ themes: { dots: true },
31
+ check_callback: true,
32
+ data: {
33
+ url: this.props.path,
34
+ data: node => {
35
+ return { id: node.id };
36
+ },
28
37
  },
29
- plugins : ['wholerow', 'changed'],
30
- })
31
-
32
- // preserve jsTree reference so we can call methods directly
33
- this.jsTree = editor.data('jstree')
38
+ },
39
+ plugins: ['wholerow', 'changed'],
40
+ });
41
+ this.jsTree = editor.data('jstree');
34
42
 
35
- // start tagsinput
36
- this.dirTags = $this.find('#resource_directory')
37
- this.dirTags.tagsInput({
38
- height: '2.5em',
39
- width:'65%',
40
- })
41
-
42
- // start modal
43
- this.jqmodal = $this.find('#curriculum-picker-modal')
44
- new Foundation.Reveal(this.jqmodal, null)
43
+ Foundation.addToJquery($);
44
+ this.jqmodal = $this.find('#curriculum-picker-modal');
45
+ new Foundation.Reveal(this.jqmodal, null);
45
46
  }
46
47
 
47
48
  closeModal() {
48
- this.jqmodal.foundation('close')
49
+ this.jqmodal.foundation('close');
49
50
  }
50
51
 
51
52
  onChanged(_e, data) {
52
- const dir = this.directory(data.node)
53
- this.dirTags.importTags(dir.join(','))
54
-
55
- const parent = { id: data.node.id, title: data.node.li_attr.title, directory: dir }
56
- this.setState({ ...this.state, parent: parent })
57
- this.closeModal()
53
+ const dir = this.directory(data.node);
54
+ const parent = {
55
+ id: data.node.id,
56
+ title: data.node.li_attr.title,
57
+ directory: dir,
58
+ };
59
+ this.setState({ directory: dir, parent: parent });
60
+ this.closeModal();
58
61
  }
59
62
 
60
63
  onClick(e) {
61
- e.preventDefault()
62
- this.jqmodal.foundation('open')
64
+ e.preventDefault();
65
+ this.jqmodal.foundation('open');
63
66
  }
64
67
 
65
68
  directory(node) {
@@ -67,32 +70,56 @@ class DirectoryPicker extends React.Component {
67
70
  .map(el => this.jsTree.get_node(el, null).text)
68
71
  .reverse()
69
72
  .slice(1)
70
- .concat(node.text)
73
+ .concat(node.text);
74
+ }
75
+
76
+ handleDirChange(tags) {
77
+ this.setState({ directory: tags });
71
78
  }
72
79
 
73
80
  render() {
74
- const dir = this.state.directory.join(',')
75
- const curr = this.state.parent.directory
76
- const parent_aside = (curr.length > 0) ? `(${curr.join(' | ')}) : ` : ''
81
+ const curr = this.state.parent.directory;
82
+ const parent_aside = curr.length > 0 ? `(${curr.join(' | ')}) : ` : '';
77
83
  return (
78
84
  <div>
79
85
  <div className="input text optional resource_parent_id">
80
- <label className="text optional" htmlFor="resource_parent_id">Parent Resource</label>
86
+ <label className="text optional" htmlFor="resource_parent_id">
87
+ Parent Resource
88
+ </label>
81
89
  <input type="hidden" name="resource[parent_id]" id="resource_parent_id" value={this.state.parent.id || ''} />
82
- <a href="#" className="button reveal-button" onClick={this.onClick.bind(this)}>Select Parent</a>
83
- <div className="resource_parent"><aside>{parent_aside}</aside> <strong>{this.state.parent.title}</strong></div>
90
+ {/* eslint-disable jsx-a11y/anchor-is-valid */}
91
+ <a href="#" className="button reveal-button" onClick={this.onClick}>
92
+ Select Parent
93
+ </a>
94
+ {/* eslint-enable jsx-a11y/anchor-is-valid */}
95
+ <div className="resource_parent">
96
+ <aside>{parent_aside}</aside> <strong>{this.state.parent.title}</strong>
97
+ </div>
84
98
  </div>
85
99
  <div className="input text optional resource_directory">
86
- <label className="text optional" htmlFor="resource_directory">Curriculum directory <aside>(You can pick a parent above, or enter curriculum tags below; i.e.: subject, grade, unit, etc;)</aside></label>
87
- <input className="text optional" name="resource[directory]" id="resource_directory" defaultValue={dir}></input>
100
+ <label className="text optional" htmlFor="resource_directory">
101
+ Curriculum directory{' '}
102
+ <aside>
103
+ (You can pick a parent above, or enter curriculum tags below; i.e.: subject, grade, unit, etc;)
104
+ </aside>
105
+ </label>
106
+ <TagsInput value={this.state.directory} onChange={this.handleDirChange} />
107
+ <input type="hidden" name="resource[directory]" value={this.state.directory} />
88
108
  </div>
89
- <div className="curriculum-picker-modal reveal" id="curriculum-picker-modal" >
109
+ <div className="curriculum-picker-modal reveal" id="curriculum-picker-modal">
90
110
  <h2>Select a Parent Resource</h2>
91
111
  <div id="curriculum-tree-picker" className="o-curriculum-tree-picker"></div>
92
112
  </div>
93
113
  </div>
94
- )
114
+ );
95
115
  }
96
116
  }
97
117
 
98
- export default DirectoryPicker
118
+ DirectoryPicker.propTypes = {
119
+ tree: PropTypes.array,
120
+ directory: PropTypes.array,
121
+ parent: PropTypes.object,
122
+ path: PropTypes.string,
123
+ };
124
+
125
+ export default DirectoryPicker;
@@ -1,22 +1,27 @@
1
- import React from 'react' // eslint-disable-line no-unused-vars
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import ResourcePicker from '../resource-picker/ResourcePicker'; // eslint-disable-line no-unused-vars
2
4
 
3
5
  function PickerButton(props) {
4
6
  return (
5
7
  <div className="o-assocpicker-container">
6
- <button
7
- type="button"
8
- className="o-assocpicker-add button"
9
- onClick={props.onClick}>Select</button>
8
+ <button type="button" className="o-assocpicker-add button" onClick={props.onClick}>
9
+ Select
10
+ </button>
10
11
  <div className="o-assocpicker-selections">
11
12
  {props.hiddenInputs}
12
13
  {props.content}
13
14
  </div>
14
- <div
15
- className="o-assocpicker-modal reveal"
16
- ref={props.onRef}>
17
- </div>
15
+ <div className="o-assocpicker-modal reveal" ref={props.onRef}></div>
18
16
  </div>
19
- )
17
+ );
20
18
  }
21
19
 
22
- export default PickerButton
20
+ PickerButton.propTypes = {
21
+ onClick: PropTypes.func,
22
+ hiddenInputs: PropTypes.node,
23
+ content: PropTypes.array,
24
+ onRef: PropTypes.func,
25
+ };
26
+
27
+ export default PickerButton;
@@ -1,11 +1,11 @@
1
- import ReactDOM from 'react-dom'
1
+ import ReactDOM from 'react-dom';
2
2
 
3
3
  function pickerModal() {
4
- new Foundation.Reveal(this.jqmodal, null)
5
- this.jqmodal.on('open.zf.reveal', () => this.jqmodal.css({ top: '15px' }))
4
+ new Foundation.Reveal(this.jqmodal, null);
5
+ this.jqmodal.on('open.zf.reveal', () => this.jqmodal.css({ top: '15px' }));
6
6
  this.jqmodal.on('closed.zf.reveal', () => {
7
- ReactDOM.unmountComponentAtNode(this.modal)
8
- })
7
+ ReactDOM.unmountComponentAtNode(this.modal);
8
+ });
9
9
  }
10
10
 
11
- export default pickerModal
11
+ export default pickerModal;