lcms-engine 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -1
  3. data/.env.docker +1 -1
  4. data/.rubocop.yml +8 -7
  5. data/.ruby-version +1 -1
  6. data/CHANGELOG.md +16 -1
  7. data/Dockerfile +1 -1
  8. data/Gemfile.lock +223 -184
  9. data/README.md +3 -2
  10. data/app/controllers/concerns/lcms/engine/reimportable.rb +11 -1
  11. data/app/controllers/lcms/engine/admin/admin_controller.rb +1 -1
  12. data/app/controllers/lcms/engine/admin/documents_controller.rb +19 -4
  13. data/app/controllers/lcms/engine/admin/materials_controller.rb +12 -3
  14. data/app/controllers/lcms/engine/admin/standards_controller.rb +6 -1
  15. data/app/controllers/lcms/engine/admin/users_controller.rb +6 -1
  16. data/app/entities/lcms/engine/grades.rb +17 -6
  17. data/app/entities/lcms/engine/media_embed.rb +1 -1
  18. data/app/entities/lcms/engine/roman_numerals.rb +1 -1
  19. data/app/forms/lcms/engine/document_form.rb +19 -14
  20. data/app/forms/lcms/engine/material_form.rb +3 -2
  21. data/app/helpers/admin/components_helper.rb +2 -2
  22. data/app/helpers/lcms/engine/view_helper.rb +1 -1
  23. data/app/interactors/lcms/engine/explore_curriculum_interactor.rb +1 -1
  24. data/app/javascript/components/admin/ImportStatus.jsx +7 -3
  25. data/app/javascript/components/admin/MultiSelectedOperation.jsx +1 -0
  26. data/app/javascript/components/admin/association-picker/AssociationPicker.jsx +1 -0
  27. data/app/javascript/components/admin/association-picker/AssociationPickerResults.jsx +1 -0
  28. data/app/javascript/components/admin/association-picker/AssociationPickerWindow.jsx +1 -0
  29. data/app/javascript/components/admin/curriculum/CurriculumEditor.jsx +1 -0
  30. data/app/javascript/components/admin/resource-picker/ResourcePicker.jsx +1 -0
  31. data/app/jobs/concerns/lcms/engine/nested_resque_job.rb +1 -4
  32. data/app/jobs/lcms/engine/document_generate_gdoc_job.rb +2 -2
  33. data/app/jobs/lcms/engine/document_generate_job.rb +1 -1
  34. data/app/jobs/lcms/engine/document_parse_job.rb +1 -1
  35. data/app/models/lcms/engine/component.rb +3 -3
  36. data/app/models/lcms/engine/download.rb +1 -1
  37. data/app/models/lcms/engine/search/document.rb +4 -3
  38. data/app/presenters/lcms/engine/document_presenter.rb +2 -2
  39. data/app/queries/lcms/engine/admin_documents_query.rb +1 -1
  40. data/app/serializers/lcms/engine/previews_material_serializer.rb +1 -0
  41. data/app/services/lcms/engine/document_build_service.rb +4 -0
  42. data/app/services/lcms/engine/html_sanitizer.rb +5 -5
  43. data/app/services/lcms/engine/lessons_gdoc_bundler.rb +1 -1
  44. data/app/services/lcms/engine/material_build_service.rb +6 -2
  45. data/app/services/lcms/engine/material_preview_generator.rb +2 -2
  46. data/app/services/lcms/engine/react_materials_resolver.rb +3 -2
  47. data/app/views/lcms/engine/admin/batch_reimports/_search_form.html.erb +1 -1
  48. data/app/views/lcms/engine/admin/curriculums/edit.html.erb +1 -3
  49. data/app/views/lcms/engine/admin/documents/_materials_links.html.erb +2 -2
  50. data/app/views/lcms/engine/admin/documents/_search_form.html.erb +1 -1
  51. data/app/views/lcms/engine/admin/documents/index.html.erb +2 -2
  52. data/app/views/lcms/engine/admin/documents/new.html.erb +1 -1
  53. data/app/views/lcms/engine/admin/materials/_search_form.html.erb +1 -1
  54. data/app/views/lcms/engine/admin/materials/index.html.erb +4 -4
  55. data/app/views/lcms/engine/admin/resource_bulk_edits/new.html.erb +1 -1
  56. data/app/views/lcms/engine/admin/resources/_fields.html.erb +3 -0
  57. data/app/views/lcms/engine/admin/resources/_search_form.html.erb +1 -1
  58. data/app/views/lcms/engine/documents/gdoc/_agenda.html.erb +1 -1
  59. data/app/views/lcms/engine/documents/show.html.erb +1 -1
  60. data/app/views/lcms/engine/materials/show.html.erb +1 -1
  61. data/app/views/lcms/engine/resources/_download.html.erb +2 -2
  62. data/app/views/lcms/engine/resources/_unit_bundles.html.erb +2 -2
  63. data/config/locales/admin/en.yml +1 -1
  64. data/db/schema.rb +1 -1
  65. data/lcms-engine.gemspec +12 -10
  66. data/lib/doc_template.rb +1 -1
  67. data/lib/doc_template/objects/agenda_metadata.rb +1 -1
  68. data/lib/doc_template/objects/metadata_helpers.rb +1 -1
  69. data/lib/doc_template/objects/toc_metadata.rb +2 -2
  70. data/lib/doc_template/tables/base.rb +3 -2
  71. data/lib/doc_template/tags/activity_metadata_type_tag.rb +1 -1
  72. data/lib/doc_template/tags/answer_space_tag.rb +1 -1
  73. data/lib/doc_template/tags/base_tag.rb +3 -3
  74. data/lib/doc_template/tags/columns_tag.rb +1 -1
  75. data/lib/doc_template/tags/def_tag.rb +1 -1
  76. data/lib/doc_template/tags/expand_tag.rb +1 -0
  77. data/lib/doc_template/tags/heading_tag.rb +1 -1
  78. data/lib/doc_template/tags/inset_tag.rb +2 -2
  79. data/lib/doc_template/tags/latex_tag.rb +1 -1
  80. data/lib/doc_template/tags/page_break_tag.rb +1 -1
  81. data/lib/doc_template/tags/pd_tag.rb +4 -4
  82. data/lib/doc_template/tags/section_tag.rb +2 -2
  83. data/lib/doc_template/tags/standard_tag.rb +3 -3
  84. data/lib/doc_template/tags/table_preserve_alignment_tag.rb +1 -1
  85. data/lib/document_exporter/gdoc/base.rb +1 -1
  86. data/lib/document_renderer/part.rb +3 -3
  87. data/lib/elasticsearch/persistence/repository/response/results.rb +1 -1
  88. data/lib/lcms/engine/engine.rb +1 -1
  89. data/lib/lcms/engine/version.rb +1 -1
  90. data/lib/lt/lcms/metadata/base_service.rb +2 -1
  91. data/lib/lt/lcms/metadata/context.rb +2 -2
  92. data/lib/lt/lcms/metadata/service.rb +3 -1
  93. data/lib/resque_job.rb +3 -6
  94. data/lib/standard_importer.rb +4 -4
  95. data/lib/tasks/cloud66.rake +6 -4
  96. data/lib/tasks/document.rake +3 -3
  97. data/lib/tasks/google.rake +1 -1
  98. data/package.json +1 -0
  99. data/spec/controllers/admin/association_picker_controller_spec.rb +6 -8
  100. data/spec/controllers/admin/documents_controller_spec.rb +3 -1
  101. data/spec/controllers/admin/materials_controller_spec.rb +1 -1
  102. data/spec/controllers/admin/resources_controller_spec.rb +2 -2
  103. data/spec/dummy/.env.docker +5 -0
  104. data/spec/dummy/config/environments/production.rb +1 -1
  105. data/spec/dummy/config/puma.rb +3 -3
  106. data/spec/entities/grades_spec.rb +12 -0
  107. data/spec/features/admin/lessons/add_lesson_spec.rb +3 -3
  108. data/spec/features/admin/materials/add_material_spec.rb +3 -3
  109. data/spec/forms/document_form_spec.rb +11 -1
  110. data/spec/lib/doc_template/tables/shared_examples/remove_table.rb +1 -1
  111. data/spec/rails_helper.rb +19 -2
  112. data/spec/services/document_build_service_spec.rb +1 -1
  113. data/yarn.lock +145 -170
  114. metadata +81 -34
