lcms-engine 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. checksums.yaml +4 -4
  2. data/{spec/dummy/.env.docker → .env.docker} +0 -0
  3. data/.env.template +34 -0
  4. data/.gitignore +0 -1
  5. data/CHANGELOG.md +25 -0
  6. data/Dockerfile +1 -0
  7. data/Gemfile +0 -1
  8. data/Gemfile.lock +682 -0
  9. data/README.md +5 -11
  10. data/app/assets/javascripts/lcms/engine/admin/application.js +2 -11
  11. data/app/assets/javascripts/lcms/engine/application.js +1 -44
  12. data/app/assets/javascripts/lcms/engine/application_lti.js +1 -29
  13. data/app/assets/javascripts/lcms/engine/initializers/foundation.js +5 -0
  14. data/app/assets/stylesheets/lcms/engine/admin.scss +0 -1
  15. data/app/assets/stylesheets/lcms/engine/application.scss +6 -61
  16. data/app/assets/stylesheets/lcms/engine/base/_colors.scss +2 -2
  17. data/app/assets/stylesheets/lcms/engine/components/lesson/_icons.scss +0 -25
  18. data/app/assets/stylesheets/lcms/engine/layout/_footer.scss +2 -0
  19. data/app/assets/stylesheets/lcms/engine/layout/_header.scss +1 -210
  20. data/app/assets/stylesheets/lcms/engine/pdf.scss +3 -27
  21. data/app/assets/stylesheets/lcms/engine/pdf_plain.scss +3 -11
  22. data/app/assets/stylesheets/lcms/engine/print/_typography.scss +0 -5
  23. data/app/assets/stylesheets/lcms/engine/utils/_variables.scss +4 -4
  24. data/app/controllers/concerns/lcms/engine/reimportable.rb +9 -0
  25. data/app/controllers/lcms/engine/admin/admin_controller.rb +2 -0
  26. data/app/controllers/lcms/engine/admin/documents_controller.rb +7 -17
  27. data/app/controllers/lcms/engine/admin/materials_controller.rb +16 -19
  28. data/app/controllers/lcms/engine/admin/resources_controller.rb +77 -41
  29. data/app/controllers/lcms/engine/surveys_controller.rb +3 -14
  30. data/app/forms/lcms/engine/material_form.rb +1 -0
  31. data/app/helpers/lcms/engine/application_helper.rb +6 -2
  32. data/app/helpers/lcms/engine/resource_helper.rb +0 -17
  33. data/app/presenters/lcms/engine/content_presenter.rb +1 -1
  34. data/app/presenters/lcms/engine/document_presenter.rb +3 -5
  35. data/app/views/devise/confirmations/new.html.erb +1 -1
  36. data/app/views/devise/passwords/edit.html.erb +1 -1
  37. data/app/views/devise/passwords/new.html.erb +1 -1
  38. data/app/views/devise/registrations/new.html.erb +1 -1
  39. data/app/views/devise/sessions/new.html.erb +2 -2
  40. data/app/views/layouts/lcms/engine/admin.html.erb +1 -3
  41. data/app/views/layouts/lcms/engine/application.html.erb +0 -6
  42. data/app/views/layouts/lcms/engine/cg_pdf.erb +0 -38
  43. data/app/views/layouts/lcms/engine/lti.html.erb +0 -1
  44. data/app/views/lcms/engine/admin/curriculums/edit.html.erb +3 -0
  45. data/app/views/lcms/engine/admin/materials/index.html.erb +1 -1
  46. data/app/views/lcms/engine/admin/resource_bulk_edits/new.html.erb +3 -3
  47. data/app/views/lcms/engine/admin/shared/_header.html.erb +1 -8
  48. data/app/views/lcms/engine/documents/_content.html.erb +0 -1
  49. data/app/views/lcms/engine/documents/_sticky_header.html.erb +1 -1
  50. data/app/views/lcms/engine/documents/_sticky_site_menu.html.erb +0 -1
  51. data/app/views/lcms/engine/resources/_download.html.erb +2 -2
  52. data/app/views/lcms/engine/resources/_unit_bundles.html.erb +2 -2
  53. data/app/views/lcms/engine/resources/show.html.erb +2 -2
  54. data/app/views/lcms/engine/shared/_footer.html.erb +1 -3
  55. data/app/views/lcms/engine/shared/_header.html.erb +2 -36
  56. data/app/views/lcms/engine/surveys/show.html.erb +1 -1
  57. data/app/views/lcms/engine/welcome/index.html.erb +1 -80
  58. data/config/locales/admin/en.yml +1 -0
  59. data/config/routes.rb +2 -36
  60. data/db/migrate/20200422130652_add_reimported_at_to_documents.rb +1 -1
  61. data/db/migrate/20200429130353_drop_pages.rb +13 -0
  62. data/docs/env-variables.md +87 -0
  63. data/docs/google-cloud-platform-setup.md +106 -0
  64. data/lcms-engine.gemspec +50 -59
  65. data/lib/doc_template/document.rb +2 -2
  66. data/lib/doc_template/tables/activity.rb +1 -2
  67. data/lib/doc_template/tables/base.rb +4 -0
  68. data/lib/doc_template/tables/section.rb +1 -2
  69. data/lib/doc_template/xpath_functions.rb +3 -1
  70. data/lib/lcms/engine/engine.rb +0 -8
  71. data/lib/lcms/engine/version.rb +1 -1
  72. data/lib/lt/lcms/metadata/context.rb +5 -7
  73. data/spec/controllers/admin/admin_controller_spec.rb +1 -1
  74. data/spec/controllers/admin/documents_controller_spec.rb +38 -6
  75. data/spec/controllers/admin/materials_controller_spec.rb +64 -0
  76. data/spec/controllers/admin/resources_controller_spec.rb +72 -0
  77. data/spec/dummy/config/lcms-admin.yml +3 -3
  78. data/spec/dummy/db/schema.rb +29 -37
  79. data/spec/features/welcome_spec.rb +1 -1
  80. data/spec/fixtures/tables/activity-metadata-3activities.html +1 -0
  81. data/spec/fixtures/tables/document-metadata-2paragpraphs.html +97 -0
  82. data/spec/fixtures/tables/document-metadata-2spans.html +96 -0
  83. data/spec/fixtures/tables/document-metadata.html +96 -0
  84. data/spec/lib/doc_template/tables/activity_spec.rb +28 -0
  85. data/spec/lib/doc_template/tables/metadata_spec.rb +40 -0
  86. data/spec/lib/doc_template/tables/shared_examples/remove_table.rb +11 -0
  87. data/spec/rails_helper.rb +1 -0
  88. data/spec/support/fixture_helper.rb +16 -0
  89. data/vendor/assets/javascripts/selectize.min.js +4 -0
  90. data/vendor/assets/stylesheets/selectize.scss +333 -0
  91. data/yarn.lock +634 -452
  92. metadata +274 -494
  93. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Medium-Web.eot +0 -0
  94. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Medium-Web.svg +0 -689
  95. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Medium-Web.ttf +0 -0
  96. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Medium-Web.woff +0 -0
  97. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Regular-Web.eot +0 -0
  98. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Regular-Web.svg +0 -697
  99. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Regular-Web.ttf +0 -0
  100. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Regular-Web.woff +0 -0
  101. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-RegularItalic-Web.eot +0 -0
  102. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-RegularItalic-Web.svg +0 -768
  103. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-RegularItalic-Web.ttf +0 -0
  104. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-RegularItalic-Web.woff +0 -0
  105. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Semibold-Web.eot +0 -0
  106. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Semibold-Web.svg +0 -685
  107. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Semibold-Web.ttf +0 -0
  108. data/app/assets/fonts/lcms/engine/caponi/CaponiSlab-Semibold-Web.woff +0 -0
  109. data/app/assets/fonts/lcms/engine/centro/PFCentroSansCond-Bold.eot +0 -0
  110. data/app/assets/fonts/lcms/engine/centro/PFCentroSansCond-Bold.svg +0 -5603
  111. data/app/assets/fonts/lcms/engine/centro/PFCentroSansCond-Bold.woff +0 -0
  112. data/app/assets/fonts/lcms/engine/centro/PFCentroSansCond-Light.eot +0 -0
  113. data/app/assets/fonts/lcms/engine/centro/PFCentroSansCond-Light.svg +0 -5763
  114. data/app/assets/fonts/lcms/engine/centro/PFCentroSansCond-Light.woff +0 -0
  115. data/app/assets/fonts/lcms/engine/centro/PFCentroSansCond-Medium.eot +0 -0
  116. data/app/assets/fonts/lcms/engine/centro/PFCentroSansCond-Medium.otf +0 -0
  117. data/app/assets/fonts/lcms/engine/centro/PFCentroSansCond-Medium.svg +0 -5400
  118. data/app/assets/fonts/lcms/engine/centro/PFCentroSansCond-Medium.woff +0 -0
  119. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Bold.eot +0 -0
  120. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Bold.html +0 -15
  121. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Bold.otf +0 -0
  122. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Bold.svg +0 -13061
  123. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Bold.woff +0 -0
  124. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Light.eot +0 -0
  125. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Light.html +0 -15
  126. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Light.otf +0 -0
  127. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Light.svg +0 -13075
  128. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Light.woff +0 -0
  129. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-LightItalic.eot +0 -0
  130. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-LightItalic.otf +0 -0
  131. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-LightItalic.svg +0 -13142
  132. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-LightItalic.woff +0 -0
  133. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Medium.eot +0 -0
  134. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Medium.ttf +0 -0
  135. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Medium.woff +0 -0
  136. data/app/assets/fonts/lcms/engine/centro/PFCentroSansPro-Medium.woff2 +0 -0
  137. data/app/assets/fonts/lcms/engine/cursive/Sriracha-Regular.ttf +0 -0
  138. data/app/assets/fonts/lcms/engine/icons/ubicons.eot +0 -0
  139. data/app/assets/fonts/lcms/engine/icons/ubicons.svg +0 -50
  140. data/app/assets/fonts/lcms/engine/icons/ubicons.ttf +0 -0
  141. data/app/assets/fonts/lcms/engine/icons/ubicons.woff +0 -0
  142. data/app/assets/fonts/lcms/engine/ub/UBIcons.eot +0 -0
  143. data/app/assets/fonts/lcms/engine/ub/UBIcons.svg +0 -18
  144. data/app/assets/fonts/lcms/engine/ub/UBIcons.ttf +0 -0
  145. data/app/assets/fonts/lcms/engine/ub/UBIcons.woff +0 -0
  146. data/app/assets/images/lcms/engine/lessons/ld_p1.png +0 -0
  147. data/app/assets/images/lcms/engine/lessons/ld_p2.png +0 -0
  148. data/app/assets/images/lcms/engine/lessons/ld_p3.png +0 -0
  149. data/app/assets/images/lcms/engine/lessons/tens.png +0 -0
  150. data/app/assets/images/lcms/engine/lessons/wp.svg +0 -30
  151. data/app/assets/images/lcms/engine/tile-wide.png +0 -0
  152. data/app/assets/images/lcms/engine/tile.png +0 -0
  153. data/app/assets/javascripts/lcms/engine/components.js +0 -7
  154. data/app/assets/javascripts/lcms/engine/components/.gitkeep +0 -0
  155. data/app/assets/javascripts/lcms/engine/components/curriculum-map/CurriculumMap.js.jsx +0 -31
  156. data/app/assets/javascripts/lcms/engine/components/curriculum-map/CurriculumMapLesson.js.jsx +0 -18
  157. data/app/assets/javascripts/lcms/engine/components/curriculum-map/CurriculumMapModule.js.jsx +0 -59
  158. data/app/assets/javascripts/lcms/engine/components/curriculum-map/CurriculumMapUnit.js.jsx +0 -56
  159. data/app/assets/javascripts/lcms/engine/components/curriculum-map/ResourceHover.js.jsx +0 -27
  160. data/app/assets/javascripts/lcms/engine/components/curriculum-map/ResourcePreview.js.jsx +0 -29
  161. data/app/assets/javascripts/lcms/engine/components/enhance-instruction/EnhanceInstructionCards.js.jsx +0 -13
  162. data/app/assets/javascripts/lcms/engine/components/enhance-instruction/EnhanceInstructionPage.js.jsx +0 -139
  163. data/app/assets/javascripts/lcms/engine/components/enhance-instruction/GenericResourceCard.js.jsx +0 -20
  164. data/app/assets/javascripts/lcms/engine/components/explore-curriculum/ExploreCurriculumCardItem.js.jsx +0 -152
  165. data/app/assets/javascripts/lcms/engine/components/explore-curriculum/ExploreCurriculumGradeMap.js.jsx +0 -44
  166. data/app/assets/javascripts/lcms/engine/components/explore-curriculum/ExploreCurriculumHeader.js.jsx +0 -10
  167. data/app/assets/javascripts/lcms/engine/components/explore-curriculum/ExploreCurriculumItem.js.jsx +0 -77
  168. data/app/assets/javascripts/lcms/engine/components/explore-curriculum/ExploreCurriculumModuleMap.js.jsx +0 -59
  169. data/app/assets/javascripts/lcms/engine/components/explore-curriculum/ExploreCurriculumOpr.js.jsx +0 -62
  170. data/app/assets/javascripts/lcms/engine/components/explore-curriculum/ExploreCurriculumPage.js.jsx +0 -258
  171. data/app/assets/javascripts/lcms/engine/components/explore-curriculum/ExploreCurriculumUnitMap.js.jsx +0 -50
  172. data/app/assets/javascripts/lcms/engine/components/filterbar/FilterBarResponsive.js.jsx +0 -62
  173. data/app/assets/javascripts/lcms/engine/components/filterbar/Filterbar.js.jsx +0 -258
  174. data/app/assets/javascripts/lcms/engine/components/filterbar/FilterbarFacet.js.jsx +0 -12
  175. data/app/assets/javascripts/lcms/engine/components/filterbar/FilterbarGrade.js.jsx +0 -14
  176. data/app/assets/javascripts/lcms/engine/components/filterbar/FilterbarSearch.js.jsx +0 -48
  177. data/app/assets/javascripts/lcms/engine/components/filterbar/FilterbarSubject.js.jsx +0 -12
  178. data/app/assets/javascripts/lcms/engine/components/find-lessons/FindLessonsCards.js.jsx +0 -11
  179. data/app/assets/javascripts/lcms/engine/components/find-lessons/FindLessonsCardsEmpty.js.jsx +0 -17
  180. data/app/assets/javascripts/lcms/engine/components/find-lessons/FindLessonsPage.js.jsx +0 -58
  181. data/app/assets/javascripts/lcms/engine/components/helpers/FreshdeskBtn.js.jsx +0 -9
  182. data/app/assets/javascripts/lcms/engine/components/helpers/MediaTime.js.jsx +0 -6
  183. data/app/assets/javascripts/lcms/engine/components/helpers/SearchResultsHeader.js.jsx +0 -41
  184. data/app/assets/javascripts/lcms/engine/components/helpers/TimeToTeach.js.jsx +0 -29
  185. data/app/assets/javascripts/lcms/engine/components/instruction-card/InstructionCard.js.jsx +0 -57
  186. data/app/assets/javascripts/lcms/engine/components/lesson-card/LessonCard.js.jsx +0 -45
  187. data/app/assets/javascripts/lcms/engine/components/materials/CollapsedMaterial.js.jsx +0 -40
  188. data/app/assets/javascripts/lcms/engine/components/materials/DocumentMaterialsList.js.jsx +0 -33
  189. data/app/assets/javascripts/lcms/engine/components/materials/ExpandedMaterial.js.jsx +0 -37
  190. data/app/assets/javascripts/lcms/engine/components/materials/MaterialsContainer.js.jsx +0 -92
  191. data/app/assets/javascripts/lcms/engine/components/materials/MaterialsList.js.jsx +0 -19
  192. data/app/assets/javascripts/lcms/engine/components/modals/DownloadModal.js.jsx +0 -68
  193. data/app/assets/javascripts/lcms/engine/components/related-instruction/RelatedInstruction.js.jsx +0 -72
  194. data/app/assets/javascripts/lcms/engine/components/search-dropdown/SearchDropdown.js.jsx +0 -159
  195. data/app/assets/javascripts/lcms/engine/components/search-dropdown/SearchDropdownResult.js.jsx +0 -12
  196. data/app/assets/javascripts/lcms/engine/components/search-dropdown/SearchDropdownResults.js.jsx +0 -36
  197. data/app/assets/javascripts/lcms/engine/components/search/SearchPage.js.jsx +0 -44
  198. data/app/assets/javascripts/lcms/engine/components/search/SearchResult.js.jsx +0 -22
  199. data/app/assets/javascripts/lcms/engine/components/search/SearchResults.js.jsx +0 -17
  200. data/app/assets/javascripts/lcms/engine/components/search/SearchResultsEmpty.js.jsx +0 -25
  201. data/app/assets/javascripts/lcms/engine/components/search/searchPageWrapper.js.jsx +0 -77
  202. data/app/assets/javascripts/lcms/engine/components/select-activity/SelectActivityConfirmationModal.js.jsx +0 -107
  203. data/app/assets/javascripts/lcms/engine/components/select-activity/SelectActivityToggle.js.jsx +0 -39
  204. data/app/assets/javascripts/lcms/engine/components/stores/ExcludesStore.js.jsx +0 -11
  205. data/app/assets/javascripts/lcms/engine/components/tabs/SimpleTab.js.jsx +0 -130
  206. data/app/assets/javascripts/lcms/engine/components/utils/UrlHistory.js.jsx +0 -113
  207. data/app/assets/javascripts/lcms/engine/components/utils/colorcodecss.js.jsx +0 -4
  208. data/app/assets/javascripts/lcms/engine/components/utils/converttobem.js.jsx +0 -3
  209. data/app/assets/javascripts/lcms/engine/components/utils/filterbarupdate.js.jsx +0 -5
  210. data/app/assets/javascripts/lcms/engine/components/utils/heaptrackpd.js.jsx +0 -5
  211. data/app/assets/javascripts/lcms/engine/components/utils/regexpescape.js.jsx +0 -5
  212. data/app/assets/javascripts/lcms/engine/components/utils/scalenumber.js.jsx +0 -8
  213. data/app/assets/javascripts/lcms/engine/initializers/about_people.js +0 -8
  214. data/app/assets/javascripts/lcms/engine/initializers/analytics.js +0 -10
  215. data/app/assets/javascripts/lcms/engine/initializers/bundles.js +0 -12
  216. data/app/assets/javascripts/lcms/engine/initializers/events.js +0 -3
  217. data/app/assets/javascripts/lcms/engine/initializers/freshdesk.js +0 -18
  218. data/app/assets/javascripts/lcms/engine/initializers/header_dropdown.js +0 -44
  219. data/app/assets/javascripts/lcms/engine/initializers/heap_analytics.js +0 -78
  220. data/app/assets/javascripts/lcms/engine/initializers/leadership.js +0 -22
  221. data/app/assets/javascripts/lcms/engine/initializers/lessons.js +0 -299
  222. data/app/assets/javascripts/lcms/engine/initializers/loadasync.js +0 -30
  223. data/app/assets/javascripts/lcms/engine/initializers/pdf_preview.js +0 -15
  224. data/app/assets/javascripts/lcms/engine/initializers/resource_details.js +0 -21
  225. data/app/assets/javascripts/lcms/engine/initializers/sidebar/SideBar.js.jsx +0 -86
  226. data/app/assets/javascripts/lcms/engine/initializers/sidebar/SidebarCGMenu.js.jsx +0 -37
  227. data/app/assets/javascripts/lcms/engine/initializers/sidebar/SidebarDocMenu.js.jsx +0 -75
  228. data/app/assets/javascripts/lcms/engine/initializers/sidebar/SidebarMobile.js.jsx +0 -43
  229. data/app/assets/javascripts/lcms/engine/initializers/sidebar/SidebarSticky.js.jsx +0 -43
  230. data/app/assets/javascripts/lcms/engine/initializers/sidebar/TopScroll.js.jsx +0 -21
  231. data/app/assets/javascripts/lcms/engine/initializers/social_sharing.js +0 -29
  232. data/app/assets/javascripts/lcms/engine/initializers/soundcloud.js +0 -52
  233. data/app/assets/javascripts/lcms/engine/initializers/subscribe_placeholder.js +0 -12
  234. data/app/assets/javascripts/lcms/engine/initializers/survey.js +0 -31
  235. data/app/assets/stylesheets/lcms/engine/base/_cg-colors.scss +0 -48
  236. data/app/assets/stylesheets/lcms/engine/base/_fonts.scss +0 -103
  237. data/app/assets/stylesheets/lcms/engine/base/_icons.scss +0 -342
  238. data/app/assets/stylesheets/lcms/engine/components/_buttons.scss +0 -200
  239. data/app/assets/stylesheets/lcms/engine/components/_cards.scss +0 -36
  240. data/app/assets/stylesheets/lcms/engine/components/_cg-base.scss +0 -22
  241. data/app/assets/stylesheets/lcms/engine/components/_curriculum-cards.scss +0 -237
  242. data/app/assets/stylesheets/lcms/engine/components/_curriculum-map.scss +0 -214
  243. data/app/assets/stylesheets/lcms/engine/components/_download-modal.scss +0 -56
  244. data/app/assets/stylesheets/lcms/engine/components/_filterbar-modal.scss +0 -20
  245. data/app/assets/stylesheets/lcms/engine/components/_filterbar.scss +0 -184
  246. data/app/assets/stylesheets/lcms/engine/components/_generic-resource.scss +0 -58
  247. data/app/assets/stylesheets/lcms/engine/components/_inputs.scss +0 -12
  248. data/app/assets/stylesheets/lcms/engine/components/_instruction-cards.scss +0 -160
  249. data/app/assets/stylesheets/lcms/engine/components/_lesson-base.scss +0 -31
  250. data/app/assets/stylesheets/lcms/engine/components/_lesson-cards.scss +0 -119
  251. data/app/assets/stylesheets/lcms/engine/components/_ls-post.scss +0 -38
  252. data/app/assets/stylesheets/lcms/engine/components/_material-base.scss +0 -6
  253. data/app/assets/stylesheets/lcms/engine/components/_media-resources.scss +0 -6
  254. data/app/assets/stylesheets/lcms/engine/components/_media.scss +0 -95
  255. data/app/assets/stylesheets/lcms/engine/components/_pagination.scss +0 -84
  256. data/app/assets/stylesheets/lcms/engine/components/_panel-dsc.scss +0 -37
  257. data/app/assets/stylesheets/lcms/engine/components/_panel.scss +0 -7
  258. data/app/assets/stylesheets/lcms/engine/components/_related-instruction.scss +0 -31
  259. data/app/assets/stylesheets/lcms/engine/components/_resource.scss +0 -217
  260. data/app/assets/stylesheets/lcms/engine/components/_search-dropdown.scss +0 -23
  261. data/app/assets/stylesheets/lcms/engine/components/_search-header.scss +0 -45
  262. data/app/assets/stylesheets/lcms/engine/components/_search.scss +0 -57
  263. data/app/assets/stylesheets/lcms/engine/components/_sidebar.scss +0 -159
  264. data/app/assets/stylesheets/lcms/engine/components/_simple-tab.scss +0 -57
  265. data/app/assets/stylesheets/lcms/engine/components/_social-sharing.scss +0 -20
  266. data/app/assets/stylesheets/lcms/engine/components/_titles.scss +0 -33
  267. data/app/assets/stylesheets/lcms/engine/components/_top-scroll-button.scss +0 -28
  268. data/app/assets/stylesheets/lcms/engine/components/_unit-bundles.scss +0 -14
  269. data/app/assets/stylesheets/lcms/engine/components/cg/_annotations.scss +0 -48
  270. data/app/assets/stylesheets/lcms/engine/components/cg/_colorscheme.scss +0 -60
  271. data/app/assets/stylesheets/lcms/engine/components/cg/_contents-modal.scss +0 -20
  272. data/app/assets/stylesheets/lcms/engine/components/cg/_elements.scss +0 -11
  273. data/app/assets/stylesheets/lcms/engine/components/cg/_faq.scss +0 -35
  274. data/app/assets/stylesheets/lcms/engine/components/cg/_footnote.scss +0 -20
  275. data/app/assets/stylesheets/lcms/engine/components/cg/_hacks.scss +0 -11
  276. data/app/assets/stylesheets/lcms/engine/components/cg/_icons.scss +0 -30
  277. data/app/assets/stylesheets/lcms/engine/components/cg/_keywords.scss +0 -5
  278. data/app/assets/stylesheets/lcms/engine/components/cg/_links.scss +0 -3
  279. data/app/assets/stylesheets/lcms/engine/components/cg/_quotes.scss +0 -18
  280. data/app/assets/stylesheets/lcms/engine/components/cg/_standards.scss +0 -23
  281. data/app/assets/stylesheets/lcms/engine/components/cg/_table.scss +0 -50
  282. data/app/assets/stylesheets/lcms/engine/components/cg/_task.scss +0 -43
  283. data/app/assets/stylesheets/lcms/engine/components/cg/_video.scss +0 -10
  284. data/app/assets/stylesheets/lcms/engine/components/support/_helpdesk.scss +0 -25
  285. data/app/assets/stylesheets/lcms/engine/freshdesk/base/_colors.scss +0 -25
  286. data/app/assets/stylesheets/lcms/engine/freshdesk/base/_typography.scss +0 -19
  287. data/app/assets/stylesheets/lcms/engine/freshdesk/components/_block.scss +0 -5
  288. data/app/assets/stylesheets/lcms/engine/freshdesk/components/_buttons.scss +0 -5
  289. data/app/assets/stylesheets/lcms/engine/freshdesk/components/_help-center.scss +0 -59
  290. data/app/assets/stylesheets/lcms/engine/freshdesk/components/_tabs.scss +0 -33
  291. data/app/assets/stylesheets/lcms/engine/freshdesk/freshdesk.scss +0 -42
  292. data/app/assets/stylesheets/lcms/engine/freshdesk/layout/_footer.scss +0 -44
  293. data/app/assets/stylesheets/lcms/engine/freshdesk/layout/_header.scss +0 -49
  294. data/app/assets/stylesheets/lcms/engine/freshdesk/layout/_page.scss +0 -40
  295. data/app/assets/stylesheets/lcms/engine/freshdesk/layout/footer.liquid +0 -14
  296. data/app/assets/stylesheets/lcms/engine/freshdesk/layout/header.liquid +0 -41
  297. data/app/assets/stylesheets/lcms/engine/freshdesk/layout/page.liquid +0 -22
  298. data/app/assets/stylesheets/lcms/engine/freshdesk/pages/_portal-home.scss +0 -18
  299. data/app/assets/stylesheets/lcms/engine/freshdesk/pages/portal.home.liquid +0 -74
  300. data/app/assets/stylesheets/lcms/engine/freshdesk/themes/_settings.scss +0 -19
  301. data/app/assets/stylesheets/lcms/engine/freshdesk/utils/_breakpoint.scss +0 -288
  302. data/app/assets/stylesheets/lcms/engine/freshdesk/utils/_helpers.scss +0 -22
  303. data/app/assets/stylesheets/lcms/engine/freshdesk/utils/_unit.scss +0 -95
  304. data/app/assets/stylesheets/lcms/engine/freshdesk/utils/_value.scss +0 -138
  305. data/app/assets/stylesheets/lcms/engine/layout/_connect.scss +0 -63
  306. data/app/assets/stylesheets/lcms/engine/layout/_header-search-form.scss +0 -30
  307. data/app/assets/stylesheets/lcms/engine/layout/_sticky-header.scss +0 -179
  308. data/app/assets/stylesheets/lcms/engine/layout/_sticky-navigation.scss +0 -124
  309. data/app/assets/stylesheets/lcms/engine/layout/_subscribe.scss +0 -68
  310. data/app/assets/stylesheets/lcms/engine/pages/_about-people.scss +0 -115
  311. data/app/assets/stylesheets/lcms/engine/pages/_about.scss +0 -61
  312. data/app/assets/stylesheets/lcms/engine/pages/_content-guide.scss +0 -205
  313. data/app/assets/stylesheets/lcms/engine/pages/_enhance-instruction.scss +0 -19
  314. data/app/assets/stylesheets/lcms/engine/pages/_explore-curriculum.scss +0 -46
  315. data/app/assets/stylesheets/lcms/engine/pages/_find-lessons.scss +0 -1
  316. data/app/assets/stylesheets/lcms/engine/pages/_home.scss +0 -237
  317. data/app/assets/stylesheets/lcms/engine/pages/_leadership.scss +0 -263
  318. data/app/assets/stylesheets/lcms/engine/pages/_lesson-document.scss +0 -138
  319. data/app/assets/stylesheets/lcms/engine/pages/_unsupported.scss +0 -18
  320. data/app/assets/stylesheets/lcms/engine/print/_b64-fonts.scss.erb +0 -65
  321. data/app/assets/stylesheets/lcms/engine/print/_cg-base.scss +0 -4
  322. data/app/assets/stylesheets/lcms/engine/print/_hacks.scss +0 -6
  323. data/app/assets/stylesheets/lcms/engine/print/cg/_base-typography.scss +0 -21
  324. data/app/assets/stylesheets/lcms/engine/print/cg/_breaks.scss +0 -7
  325. data/app/assets/stylesheets/lcms/engine/print/cg/_elements-typography.scss +0 -14
  326. data/app/assets/stylesheets/lcms/engine/vendors/swiper.css +0 -547
  327. data/app/controllers/concerns/lcms/engine/analytics_tracking.rb +0 -51
  328. data/app/controllers/concerns/lcms/engine/heap_notifyable.rb +0 -20
  329. data/app/controllers/lcms/engine/admin/configurable_admin.rb +0 -56
  330. data/app/controllers/lcms/engine/admin/google_oauth2_controller.rb +0 -15
  331. data/app/controllers/lcms/engine/admin/pages_controller.rb +0 -54
  332. data/app/controllers/lcms/engine/analytics_exclusion_controller.rb +0 -14
  333. data/app/controllers/lcms/engine/downloads_controller.rb +0 -50
  334. data/app/controllers/lcms/engine/enhance_instruction_controller.rb +0 -18
  335. data/app/controllers/lcms/engine/explore_curriculum_controller.rb +0 -28
  336. data/app/controllers/lcms/engine/find_lessons_controller.rb +0 -15
  337. data/app/controllers/lcms/engine/pages_controller.rb +0 -26
  338. data/app/controllers/lcms/engine/search_controller.rb +0 -15
  339. data/app/controllers/lcms/engine/sessions_controller.rb +0 -19
  340. data/app/models/lcms/engine/page.rb +0 -13
  341. data/app/services/lcms/engine/generate_thumbnails.rb +0 -54
  342. data/app/services/lcms/engine/svg_social_thumbnail.rb +0 -223
  343. data/app/views/layouts/lcms/engine/ld_docx.html.erb +0 -16
  344. data/app/views/lcms/engine/admin/pages/_form.html.erb +0 -8
  345. data/app/views/lcms/engine/admin/pages/edit.html.erb +0 -9
  346. data/app/views/lcms/engine/admin/pages/index.html.erb +0 -25
  347. data/app/views/lcms/engine/admin/pages/new.html.erb +0 -5
  348. data/app/views/lcms/engine/documents/_helpdesk.html.erb +0 -9
  349. data/app/views/lcms/engine/pages/_about_people_staff.html.erb +0 -27
  350. data/app/views/lcms/engine/pages/_leadership_in_action.html.erb +0 -25
  351. data/app/views/lcms/engine/pages/_leadership_why_i_lead.html.erb +0 -34
  352. data/app/views/lcms/engine/pages/about.html.erb +0 -87
  353. data/app/views/lcms/engine/pages/about_people.html.erb +0 -27
  354. data/app/views/lcms/engine/pages/forthcoming.html.erb +0 -9
  355. data/app/views/lcms/engine/pages/leadership.html.erb +0 -82
  356. data/app/views/lcms/engine/pages/not_found.html.erb +0 -9
  357. data/app/views/lcms/engine/pages/privacy.html.erb +0 -9
  358. data/app/views/lcms/engine/pages/show.html.erb +0 -8
  359. data/app/views/lcms/engine/pages/show_slug.html.erb +0 -0
  360. data/app/views/lcms/engine/pages/tos.html.erb +0 -9
  361. data/app/views/lcms/engine/shared/_connect.html.erb +0 -60
  362. data/app/views/lcms/engine/shared/_freshdesk.html.erb +0 -22
  363. data/app/views/lcms/engine/shared/_google_analytics.html.erb +0 -9
  364. data/app/views/lcms/engine/shared/_heap_analytics.html.erb +0 -7
  365. data/app/views/lcms/engine/shared/_open_graph_meta.html.erb +0 -15
  366. data/app/views/lcms/engine/shared/_open_graph_meta_js.html.erb +0 -39
  367. data/app/views/lcms/engine/shared/_search_form.html.erb +0 -10
  368. data/app/views/lcms/engine/shared/_social_sharing_menu.html.erb +0 -34
  369. data/app/views/lcms/engine/shared/_subscribe.html.erb +0 -30
  370. data/app/views/lcms/engine/shared/_unsupported.html.erb +0 -3
  371. data/app/views/lcms/engine/shared/social_thumbnail.svg.erb +0 -54
  372. data/config/initializers/heap.rb +0 -3
  373. data/lib/tasks/thumbnails.rake +0 -59
  374. data/spec/controllers/admin/pages_controller_spec.rb +0 -19
  375. data/spec/controllers/enhance_instruction_controller_spec.rb +0 -15
  376. data/spec/controllers/explore_curriculum_controller_spec.rb +0 -29
  377. data/spec/controllers/find_lessons_controller_spec.rb +0 -50
  378. data/spec/controllers/pages_controller_spec.rb +0 -32
  379. data/spec/controllers/search_controller_spec.rb +0 -16
  380. data/spec/factories/pages.rb +0 -21
  381. data/spec/features/admin/pages_spec.rb +0 -79
  382. data/spec/features/pages/page_not_found_spec.rb +0 -26
  383. data/spec/features/pages/page_titles_spec.rb +0 -86
  384. data/spec/support/heap.rb +0 -3
  385. data/vendor/assets/javascripts/foundation.initialize.js +0 -115
  386. data/vendor/assets/javascripts/foundation.magellanex.js +0 -335
  387. data/vendor/assets/javascripts/freshwidget.js +0 -1
  388. data/vendor/assets/javascripts/jquery.easytabs.js +0 -704
  389. data/vendor/assets/javascripts/jquery.hashchange.js +0 -9
  390. data/vendor/assets/javascripts/modernizr-custom.js +0 -3
  391. data/vendor/assets/javascripts/smoothscrolling.js +0 -22
  392. data/vendor/assets/javascripts/swiper.jquery.js +0 -3777
  393. data/vendor/assets/javascripts/tabs.js +0 -6