@@ -1,4 +1,5 @@
1
1
  import React from 'react'
2
+ import _ from 'lodash'
2
3
  import AssociationPickerResults from './AssociationPickerResults'
3
4
 
4
5
  class AssociationPickerWindow extends React.Component {
@@ -1,5 +1,6 @@
1
1
  import React from 'react'
2
2
  import ReactDOM from 'react-dom'
3
+ import _ from 'lodash'
3
4
 
4
5
  class CurriculumEditor extends React.Component {
5
6
  constructor(props) {
@@ -1,5 +1,6 @@
1
1
  import React from 'react'
2
2
  import ReactDOM from 'react-dom'
3
+ import _ from 'lodash'
3
4
  import ResourcePickerWindow from './ResourcePickerWindow'
4
5
  import ResourcePickerResource from './ResourcePickerResource'
5
6
  import PickerButton from '../picker/PickerButton'
@@ -29,10 +29,7 @@ module Lcms
29
29
  [].tap do |result|
30
30
  self::NESTED_JOBS.each do |job_klass|
31
31
  Resque.redis.scan_each(match: "#{job_klass.constantize.result_key(jid)}*") do |key|
32
- res = Resque.redis.multi do
33
- Resque.redis.get key
34
- Resque.redis.del key
35
- end.first
32
+ res = Resque.redis.get key
36
33
  result << JSON.parse(res) rescue res
37
34
  end
38
35
  end
@@ -10,8 +10,8 @@ module Lcms
10
10
 
11
11
  GDOC_EXPORTERS = {
12
12
  'full' => DocumentExporter::Gdoc::Document,
13
- 'sm' => DocumentExporter::Gdoc::StudentMaterial,
14
- 'tm' => DocumentExporter::Gdoc::TeacherMaterial
13
+ 'sm' => DocumentExporter::Gdoc::StudentMaterial,
14
+ 'tm' => DocumentExporter::Gdoc::TeacherMaterial
15
15
  }.freeze
16
16
 
17
17
  before_perform do |job|
@@ -56,7 +56,7 @@ module Lcms
56
56
  # Checks if there are jobs queued or running for current document
57
57
  # and any of its materials
58
58
  #
59
- def materials_generating?
59
+ def materials_generating? # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
60
60
  document.materials.each do |material|
61
61
  queued = Resque.peek(queue_name, 0, 0)
62
62
  .map { |job| job['args'].first }
@@ -31,7 +31,7 @@ module Lcms
31
31
  def reimport_document(link)
32
32
  form = DocumentForm.new({ link: link }, import_retry: true)
33
33
  @result = if form.save
34
- { ok: true, link: link, model: form.document }
34
+ { ok: true, link: link, model: form.document, warnings: form.service_errors }
35
35
  else
36
36
  { ok: false, link: link, errors: form.errors[:link] }
37
37
  end
@@ -53,9 +53,9 @@ module Lcms
53
53
  Elasticsearch::Persistence::Repository::Response::Results.new(
54
54
  repo,
55
55
  hits: {
56
- total: resp[:total],
56
+ total: resp[:total],
57
57
  max_score: resp[:max_score],
58
- hits: resp[:results]
58
+ hits: resp[:results]
59
59
  }
60
60
  ).paginate(resp.slice(:page, :per_page))
61
61
  end
@@ -73,7 +73,7 @@ module Lcms
73
73
  # can define how to deserialize the results
74
74
  def repo
75
75
  @repo ||= Elasticsearch::Persistence::Repository.new do
76
- def deserialize(document) # rubocop:disable Lint/NestedMethodDefinition
76
+ def deserialize(document)
77
77
  Component.new(document)
78
78
  end
79
79
  end
@@ -7,7 +7,7 @@ module Lcms
7
7
  zip: 'application/zip',
8
8
  pdf: 'application/pdf',
9
9
  excel: %w(application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet),
10
- powerpoint: %w(application/vnd.ms-powerpoint application/vnd.openxmlformats-officedocument.presentationml.presentation), # rubocop:disable Metrics/LineLength
10
+ powerpoint: %w(application/vnd.ms-powerpoint application/vnd.openxmlformats-officedocument.presentationml.presentation), # rubocop:disable Layout/LineLength
11
11
  doc: %w(application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document)
12
12
  }.freeze
13
13
  S3_URL = 'http://k12-content.s3-website-us-east-1.amazonaws.com/'
@@ -31,10 +31,11 @@ module Lcms
31
31
 
32
32
  class << self
33
33
  def build_from(model)
34
- if model.is_a?(Lcms::Engine::Resource)
34
+ case model
35
+ when Lcms::Engine::Resource
35
36
  new(**attrs_from_resource(model))
36
37
 
37
- elsif model.is_a?(Lcms::Engine::ExternalPage)
38
+ when Lcms::Engine::ExternalPage
38
39
  new(**attrs_from_page(model))
39
40
 
40
41
  else
@@ -68,7 +69,7 @@ module Lcms
68
69
  if model.is_a?(Lcms::Engine::Resource) && model.generic?
69
70
  rtype = model[:resource_type] || 0
70
71
  # for generic resource use the min grade, instead the avg
71
- grade_pos = model.grades.list.map { |g| Lcms::Engine::Grades::GRADES.index(g) }.compact.min || 0
72
+ grade_pos = model.grades.list.map { |g| Lcms::Engine::Grades.grades.index(g) }.compact.min || 0
72
73
  last_pos = model.grades.list.size
73
74
  else
74
75
  rtype = 0
@@ -131,7 +131,7 @@ module Lcms
131
131
  Lcms::Engine::ReactMaterialsResolver.resolve(content, self)
132
132
  end
133
133
 
134
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
134
+ # rubocop:disable Metrics/PerceivedComplexity
135
135
  def short_breadcrumb(join_with: ' / ', with_short_lesson: false, with_subject: true, unit_level: false)
136
136
  unless unit_level
137
137
  lesson_abbr =
@@ -149,7 +149,7 @@ module Lcms
149
149
  lesson_abbr
150
150
  ].compact.join(join_with)
151
151
  end
152
- # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
152
+ # rubocop:enable Metrics/PerceivedComplexity
153
153
 
154
154
  def short_title
155
155
  assessment? ? doc_type : "Lesson #{lesson}"
@@ -20,7 +20,7 @@ module Lcms
20
20
 
21
21
  private
22
22
 
23
- def apply_filters # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
23
+ def apply_filters # rubocop:disable Metrics/AbcSize
24
24
  @scope = @scope.actives unless q.inactive == '1'
25
25
  @scope = @scope.failed if q.only_failed == '1'
26
26
  @scope = @scope.filter_by_term(q.search_term) if q.search_term.present?
@@ -5,6 +5,7 @@ module Lcms
5
5
  class PreviewsMaterialSerializer < ActiveModel::Serializer
6
6
  attributes :activity, :color, :content_type, :data, :for_group, :lesson, :subject
7
7
  attr_reader :document
8
+
8
9
  delegate :content_type, :subject, to: :document
9
10
 
10
11
  def initialize(props, document)
@@ -7,8 +7,11 @@ module Lcms
7
7
  class DocumentBuildService
8
8
  EVENT_BUILT = 'document:built'
9
9
 
10
+ attr_reader :errors
11
+
10
12
  def initialize(credentials, opts = {})
11
13
  @credentials = credentials
14
+ @errors = []
12
15
  @options = opts
13
16
  end
14
17
 
@@ -19,6 +22,7 @@ module Lcms
19
22
  @content = download url
20
23
  @expand_document = expand
21
24
  @template = DocTemplate::Template.parse @content
25
+ @errors = @template.metadata_service.errors
22
26
 
23
27
  create_document
24
28
  clear_preview_link
@@ -5,10 +5,10 @@ require 'sanitize'
5
5
  module Lcms
6
6
  module Engine
7
7
  class HtmlSanitizer # rubocop:disable Metrics/ClassLength
8
- LIST_STYLE_RE = /\.lst-(\S+)[^{}]+>\s*(?:li:before)\s*{\s*content[^{}]+counter\(lst-ctn-\1,([^)]+)\)/
8
+ LIST_STYLE_RE = /\.lst-(\S+)[^{}]+>\s*(?:li:before)\s*{\s*content[^{}]+counter\(lst-ctn-\1,([^)]+)\)/.freeze
9
9
  CLEAN_ELEMENTS = %w(a div h1 h2 h3 h4 h5 h6 p table).join(',')
10
10
  GDOC_REMOVE_EMPTY_SELECTOR = '.o-ld-activity'
11
- LINK_UNDERLINE_REGEX = /text-decoration\s*:\s*underline/i
11
+ LINK_UNDERLINE_REGEX = /text-decoration\s*:\s*underline/i.freeze
12
12
  SKIP_P_CHECK = %w(ul ol table).freeze
13
13
  STRIP_ELEMENTS = %w(a div h1 h2 h3 h4 h5 h6 p span table).freeze
14
14
 
@@ -169,7 +169,7 @@ module Lcms
169
169
  ].freeze
170
170
  private_constant :FONT_STYLES_RE
171
171
 
172
- BORDER_RE = /border-\w+-width:\s*0\w+;?/
172
+ BORDER_RE = /border-\w+-width:\s*0\w+;?/.freeze
173
173
  private_constant :BORDER_RE
174
174
 
175
175
  BORDER_REPLACE_RE = {
@@ -186,7 +186,7 @@ module Lcms
186
186
  ].freeze
187
187
  private_constant :SUB_SUP_RE
188
188
 
189
- SUB_SUP_STYLE_RE = /vertical-align:\s*(sub|super);?/i
189
+ SUB_SUP_STYLE_RE = /vertical-align:\s*(sub|super);?/i.freeze
190
190
  private_constant :SUB_SUP_STYLE_RE
191
191
 
192
192
  def add_css_class(el, *classes)
@@ -242,7 +242,7 @@ module Lcms
242
242
  end
243
243
 
244
244
  def fix_table_styles(nodes, param, selector)
245
- attr_regex = /(^|;\s*)#{param}\s*:\s*([\w\.]+)\s*($|;)*/
245
+ attr_regex = /(^|;\s*)#{param}\s*:\s*([\w.]+)\s*($|;)*/
246
246
  nodes.css(selector).each do |node|
247
247
  node[param] = node['style'].match(attr_regex)&.[](2)