@@ -1 +0,0 @@
1
- !function(){function t(t){try{return t()}catch(e){window.console&&window.console.log&&window.console.log.apply&&window.console.log("Freshdesk Error: ",e)}}function e(t){return t&&!x.test(t)?$.location.protocol+"//"+t:t}function n(t){var e=$.createElement("link");e.setAttribute("rel","stylesheet"),e.setAttribute("type","text/css"),e.setAttribute("href",t),"undefined"!=typeof e&&$.getElementsByTagName("head")[0].appendChild(e)}function i(t){var e=$.createElement("script");e.setAttribute("type","text/javascript"),e.setAttribute("src",t),"undefined"!=typeof e&&$.getElementsByTagName("head")[0].appendChild(e)}function o(t,e,n){t&&t.addEventListener?t.addEventListener(e,n,!1):t&&t.attachEvent&&t.attachEvent("on"+e,n)}function r(t){var n;for(n in t)B.hasOwnProperty(n)&&("url"===n||"assetUrl"===n?B[n]=e(t[n]):B[n]=t[n])}function a(t){var e=t.src,n=window.navigator&&window.navigator.appVersion.split("MSIE"),i=parseFloat(n[1]);return i>=5.5&&7>i&&$.body.filters&&(t.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+e+"', sizingMethod='crop')"),t}function d(){null==$widget_attr.button&&"popup"==B.widgetType&&(class_name=k[B.alignment]||"left",$widget_attr.button=$.createElement("div"),$widget_attr.button.setAttribute("id","freshwidget-button"),$widget_attr.button.setAttribute("data-html2canvas-ignore","true"),$widget_attr.button.style.display="none",$widget_attr.button.className="freshwidget-button fd-btn-"+class_name,I.Version()<=10&&($widget_attr.button.className+=" ie"+I.Version()),link=$.createElement("a"),link.setAttribute("href","javascript:void(0)"),text=null,proxyLink=$.createElement("a"),proxyLink.setAttribute("href","javascript:void(0)"),null==B.backgroundImage||""==B.backgroundImage||"text"==B.buttonType?(link.className="freshwidget-theme",link.style.color=B.buttonColor,link.style.backgroundColor=B.buttonBg,link.style.borderColor=B.buttonColor,proxyLink.className="proxy-link",text=$.createTextNode(B.buttonText)):(link.className="freshwidget-customimage",text=$.createElement("img"),text.src=B.backgroundImage,text.alt=B.buttonText,text=a(text)),"top"==class_name||"bottom"==class_name?$widget_attr.button.style.left=B.offset:$widget_attr.button.style.top=B.offset,$.body.insertBefore($widget_attr.button,$.body.childNodes[0]),$widget_attr.button.appendChild(link),link.appendChild(text),(null==B.backgroundImage||""==B.backgroundImage)&&I.Version()<=10&&($widget_attr.button.appendChild(proxyLink),o(proxyLink,"click",function(){window.FreshWidget.show()}),proxyLink.style.height=link.offsetHeight+"px",proxyLink.style.width=link.offsetWidth+"px"),o(link,"click",function(){window.FreshWidget.show()}))}function s(){null!=$widget_attr.button&&($.body.removeChild($widget_attr.button),$widget_attr.button=null)}function l(){null!=$widget_attr.container&&($.body.removeChild($widget_attr.container),$widget_attr.container=null)}function c(){null==$widget_attr.container&&($widget_attr.container=$.createElement("div"),$widget_attr.container.className="freshwidget-container",$widget_attr.container.id="FreshWidget",""==B.responsive&&($widget_attr.container.className+=" responsive"),$widget_attr.container.setAttribute("data-html2canvas-ignore","true"),$widget_attr.container.style.display="none",$.body.insertBefore($widget_attr.container,$.body.childNodes[0]),$widget_attr.container.innerHTML='<div class="widget-ovelay" id="freshwidget-overlay">&nbsp;</div><div class="freshwidget-dialog" id="freshwidget-dialog"> <img alt="Close Feedback Form" id="freshwidget-close" class="widget-close" src="'+B.assetUrl+"/widget_close.png?ver="+E+'" /><div class="mobile-widget-close" id="mobile-widget-close"></div> <div class="frame-container"> <iframe title="Feedback Form" id="freshwidget-frame" src="about:blank" frameborder="0" scrolling="auto" allowTransparency="true" style="height: '+B.formHeight+'"/> </div>',$widget_attr.container=$.getElementById("FreshWidget"),$widget_attr.closeButton=$.getElementById("freshwidget-close"),$widget_attr.closeButton=a($widget_attr.closeButton),$widget_attr.mobileCloseButton=$.getElementById("mobile-widget-close"),$widget_attr.dialog=$.getElementById("freshwidget-dialog"),$widget_attr.iframe=$.getElementById("freshwidget-frame"),$widget_attr.overlay=$.getElementById("freshwidget-overlay"),$widget_attr.dialog.appendChild($widget_attr.iframe),g(),o($widget_attr.closeButton,"click",function(){window.FreshWidget.close()}),o($widget_attr.mobileCloseButton,"click",function(){window.FreshWidget.close()}),o($widget_attr.overlay,"click",function(){window.FreshWidget.close()}),o($widget_attr.iframe,"load",function(){$widget_attr.iframeLoaded||-1==$widget_attr.iframe.src.indexOf("/widgets/feedback_widget/new?")||($widget_attr.iframeLoaded=!0)}),y())}function g(){$widget_attr.iframe.src=B.url+"/loading.html?ver="+E}function u(){$widget_attr.iframe.src=B.url+"/widgets/feedback_widget/new?"+B.queryString}function w(){scroll(0,0),$widget_attr.container.style.display="block",B.responsive||(v=$.body.style.overflow,$.body.style.overflow="hidden"),$widget_attr.iframeLoaded||u()}function f(){$widget_attr.container.style.display="none",B.responsive||($.body.style.overflow=v||"auto"),u()}function m(t){switch(r(t),I.Version()>8&&"undefined"==typeof html2canvas&&""==B.screenshot&&i(B.assetUrl+"/html2canvas.js?ver="+E),B.loadOnEvent){case"windowLoad":o(window,"load",p);break;case"documentReady":o($,"ready",p);break;case"immediate":p()}n(B.assetUrl+"/freshwidget.css?ver="+E)}function p(){d(),c()}function h(t){r(t),s(),l(),$widget_attr.iframeLoaded=!1,d(),c()}function b(){s(),l(),delete window.FreshWidget}function y(){o(window,"message",function(t){var e=t.data;"screenshot"==e&&_(t)})}function _(t){I.Version()>8&&""==B.screenshot&&(html2canvas([$.body],{proxy:!1,onrendered:function(t){var e=t.toDataURL(),n={type:"screenshot",img:e};$.getElementById("freshwidget-frame").contentWindow.postMessage(n,"*")}}),t.stopImmediatePropagation())}var v,$=window.document,k={1:"top",2:"right",3:"bottom",4:"left",top:"top",right:"right",bottom:"bottom",left:"left"},x=/^[a-zA-Z]+:\/\//,E=2,B={widgetId:0,buttonText:"Support",buttonBg:"#7eb600",buttonColor:"white",backgroundImage:null,alignment:"left",offset:"35%",url:"http://support.freshdesk.com",assetUrl:"https://s3.amazonaws.com/assets.freshdesk.com/widget",queryString:"",screenshot:"",formHeight:"500px",responsive:"",widgetType:"popup",buttonType:"text",captcha:"",loadOnEvent:"windowLoad"};$widget_attr={button:null,dialog:null,container:null,overlay:null,iframe:null,iframeLoaded:!1,closeButton:null,mobileCloseButton:null};var I={Version:function(){var t=999;return-1!=navigator.appVersion.indexOf("MSIE")&&(t=parseFloat(navigator.appVersion.split("MSIE")[1])),t}},L={init:function(e,n){t(function(){return m(n)})},create:function(){t(function(){return p()})},show:function(){t(function(){return w()})},close:function(){t(function(){return f()})},iframe:function(){return $widget_attr.iframe},update:function(e){t(function(){return h(e)})},destroy:function(){t(function(){return b()})}};window.FreshWidget||(window.FreshWidget=L)}();
@@ -1,704 +0,0 @@
1
- /*
2
- * jQuery EasyTabs plugin 3.2.0
3
- *
4
- * Copyright (c) 2010-2011 Steve Schwartz (JangoSteve)
5
- *
6
- * Dual licensed under the MIT and GPL licenses:
7
- * http://www.opensource.org/licenses/mit-license.php
8
- * http://www.gnu.org/licenses/gpl.html
9
- *
10
- * Date: Thu May 09 17:30:00 2013 -0500
11
- */
12
- ( function($) {
13
-
14
- $.easytabs = function(container, options) {
15
-
16
- // Attach to plugin anything that should be available via
17
- // the $container.data('easytabs') object
18
- var plugin = this,
19
- $container = $(container),
20
-
21
- defaults = {
22
- animate: true,
23
- panelActiveClass: "active",
24
- tabActiveClass: "active",
25
- defaultTab: "li:first-child",
26
- animationSpeed: "normal",
27
- tabs: "> ul > li",
28
- updateHash: true,
29
- cycle: false,
30
- collapsible: false,
31
- collapsedClass: "collapsed",
32
- collapsedByDefault: true,
33
- uiTabs: false,
34
- transitionIn: 'fadeIn',
35
- transitionOut: 'fadeOut',
36
- transitionInEasing: 'swing',
37
- transitionOutEasing: 'swing',
38
- transitionCollapse: 'slideUp',
39
- transitionUncollapse: 'slideDown',
40
- transitionCollapseEasing: 'swing',
41
- transitionUncollapseEasing: 'swing',
42
- containerClass: "",
43
- tabsClass: "",
44
- tabClass: "",
45
- panelClass: "",
46
- cache: true,
47
- event: 'click',
48
- panelContext: $container
49
- },
50
-
51
- // Internal instance variables
52
- // (not available via easytabs object)
53
- $defaultTab,
54
- $defaultTabLink,
55
- transitions,
56
- lastHash,
57
- skipUpdateToHash,
58
- animationSpeeds = {
59
- fast: 200,
60
- normal: 400,
61
- slow: 600
62
- },
63
-
64
- // Shorthand variable so that we don't need to call
65
- // plugin.settings throughout the plugin code
66
- settings;
67
-
68
- // =============================================================
69
- // Functions available via easytabs object
70
- // =============================================================
71
-
72
- plugin.init = function() {
73
-
74
- plugin.settings = settings = $.extend({}, defaults, options);
75
- settings.bind_str = settings.event+".easytabs";
76
-
77
- // Add jQuery UI's crazy class names to markup,
78
- // so that markup will match theme CSS
79
- if ( settings.uiTabs ) {
80
- settings.tabActiveClass = 'ui-tabs-selected';
81
- settings.containerClass = 'ui-tabs ui-widget ui-widget-content ui-corner-all';
82
- settings.tabsClass = 'ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all';
83
- settings.tabClass = 'ui-state-default ui-corner-top';
84
- settings.panelClass = 'ui-tabs-panel ui-widget-content ui-corner-bottom';
85
- }
86
-
87
- // If collapsible is true and defaultTab specified, assume user wants defaultTab showing (not collapsed)
88
- if ( settings.collapsible && options.defaultTab !== undefined && options.collpasedByDefault === undefined ) {
89
- settings.collapsedByDefault = false;
90
- }
91
-
92
- // Convert 'normal', 'fast', and 'slow' animation speed settings to their respective speed in milliseconds
93
- if ( typeof(settings.animationSpeed) === 'string' ) {
94
- settings.animationSpeed = animationSpeeds[settings.animationSpeed];
95
- }
96
-
97
- $('a.anchor').remove().prependTo('body');
98
-
99
- // Store easytabs object on container so we can easily set
100
- // properties throughout
101
- $container.data('easytabs', {});
102
-
103
- plugin.setTransitions();
104
-
105
- plugin.getTabs();
106
-
107
- addClasses();
108
-
109
- setDefaultTab();
110
-
111
- bindToTabClicks();
112
-
113
- initHashChange();
114
-
115
- initCycle();
116
-
117
- // Append data-easytabs HTML attribute to make easy to query for
118
- // easytabs instances via CSS pseudo-selector
119
- $container.attr('data-easytabs', true);
120
- };
121
-
122
- // Set transitions for switching between tabs based on options.
123
- // Could be used to update transitions if settings are changes.
124
- plugin.setTransitions = function() {
125
- transitions = ( settings.animate ) ? {
126
- show: settings.transitionIn,
127
- hide: settings.transitionOut,
128
- speed: settings.animationSpeed,
129
- collapse: settings.transitionCollapse,
130
- uncollapse: settings.transitionUncollapse,
131
- halfSpeed: settings.animationSpeed / 2
132
- } :
133
- {
134
- show: "show",
135
- hide: "hide",
136
- speed: 0,
137
- collapse: "hide",
138
- uncollapse: "show",
139
- halfSpeed: 0
140
- };
141
- };
142
-
143
- // Find and instantiate tabs and panels.
144
- // Could be used to reset tab and panel collection if markup is
145
- // modified.
146
- plugin.getTabs = function() {
147
- var $matchingPanel;
148
-
149
- // Find the initial set of elements matching the setting.tabs
150
- // CSS selector within the container
151
- plugin.tabs = $container.find(settings.tabs),
152
-
153
- // Instantiate panels as empty jquery object
154
- plugin.panels = $(),
155
-
156
- plugin.tabs.each(function(){
157
- var $tab = $(this),
158
- $a = $tab.children('a'),
159
-
160
- // targetId is the ID of the panel, which is either the
161
- // `href` attribute for non-ajax tabs, or in the
162
- // `data-target` attribute for ajax tabs since the `href` is
163
- // the ajax URL
164
- targetId = $tab.children('a').data('target');
165
-
166
- $tab.data('easytabs', {});
167
-
168
- // If the tab has a `data-target` attribute, and is thus an ajax tab
169
- if ( targetId !== undefined && targetId !== null ) {
170
- $tab.data('easytabs').ajax = $a.attr('href');
171
- } else {
172
- targetId = $a.attr('href');
173
- }
174
- targetId = targetId.match(/#([^\?]+)/)[1];
175
-
176
- $matchingPanel = settings.panelContext.find("#" + targetId);
177
-
178
- // If tab has a matching panel, add it to panels
179
- if ( $matchingPanel.length ) {
180
-
181
- // Store panel height before hiding
182
- $matchingPanel.data('easytabs', {
183
- position: $matchingPanel.css('position'),
184
- visibility: $matchingPanel.css('visibility')
185
- });
186
-
187
- // Don't hide panel if it's active (allows `getTabs` to be called manually to re-instantiate tab collection)
188
- $matchingPanel.not(settings.panelActiveClass).hide();
189
-
190
- plugin.panels = plugin.panels.add($matchingPanel);
191
-
192
- $tab.data('easytabs').panel = $matchingPanel;
193
-
194
- // Otherwise, remove tab from tabs collection
195
- } else {
196
- plugin.tabs = plugin.tabs.not($tab);
197
- if ('console' in window) {
198
- console.warn('Warning: tab without matching panel for selector \'#' + targetId +'\' removed from set');
199
- }
200
- }
201
- });
202
- };
203
-
204
- // Select tab and fire callback
205
- plugin.selectTab = function($clicked, callback) {
206
- var url = window.location,
207
- hash = url.hash.match(/^[^\?]*/)[0],
208
- $targetPanel = $clicked.parent().data('easytabs').panel,
209
- ajaxUrl = $clicked.parent().data('easytabs').ajax;
210
-
211
- // Tab is collapsible and active => toggle collapsed state
212
- if( settings.collapsible && ! skipUpdateToHash && ($clicked.hasClass(settings.tabActiveClass) || $clicked.hasClass(settings.collapsedClass)) ) {
213
- plugin.toggleTabCollapse($clicked, $targetPanel, ajaxUrl, callback);
214
-
215
- // Tab is not active and panel is not active => select tab
216
- } else if( ! $clicked.hasClass(settings.tabActiveClass) || ! $targetPanel.hasClass(settings.panelActiveClass) ){
217
- activateTab($clicked, $targetPanel, ajaxUrl, callback);
218
-
219
- // Cache is disabled => reload (e.g reload an ajax tab).
220
- } else if ( ! settings.cache ){
221
- activateTab($clicked, $targetPanel, ajaxUrl, callback);
222
- }
223
-
224
- };
225
-
226
- // Toggle tab collapsed state and fire callback
227
- plugin.toggleTabCollapse = function($clicked, $targetPanel, ajaxUrl, callback) {
228
- plugin.panels.stop(true,true);
229
-
230
- if( fire($container,"easytabs:before", [$clicked, $targetPanel, settings]) ){
231
- plugin.tabs.filter("." + settings.tabActiveClass).removeClass(settings.tabActiveClass).children().removeClass(settings.tabActiveClass);
232
-
233
- // If panel is collapsed, uncollapse it
234
- if( $clicked.hasClass(settings.collapsedClass) ){
235
-
236
- // If ajax panel and not already cached
237
- if( ajaxUrl && (!settings.cache || !$clicked.parent().data('easytabs').cached) ) {
238
- $container.trigger('easytabs:ajax:beforeSend', [$clicked, $targetPanel]);
239
-
240
- $targetPanel.load(ajaxUrl, function(response, status, xhr){
241
- $clicked.parent().data('easytabs').cached = true;
242
- $container.trigger('easytabs:ajax:complete', [$clicked, $targetPanel, response, status, xhr]);
243
- });
244
- }
245
-
246
- // Update CSS classes of tab and panel
247
- $clicked.parent()
248
- .removeClass(settings.collapsedClass)
249
- .addClass(settings.tabActiveClass)
250
- .children()
251
- .removeClass(settings.collapsedClass)
252
- .addClass(settings.tabActiveClass);
253
-
254
- $targetPanel
255
- .addClass(settings.panelActiveClass)
256
- [transitions.uncollapse](transitions.speed, settings.transitionUncollapseEasing, function(){
257
- $container.trigger('easytabs:midTransition', [$clicked, $targetPanel, settings]);
258
- if(typeof callback == 'function') callback();
259
- });
260
-
261
- // Otherwise, collapse it
262
- } else {
263
-
264
- // Update CSS classes of tab and panel
265
- $clicked.addClass(settings.collapsedClass)
266
- .parent()
267
- .addClass(settings.collapsedClass);
268
-
269
- $targetPanel
270
- .removeClass(settings.panelActiveClass)
271
- [transitions.collapse](transitions.speed, settings.transitionCollapseEasing, function(){
272
- $container.trigger("easytabs:midTransition", [$clicked, $targetPanel, settings]);
273
- if(typeof callback == 'function') callback();
274
- });
275
- }
276
- }
277
- };
278
-
279
-
280
- // Find tab with target panel matching value
281
- plugin.matchTab = function(hash) {
282
- return plugin.tabs.find("[href='" + hash + "'],[data-target='" + hash + "']").first();
283
- };
284
-
285
- // Find panel with `id` matching value
286
- plugin.matchInPanel = function(hash) {
287
- return ( hash && plugin.validId(hash) ? plugin.panels.filter(':has(' + hash + ')').first() : [] );
288
- };
289
-
290
- // Make sure hash is a valid id value (admittedly strict in that HTML5 allows almost anything without a space)
291
- // but jQuery has issues with such id values anyway, so we can afford to be strict here.
292
- plugin.validId = function(id) {
293
- return id.substr(1).match(/^[A-Za-z]+[A-Za-z0-9\-_:\.].$/);
294
- };
295
-
296
- // Select matching tab when URL hash changes
297
- plugin.selectTabFromHashChange = function() {
298
- var hash = window.location.hash.match(/^[^\?]*/)[0],
299
- $tab = plugin.matchTab(hash),
300
- $panel;
301
-
302
- if ( settings.updateHash ) {
303
-
304
- // If hash directly matches tab
305
- if( $tab.length ){
306
- skipUpdateToHash = true;
307
- plugin.selectTab( $tab );
308
-
309
- } else {
310
- $panel = plugin.matchInPanel(hash);
311
-
312
- // If panel contains element matching hash
313
- if ( $panel.length ) {
314
- hash = '#' + $panel.attr('id');
315
- $tab = plugin.matchTab(hash);
316
- skipUpdateToHash = true;
317
- plugin.selectTab( $tab );
318
-
319
- // If default tab is not active...
320
- } else if ( ! $defaultTab.hasClass(settings.tabActiveClass) && ! settings.cycle ) {
321
-
322
- // ...and hash is blank or matches a parent of the tab container or
323
- // if the last tab (before the hash updated) was one of the other tabs in this container.
324
- if ( hash === '' || plugin.matchTab(lastHash).length || $container.closest(hash).length ) {
325
- skipUpdateToHash = true;
326
- plugin.selectTab( $defaultTabLink );
327
- }
328
- }
329
- }
330
- }
331
- };
332
-
333
- // Cycle through tabs
334
- plugin.cycleTabs = function(tabNumber){
335
- if(settings.cycle){
336
- tabNumber = tabNumber % plugin.tabs.length;
337
- $tab = $( plugin.tabs[tabNumber] ).children("a").first();
338
- skipUpdateToHash = true;
339
- plugin.selectTab( $tab, function() {
340
- setTimeout(function(){ plugin.cycleTabs(tabNumber + 1); }, settings.cycle);
341
- });
342
- }
343
- };
344
-
345
- // Convenient public methods
346
- plugin.publicMethods = {
347
- select: function(tabSelector){
348
- var $tab;
349
-
350
- // Find tab container that matches selector (like 'li#tab-one' which contains tab link)
351
- if ( ($tab = plugin.tabs.filter(tabSelector)).length === 0 ) {
352
-
353
- // Find direct tab link that matches href (like 'a[href="#panel-1"]')
354
- if ( ($tab = plugin.tabs.find("a[href='" + tabSelector + "']")).length === 0 ) {
355
-
356
- // Find direct tab link that matches selector (like 'a#tab-1')
357
- if ( ($tab = plugin.tabs.find("a" + tabSelector)).length === 0 ) {
358
-
359
- // Find direct tab link that matches data-target (lik 'a[data-target="#panel-1"]')
360
- if ( ($tab = plugin.tabs.find("[data-target='" + tabSelector + "']")).length === 0 ) {
361
-
362
- // Find direct tab link that ends in the matching href (like 'a[href$="#panel-1"]', which would also match http://example.com/currentpage/#panel-1)
363
- if ( ($tab = plugin.tabs.find("a[href$='" + tabSelector + "']")).length === 0 ) {
364
-
365
- $.error('Tab \'' + tabSelector + '\' does not exist in tab set');
366
- }
367
- }
368
- }
369
- }
370
- } else {
371
- // Select the child tab link, since the first option finds the tab container (like <li>)
372
- $tab = $tab.children("a").first();
373
- }
374
- plugin.selectTab($tab);
375
- }
376
- };
377
-
378
- // =============================================================
379
- // Private functions
380
- // =============================================================
381
-
382
- // Triggers an event on an element and returns the event result
383
- var fire = function(obj, name, data) {
384
- var event = $.Event(name);
385
- obj.trigger(event, data);
386
- return event.result !== false;
387
- }
388
-
389
- // Add CSS classes to markup (if specified), called by init
390
- var addClasses = function() {
391
- $container.addClass(settings.containerClass);
392
- plugin.tabs.parent().addClass(settings.tabsClass);
393
- plugin.tabs.addClass(settings.tabClass);
394
- plugin.panels.addClass(settings.panelClass);
395
- };
396
-
397
- // Set the default tab, whether from hash (bookmarked) or option,
398
- // called by init
399
- var setDefaultTab = function(){
400
- var hash = window.location.hash.match(/^[^\?]*/)[0],
401
- $selectedTab = plugin.matchTab(hash).parent(),
402
- $panel;
403
-
404
- // If hash directly matches one of the tabs, active on page-load
405
- if( $selectedTab.length === 1 ){
406
- $defaultTab = $selectedTab;
407
- settings.cycle = false;
408
-
409
- } else {
410
- $panel = plugin.matchInPanel(hash);
411
-
412
- // If one of the panels contains the element matching the hash,
413
- // make it active on page-load
414
- if ( $panel.length ) {
415
- hash = '#' + $panel.attr('id');
416
- $defaultTab = plugin.matchTab(hash).parent();
417
-
418
- // Otherwise, make the default tab the one that's active on page-load
419
- } else {
420
- $defaultTab = plugin.tabs.parent().find(settings.defaultTab);
421
- if ( $defaultTab.length === 0 ) {
422
- $.error("The specified default tab ('" + settings.defaultTab + "') could not be found in the tab set ('" + settings.tabs + "') out of " + plugin.tabs.length + " tabs.");
423
- }
424
- }
425
- }
426
-
427
- $defaultTabLink = $defaultTab.children("a").first();
428
-
429
- activateDefaultTab($selectedTab);
430
- };
431
-
432
- // Activate defaultTab (or collapse by default), called by setDefaultTab
433
- var activateDefaultTab = function($selectedTab) {
434
- var defaultPanel,
435
- defaultAjaxUrl;
436
-
437
- if ( settings.collapsible && $selectedTab.length === 0 && settings.collapsedByDefault ) {
438
- $defaultTab
439
- .addClass(settings.collapsedClass)
440
- .children()
441
- .addClass(settings.collapsedClass);
442
-
443
- } else {
444
-
445
- defaultPanel = $( $defaultTab.data('easytabs').panel );
446
- defaultAjaxUrl = $defaultTab.data('easytabs').ajax;
447
-
448
- if ( defaultAjaxUrl && (!settings.cache || !$defaultTab.data('easytabs').cached) ) {
449
- $container.trigger('easytabs:ajax:beforeSend', [$defaultTabLink, defaultPanel]);
450
- defaultPanel.load(defaultAjaxUrl, function(response, status, xhr){
451
- $defaultTab.data('easytabs').cached = true;
452
- $container.trigger('easytabs:ajax:complete', [$defaultTabLink, defaultPanel, response, status, xhr]);
453
- });
454
- }
455
-
456
- $defaultTab.data('easytabs').panel
457
- .show()
458
- .addClass(settings.panelActiveClass);
459
-
460
- $defaultTab
461
- .addClass(settings.tabActiveClass)
462
- .children()
463
- .addClass(settings.tabActiveClass);
464
- }
465
-
466
- // Fire event when the plugin is initialised
467
- $container.trigger("easytabs:initialised", [$defaultTabLink, defaultPanel]);
468
- };
469
-
470
- // Bind tab-select funtionality to namespaced click event, called by
471
- // init
472
- var bindToTabClicks = function() {
473
- plugin.tabs.children("a").bind(settings.bind_str, function(e) {
474
-
475
- // Stop cycling when a tab is clicked
476
- settings.cycle = false;
477
-
478
- // Hash will be updated when tab is clicked,
479
- // don't cause tab to re-select when hash-change event is fired
480
- skipUpdateToHash = false;
481
-
482
- // Select the panel for the clicked tab
483
- plugin.selectTab( $(this) );
484
-
485
- // Don't follow the link to the anchor
486
- e.preventDefault ? e.preventDefault() : e.returnValue = false;
487
- });
488
- };
489
-
490
- // Activate a given tab/panel, called from plugin.selectTab:
491
- //
492
- // * fire `easytabs:before` hook
493
- // * get ajax if new tab is an uncached ajax tab
494
- // * animate out previously-active panel
495
- // * fire `easytabs:midTransition` hook
496
- // * update URL hash
497
- // * animate in newly-active panel
498
- // * update CSS classes for inactive and active tabs/panels
499
- //
500
- // TODO: This could probably be broken out into many more modular
501
- // functions
502
- var activateTab = function($clicked, $targetPanel, ajaxUrl, callback) {
503
- plugin.panels.stop(true,true);
504
-
505
- if( fire($container,"easytabs:before", [$clicked, $targetPanel, settings]) ){
506
- var $visiblePanel = plugin.panels.filter(":visible"),
507
- $panelContainer = $targetPanel.parent(),
508
- targetHeight,
509
- visibleHeight,
510
- heightDifference,
511
- showPanel,
512
- hash = window.location.hash.match(/^[^\?]*/)[0];
513
-
514
- if (settings.animate) {
515
- targetHeight = getHeightForHidden($targetPanel);
516
- visibleHeight = $visiblePanel.length ? setAndReturnHeight($visiblePanel) : 0;
517
- heightDifference = targetHeight - visibleHeight;
518
- }
519
-
520
- // Set lastHash to help indicate if defaultTab should be
521
- // activated across multiple tab instances.
522
- lastHash = hash;
523
-
524
- // TODO: Move this function elsewhere
525
- showPanel = function() {
526
- // At this point, the previous panel is hidden, and the new one will be selected
527
- $container.trigger("easytabs:midTransition", [$clicked, $targetPanel, settings]);
528
-
529
- // Gracefully animate between panels of differing heights, start height change animation *after* panel change if panel needs to contract,
530
- // so that there is no chance of making the visible panel overflowing the height of the target panel
531
- if (settings.animate && settings.transitionIn == 'fadeIn') {
532
- if (heightDifference < 0)
533
- $panelContainer.animate({
534
- height: $panelContainer.height() + heightDifference
535
- }, transitions.halfSpeed ).css({ 'min-height': '' });
536
- }
537
-
538
- if ( settings.updateHash && ! skipUpdateToHash ) {
539
- //window.location = url.toString().replace((url.pathname + hash), (url.pathname + $clicked.attr("href")));
540
- // Not sure why this behaves so differently, but it's more straight forward and seems to have less side-effects
541
- window.location.hash = '#' + $targetPanel.attr('id');
542
- } else {
543
- skipUpdateToHash = false;
544
- }
545
-
546
- $targetPanel
547
- [transitions.show](transitions.speed, settings.transitionInEasing, function(){
548
- $panelContainer.css({height: '', 'min-height': ''}); // After the transition, unset the height
549
- $container.trigger("easytabs:after", [$clicked, $targetPanel, settings]);
550
- // callback only gets called if selectTab actually does something, since it's inside the if block
551
- if(typeof callback == 'function'){
552
- callback();
553
- }
554
- });
555
- };
556
-
557
- if ( ajaxUrl && (!settings.cache || !$clicked.parent().data('easytabs').cached) ) {
558
- $container.trigger('easytabs:ajax:beforeSend', [$clicked, $targetPanel]);
559
- $targetPanel.load(ajaxUrl, function(response, status, xhr){
560
- $clicked.parent().data('easytabs').cached = true;
561
- $container.trigger('easytabs:ajax:complete', [$clicked, $targetPanel, response, status, xhr]);
562
- });
563
- }
564
-
565
- // Gracefully animate between panels of differing heights, start height change animation *before* panel change if panel needs to expand,
566
- // so that there is no chance of making the target panel overflowing the height of the visible panel
567
- if( settings.animate && settings.transitionOut == 'fadeOut' ) {
568
- if( heightDifference > 0 ) {
569
- $panelContainer.animate({
570
- height: ( $panelContainer.height() + heightDifference )
571
- }, transitions.halfSpeed );
572
- } else {
573
- // Prevent height jumping before height transition is triggered at midTransition
574
- $panelContainer.css({ 'min-height': $panelContainer.height() });
575
- }
576
- }
577
-
578
- // Change the active tab *first* to provide immediate feedback when the user clicks
579
- plugin.tabs.filter("." + settings.tabActiveClass).removeClass(settings.tabActiveClass).children().removeClass(settings.tabActiveClass);
580
- plugin.tabs.filter("." + settings.collapsedClass).removeClass(settings.collapsedClass).children().removeClass(settings.collapsedClass);
581
- $clicked.parent().addClass(settings.tabActiveClass).children().addClass(settings.tabActiveClass);
582
-
583
- plugin.panels.filter("." + settings.panelActiveClass).removeClass(settings.panelActiveClass);
584
- $targetPanel.addClass(settings.panelActiveClass);
585
-
586
- if( $visiblePanel.length ) {
587
- $visiblePanel
588
- [transitions.hide](transitions.speed, settings.transitionOutEasing, showPanel);
589
- } else {
590
- $targetPanel
591
- [transitions.uncollapse](transitions.speed, settings.transitionUncollapseEasing, showPanel);
592
- }
593
- }
594
- };
595
-
596
- // Get heights of panels to enable animation between panels of
597
- // differing heights, called by activateTab
598
- var getHeightForHidden = function($targetPanel){
599
-
600
- if ( $targetPanel.data('easytabs') && $targetPanel.data('easytabs').lastHeight ) {
601
- return $targetPanel.data('easytabs').lastHeight;
602
- }
603
-
604
- // this is the only property easytabs changes, so we need to grab its value on each tab change
605
- var display = $targetPanel.css('display'),
606
- outerCloak,
607
- height;
608
-
609
- // Workaround with wrapping height, because firefox returns wrong
610
- // height if element itself has absolute positioning.
611
- // but try/catch block needed for IE7 and IE8 because they throw
612
- // an "Unspecified error" when trying to create an element
613
- // with the css position set.
614
- try {
615
- outerCloak = $('<div></div>', {'position': 'absolute', 'visibility': 'hidden', 'overflow': 'hidden'});
616
- } catch (e) {
617
- outerCloak = $('<div></div>', {'visibility': 'hidden', 'overflow': 'hidden'});
618
- }
619
- height = $targetPanel
620
- .wrap(outerCloak)
621
- .css({'position':'relative','visibility':'hidden','display':'block'})
622
- .outerHeight();
623
-
624
- $targetPanel.unwrap();
625
-
626
- // Return element to previous state
627
- $targetPanel.css({
628
- position: $targetPanel.data('easytabs').position,
629
- visibility: $targetPanel.data('easytabs').visibility,
630
- display: display
631
- });
632
-
633
- // Cache height
634
- $targetPanel.data('easytabs').lastHeight = height;
635
-
636
- return height;
637
- };
638
-
639
- // Since the height of the visible panel may have been manipulated due to interaction,
640
- // we want to re-cache the visible height on each tab change, called
641
- // by activateTab
642
- var setAndReturnHeight = function($visiblePanel) {
643
- var height = $visiblePanel.outerHeight();
644
-
645
- if( $visiblePanel.data('easytabs') ) {
646
- $visiblePanel.data('easytabs').lastHeight = height;
647
- } else {
648
- $visiblePanel.data('easytabs', {lastHeight: height});
649
- }
650
- return height;
651
- };
652
-
653
- // Setup hash-change callback for forward- and back-button
654
- // functionality, called by init
655
- var initHashChange = function(){
656
-
657
- // enabling back-button with jquery.hashchange plugin
658
- // http://benalman.com/projects/jquery-hashchange-plugin/
659
- if(typeof $(window).hashchange === 'function'){
660
- $(window).hashchange( function(){
661
- plugin.selectTabFromHashChange();
662
- });
663
- } else if ($.address && typeof $.address.change === 'function') { // back-button with jquery.address plugin http://www.asual.com/jquery/address/docs/
664
- $.address.change( function(){
665
- plugin.selectTabFromHashChange();
666
- });
667
- }
668
- };
669
-
670
- // Begin cycling if set in options, called by init
671
- var initCycle = function(){
672
- var tabNumber;
673
- if (settings.cycle) {
674
- tabNumber = plugin.tabs.index($defaultTab);
675
- setTimeout( function(){ plugin.cycleTabs(tabNumber + 1); }, settings.cycle);
676
- }
677
- };
678
-
679
-
680
- plugin.init();
681
-
682
- };
683
-
684
- $.fn.easytabs = function(options) {
685
- var args = arguments;
686
-
687
- return this.each(function() {
688
- var $this = $(this),
689
- plugin = $this.data('easytabs');
690
-
691
- // Initialization was called with $(el).easytabs( { options } );
692
- if (undefined === plugin) {
693
- plugin = new $.easytabs(this, options);
694
- $this.data('easytabs', plugin);
695
- }
696
-
697
- // User called public method
698
- if ( options && plugin.publicMethods[options] ){
699
- return plugin.publicMethods[options](Array.prototype.slice.call( args, 1 ));
700
- }
701
- });
702
- };
703
-
704
- })(jQuery);