248
248
  end
@@ -67,7 +67,7 @@ module Lcms
67
67
 
68
68
  def dirname(res)
69
69
  subject = res.subject.casecmp('math').zero? ? 'Math' : 'ELA'
70
- Breadcrumbs.new(res).short_pieces[1..-1].unshift(subject).join('-')
70
+ Breadcrumbs.new(res).short_pieces[1..].unshift(subject).join('-')
71
71
  end
72
72
 
73
73
  def drive_id(url)
@@ -7,10 +7,13 @@ module Lcms
7
7
  module Engine
8
8
  class MaterialBuildService
9
9
  EVENT_BUILT = 'material:built'
10
- PDF_EXT_RE = /\.pdf$/
10
+ PDF_EXT_RE = /\.pdf$/.freeze
11
+
12
+ attr_reader :errors
11
13
 
12
14
  def initialize(credentials, opts = {})
13
15
  @credentials = credentials
16
+ @errors = []
14
17
  @options = opts
15
18
  end
16
19
 
@@ -25,7 +28,7 @@ module Lcms
25
28
 
26
29
  attr_reader :credentials, :material, :downloader, :options, :url
27
30
 
28
- def build_from_pdf
31
+ def build_from_pdf # rubocop:disable Metrics/AbcSize
29
32
  @downloader = ::Lt::Lcms::Lesson::Downloader::PDF.new(credentials, url)
30
33
  create_material
31
34
  title = @downloader.file.name.sub(PDF_EXT_RE, '')
@@ -60,6 +63,7 @@ module Lcms
60
63
  create_material
61
64
  content = @downloader.download.content
62
65
  template = DocTemplate::Template.parse(content, type: :material)
66
+ @errors = template.metadata_service.errors
63
67
 
64
68
  metadata = template.metadata_service.options_for(:default)[:metadata]
65
69
  material.update!(
@@ -6,8 +6,8 @@ module Lcms
6
6
  # Generates and uploads PDF/GDoc files for material
7
7
  #
8
8
  class MaterialPreviewGenerator
9
- GDOC_RE = %r{docs.google.com/document/d/([^/]*)}i
10
- GDOC_BROKEN_RE = %r{/open\?id=$}i
9
+ GDOC_RE = %r{docs.google.com/document/d/([^/]*)}i.freeze
10
+ GDOC_BROKEN_RE = %r{/open\?id=$}i.freeze
11
11
  PDF_S3_FOLDER = 'temp-materials-pdf'
12
12
 
13
13
  attr_reader :error, :url
@@ -14,8 +14,9 @@ module Lcms
14
14
 
15
15
  private
16
16
 
17
- def replace_react(node, document)
17
+ def replace_react(node, document) # rubocop:disable Metrics/PerceivedComplexity
18
18
  node.remove && return if (data = node.attr('data-react-props')).blank?
19
+
19
20
  raw_props = if data.match?(/^\d+(?:,\s*\d+)*$/)
20
21
  # comma separated list of numbers, i.e: '123' or '123,432' or '123, 42, 12'
21
22
  { 'material_ids' => data.split(',').map(&:strip), 'activity' => {} }
@@ -25,7 +26,7 @@ module Lcms
25
26
  node.remove && return if (raw_props['material_ids']).empty?
26
27
 
27
28
  props = PreviewsMaterialSerializer.new(raw_props, document)
28
- node.remove && return if props.data&.empty?
29
+ node.remove && return if props.data && props.data.empty?
29
30
 
30
31
  node.replace(component(props, document))
31
32
  end
@@ -17,7 +17,7 @@
17
17
  required: false,
18
18
  as: :select,
19
19
  include_blank: true,
20
- collection: Lcms::Engine::Grades::GRADES,
20
+ collection: Lcms::Engine::Grades.grades,
21
21
  label_method: :humanize %>
22
22
  </div>
23
23
 
@@ -1,12 +1,10 @@
1
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css"/>
1
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" />
2
2
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
3
3
 
4
4
  <% set_page_title 'Curriculum Tree Manager' %>
5
5
 
6
6
  <div class="o-page">
7
7
 
8
- <h1 class="text-center">Import Curriculum Tree</h1>
9
-
10
8
  <% if @curriculum.present? %>
11
9
  <h1 class="text-center">Curriculum Tree</h1>
12
10
  <div class="row">
@@ -3,10 +3,10 @@
3
3
  <% urls = material_urls(m, lesson) %>
4
4
  <li class="u-text--small">
5
5
  <% if urls[:gdoc].present? %>
6
- <a class="lessons-table__materials--file" href="<%= urls[:gdoc] %>" target="_blank"> <i class="ub-icon ub-file-gdoc"></i></a>
6
+ <a class="lessons-table__materials--file" href="<%= urls[:gdoc] %>" target="_blank"> <i class="fab fa-google"></i></a>
7
7
  <% end %>
8
8
  <% if urls[:pdf].present? %>
9
- <a class="lessons-table__materials--file" href="<%= urls[:pdf] %>" target="_blank"> <i class="ub-icon ub-file-pdf"></i></a>
9
+ <a class="lessons-table__materials--file" href="<%= urls[:pdf] %>" target="_blank"> <i class="far fa-file-pdf"></i></a>
10
10
  <% end %>
11
11
  <%= link_to(m.identifier, m, target: '_blank') %>
12
12
  </li>
@@ -18,7 +18,7 @@
18
18
  required: false,
19
19
  as: :select,
20
20
  include_blank: true,
21
- collection: Lcms::Engine::Grades::GRADES,
21
+ collection: Lcms::Engine::Grades.grades,
22
22
  label_method: :humanize %>
23
23
  </div>
24
24
 
@@ -16,12 +16,12 @@
16
16
  <%= react_component 'admin/MultiSelectedOperation', {
17
17
  text: t('.reimport_selected'),
18
18
  operation: 'reimport',
19
- path: reimport_selected_admin_documents_path(query: params[:query]),
19
+ path: reimport_selected_admin_documents_path(query: @query_params),
20
20
  btn_style: 'primary' } %>
21
21
  <%= react_component 'admin/MultiSelectedOperation', {
22
22
  text: t('.delete_selected'),
23
23
  operation: 'delete',
24
- path: delete_selected_admin_documents_path(query: params[:query]),
24
+ path: delete_selected_admin_documents_path(query: @query_params),
25
25
  btn_style: 'alert'} %>
26
26
 
27
27
  <%= link_to t('.new_lesson'), :new_admin_document, class: 'button primary' %>
@@ -1,7 +1,7 @@
1
1
  <div class="o-page">
2
2
  <h2 class=text-center><%= t('.page_title') %></h2>
3
3
 
4
- <%= simple_form_for @document, url: [:admin, :documents] do |f| %>
4
+ <%= simple_form_for @document || DocumentForm.new, url: [:admin, :documents] do |f| %>
5
5
  <%= f.input :link, error: f.object.errors[:link].first.try(:html_safe), label: t('ui.url') %>
6
6
  <%= f.button :submit, t('.submit') %>
7
7
  <% end %>
@@ -31,7 +31,7 @@
31
31
  required: false,
32
32
  as: :select,
33
33
  include_blank: true,
34
- collection: Lcms::Engine::Grades::GRADES_ABBR.zip(Lcms::Engine::Grades::GRADES.map(&:humanize)).last(4),
34
+ collection: Lcms::Engine::Grades.grades_abbrevs.zip(Lcms::Engine::Grades.grades.map(&:humanize)).last(4),
35
35
  label_method: :last,
36
36
  value_method: :first %>
37
37
  </div>
@@ -16,12 +16,12 @@
16
16
  <%= react_component 'admin/MultiSelectedOperation', {
17
17
  text: t('.reimport_selected'),
18
18
  operation: 'reimport',
19
- path: reimport_selected_admin_materials_path(query: params[:query]),
19
+ path: reimport_selected_admin_materials_path(query: @query_params),
20
20
  btn_style: 'primary' } %>
21
21
  <%= react_component 'admin/MultiSelectedOperation', {
22
22
  text: t('.delete_selected'),
23
23
  operation: 'delete',
24
- path: delete_selected_admin_materials_path(query: params[:query]),
24
+ path: delete_selected_admin_materials_path(query: @query_params),
25
25
  btn_style: 'alert'} %>
26
26
  <%# link_to t('.new_material_pdf'), new_admin_material_path(source_type: 'pdf'), class: 'button primary' %>
27
27
  <%= link_to t('.new_material'), :new_admin_material, class: 'button primary' %>
@@ -70,7 +70,7 @@
70
70
  <% material.documents.each do |lesson| %>
71
71
  <% lesson = ::Lcms::Engine::DocumentGenerator.document_presenter.new lesson %>
72
72
  <li class="u-text--small">
73
- <a href="<%= lesson.file_url%>" target="_blank" class="materials-table__lessons--file"><i class="ub-icon ub-file-gdoc"></i></a>
73
+ <a href="<%= lesson.file_url%>" target="_blank" class="materials-table__lessons--file"><i class="fab fa-google"></i></a>
74
74
  <%= link_to lesson.title, ::Lcms::Engine::Admin::AdminController.document_path(lesson, request.query_parameters), target: '_blank' %>
75
75
  </li>
76
76
  <% end %>
@@ -78,7 +78,7 @@
78
78
  <td class="u-txt--small"><%= material.reimported_at.to_s.presence || material.updated_at.to_s %>
79
79
  <td class="materials-table__btns text-left">
80
80
  <%= render partial: 'lcms/engine/admin/materials/reimport', locals: { material: material } %>
81
- <%= button_to t('ui.delete'), admin_material_path(material, query: params[:query]), class: 'button small alert', data: { confirm: t('ui.are_you_sure') }, form_class: 'inline', method: :delete %>
81
+ <%= button_to t('ui.delete'), admin_material_path(material, query: @query_params), class: 'button small alert', data: { confirm: t('ui.are_you_sure') }, form_class: 'inline', method: :delete %>
82
82
  <% unless material.pdf? %>
83
83
  <%# link_to material.pdf_preview_title, preview_pdf_material_path(material), class: 'button warning', target: '_blank' %>
84
84
  <%# link_to material.gdoc_preview_title, preview_gdoc_material_path(material), class: 'button warning', target: '_blank' %>
@@ -9,7 +9,7 @@
9
9
 
10
10
  <%= f.association :standards, as: :select, input_html: { class: 'selectize', multiple: true } %>
11
11
 
12
- <%= f.input :grades, collection: Lcms::Engine::Grades::GRADES, as: :select, value_method: :humanize, input_html: { class: 'selectize', id: 'grades_select', multiple: true } %>
12
+ <%= f.input :grades, collection: Lcms::Engine::Grades.grades, as: :select, value_method: :humanize, input_html: { class: 'selectize', id: 'grades_select', multiple: true } %>
13
13
 
14
14
  <%= f.input :tag_list, collection: Lcms::Engine::Tag.where_context('tags').select(:id, :name).distinct(:name), as: :select, value_method: :name, input_html: { class: 'selectize', id: 'subjects_select', multiple: true } %>
15
15
 
@@ -14,6 +14,9 @@
14
14
 
15
15
  <%= f.input :opr_description, label: t('lcms.engine.admin.resources.form.opr_description'), wrapper_html: {class: (resource.unit? ? '': 'c-hidden')} %>
16
16
 
17
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css"/>
18
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
19
+
17
20
  <%= react_component('admin/curriculum/DirectoryPicker', directory_picker_props(resource)) %>
18
21
 
19
22
  <%= f.input :time_to_teach %>
@@ -1,7 +1,7 @@
1
1
  <%= simple_form_for @query, url: :admin_resources, html: { class: 'form-inline well admin-resource-search', method: :get } do |f| %>
2
2
 
3
3
  <div class='row align-justify'>
4
- <%= f.input :grades, as: :select, collection: Lcms::Engine::Grades::GRADES, input_html: { class: 'selectize resource-search-select', multiple: true }, label: t('.grades'), label_method: :humanize, required: false, wrapper_html: { class: 'resource-search-wrap' } %>
4
+ <%= f.input :grades, as: :select, collection: Lcms::Engine::Grades.grades, input_html: { class: 'selectize resource-search-select', multiple: true }, label: t('.grades'), label_method: :humanize, required: false, wrapper_html: { class: 'resource-search-wrap' } %>
5
5
 
6
6
  <%= f.input :resource_standards_standard_id_in, as: :select, collection: Lcms::Engine::Standard.all, input_html: { class: 'selectize resource-search-select', multiple: true }, label: t('.standards'), required: false, wrapper_html: { class: 'resource-search-wrap' } %>
7
7