revelry_content 0.0.1.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (267) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +21 -84
  3. data/Rakefile +1 -1
  4. data/app/assets/javascripts/revelry_content.js.coffee +3 -15
  5. data/app/assets/javascripts/revelry_content/components/Admin.js.cjsx +82 -78
  6. data/app/assets/javascripts/revelry_content/components/EditModeButton.js.cjsx +14 -15
  7. data/app/assets/javascripts/revelry_content/components/Loader.js.cjsx +9 -10
  8. data/app/assets/javascripts/revelry_content/components/Time.js.cjsx +13 -14
  9. data/app/assets/javascripts/revelry_content/components/TopBar.js.cjsx +15 -16
  10. data/app/assets/javascripts/revelry_content/components/editor.js.coffee +319 -287
  11. data/app/assets/javascripts/revelry_content/components/versions.js.coffee +154 -155
  12. data/app/assets/javascripts/revelry_content/config.js.coffee.erb +2 -2
  13. data/app/assets/javascripts/revelry_content/mixins/EditModeListener.coffee +3 -3
  14. data/app/assets/javascripts/revelry_content/models/Content.js.coffee +4 -4
  15. data/app/assets/javascripts/revelry_content/models/Version.js.coffee +5 -5
  16. data/app/assets/javascripts/revelry_content/setup.js +1 -0
  17. data/app/assets/stylesheets/revelry_content/components/buttons.scss +1 -1
  18. data/app/assets/stylesheets/revelry_content/components/loader.scss +1 -1
  19. data/app/controllers/{revelry_content → revelry/content}/application_controller.rb +1 -1
  20. data/app/controllers/{revelry_content → revelry/content}/contents_controller.rb +17 -12
  21. data/app/controllers/revelry/content/pages_controller.rb +30 -0
  22. data/app/controllers/{revelry_content → revelry/content}/versions_controller.rb +14 -6
  23. data/app/models/{revelry_content → revelry/content}/content.rb +25 -9
  24. data/app/models/{revelry_content → revelry/content}/content_version.rb +1 -1
  25. data/app/models/revelry/content/page.rb +6 -0
  26. data/app/views/layouts/revelry_content/application.html.erb +2 -2
  27. data/app/views/revelry_content/contents/_menus.html.erb +2 -2
  28. data/app/views/revelry_content/contents/index.html.erb +1 -1
  29. data/config/routes.rb +1 -1
  30. data/lib/generators/revelry/content/css_generator.rb +51 -0
  31. data/lib/generators/revelry/content/initializer_generator.rb +13 -0
  32. data/lib/generators/revelry/content/install_generator.rb +40 -0
  33. data/lib/generators/revelry/content/js_generator.rb +45 -0
  34. data/lib/generators/revelry/content/migrations_generator.rb +28 -0
  35. data/lib/generators/{revelry_content → revelry/content}/templates/create_revelry_content_contents.rb +0 -0
  36. data/lib/generators/revelry/content/templates/create_revelry_content_pages.rb +17 -0
  37. data/lib/generators/{revelry_content → revelry/content}/templates/create_versions.rb +0 -0
  38. data/lib/generators/revelry/content/templates/initializer.rb +13 -0
  39. data/lib/revelry/content/admin_concern.rb +13 -0
  40. data/lib/{revelry_content → revelry/content}/configuration.rb +2 -2
  41. data/lib/revelry/content/content_concern.rb +18 -0
  42. data/{app/helpers/revelry_content → lib/revelry/content}/contents_helper.rb +5 -5
  43. data/lib/{revelry_content → revelry/content}/engine.rb +5 -3
  44. data/lib/{revelry_content → revelry/content}/js_exporter.rb +4 -4
  45. data/lib/{revelry_content → revelry/content}/railtie.rb +2 -2
  46. data/lib/revelry/content/version.rb +5 -0
  47. data/lib/revelry_content.rb +25 -18
  48. data/lib/tasks/revelry_content_tasks.rake +1 -1
  49. data/test/controllers/revelry_content/contents_controller_test.rb +1 -1
  50. data/test/controllers/revelry_content/revelry_content/pages_controller_test.rb +9 -0
  51. data/test/dummy/app/controllers/home_controller.rb +1 -1
  52. data/test/dummy/config/initializers/content.rb +1 -1
  53. data/test/dummy/config/initializers/revelry_content.rb +1 -1
  54. data/test/dummy/config/routes.rb +1 -1
  55. data/test/dummy/db/development.sqlite3 +0 -0
  56. data/test/dummy/log/development.log +0 -2990
  57. data/test/dummy/log/test.log +0 -0
  58. data/test/fixtures/revelry_content/pages.yml +11 -0
  59. data/test/helpers/rev_content/contents_helper_test.rb +1 -1
  60. data/test/models/rev_content/content_test.rb +1 -1
  61. data/test/models/revelry_content/page_test.rb +9 -0
  62. data/test/revelry_content_test.rb +1 -1
  63. metadata +50 -438
  64. data/app/assets/javascripts/revelry_content/server_side.js.coffee +0 -10
  65. data/app/assets/javascripts/revelry_content/utilities.js +0 -69
  66. data/app/assets/javascripts/vendor/react_ujs.js +0 -64
  67. data/app/helpers/revelry_content/application_helper.rb +0 -4
  68. data/lib/generators/revelry_content/css_generator.rb +0 -47
  69. data/lib/generators/revelry_content/initializer_generator.rb +0 -11
  70. data/lib/generators/revelry_content/install_generator.rb +0 -38
  71. data/lib/generators/revelry_content/js_generator.rb +0 -43
  72. data/lib/generators/revelry_content/migrations_generator.rb +0 -25
  73. data/lib/generators/revelry_content/templates/initializer.rb +0 -13
  74. data/lib/revelry_content/controller_concern.rb +0 -11
  75. data/lib/revelry_content/model_concern.rb +0 -11
  76. data/lib/revelry_content/version.rb +0 -3
  77. data/test/dummy/public/uploads/revelry_content/content/src/3/Screen_Shot_2015-05-04_at_9.50.48_AM.png +0 -0
  78. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/-I_fh6Ob3TV3ynXTvv2TsuKA8cQq62L1tKIrIuNXWjA.cache +0 -1
  79. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/-YnOULGJdPpgh539S1Ms1ELd5--WkKXQZL4yYylOy-0.cache +0 -1
  80. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/01i3BQNbZnC6BxmgguLy4xMYU2RnsNjDy_lEOEdzhxY.cache +0 -1
  81. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0CsApXQBjT34U567rgWiQGYOFwIpgM1ZcV3ZvrXPAXg.cache +0 -1
  82. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0LnMwfkPx0KckDudP0t_qfcIfrUx2JEt9_W28i5ota8.cache +0 -0
  83. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0Soh65Z50qGQ79OzRV5ywJzksbLPZ9Y7Xukmqyr6k5E.cache +0 -1
  84. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0XbuhYD4hx4ktBwomnPqrp-8ofGrK18w0XFrKr9A0TQ.cache +0 -0
  85. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1aGcEQlzCZqj47bR8b18bidGhSM2TCoUF8PH47DmsLU.cache +0 -0
  86. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1k4qrvfTSqyZpqJotrEJvryNYKwAYhcPYDr762tOceA.cache +0 -1
  87. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1qAjZK81hSd2VjC4whKNDW4X7SdJpLItpFtUW5R2vUU.cache +0 -0
  88. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1tgQBRMWbVAGLWkDo0fO1_ePFLz60fDuTdCKwp-LIJU.cache +0 -1
  89. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/22e58P_cEp6-Pu5wgZqEMEpiJGooGJ2dI6gfNXacBaw.cache +0 -1
  90. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/2ZbqEyDxBgh2_LtnR16sYKThwIziSqlASeCjQjkwL7Q.cache +0 -0
  91. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/2t8ZjvFIs5Qg2owTTr20k8NqE0dCrbY5mHTjJGQd2To.cache +0 -0
  92. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/4cBcXkgJSg0A9kNtcagSpP-C7RpYMO7GIYMiIdC0K48.cache +0 -0
  93. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/4eWrs3PFkK1uDMlHgGflFhNtKLF63kY4nMqArSbZBpY.cache +0 -0
  94. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5-_j0ZY9kq3RzZvSq8dpYirIlmqsRJUSBNkE97ZcqWY.cache +0 -0
  95. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/55ea_CKRYg4qGN5pyZy2H1oKxEnbQuJzgGyrVQ1ZE-k.cache +0 -1
  96. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5PZzqc1OeigG9XRqgCM3SCT9fLVn6wTm6awQx74XAD0.cache +0 -1
  97. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5WUZd0B2PMhhtp-V7XsX5zFLOPXl9z2WpIVdT8rW5AE.cache +0 -0
  98. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5cWdZIkyqWp1hyfiXzGiMnuqZ_4SlHG0DmWpUkQYuS8.cache +0 -1
  99. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5wFIFg4lQ-rd1ZWBhlRi9J56-EqjP61WWYq0jOA7bek.cache +0 -1
  100. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6COX4oqZCCZnmoes6ehqGZqIr2xtXv5HVYqJzRnccnU.cache +0 -2
  101. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6Ck5oeyDTZNctS2vkmtYRv6UU5SCv8DW_cqAumQHEW4.cache +0 -1
  102. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6W7Zp0ylWiCA_3Z-Hese0EPiWLITfAv2OViiC3GHvzU.cache +0 -0
  103. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6ajykKpm3QojPPBBJIx6vRImRgKpc_V_zX68dF-yV1Q.cache +0 -1
  104. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/75Qu5KXpoOg--ZIa5yMWG0sQS_OoZiF0og8GEfCKodI.cache +0 -0
  105. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/78FVepsCcIAm-tqmhFYO4eaDkF1BHiAwzZjoc1W6XrI.cache +0 -1
  106. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7OzH_p-6ZYmSIl-UNVwWQfD6PJHalPe5Y01jCP_MF1w.cache +0 -1
  107. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/856F5ONTmAq3bpS5lqrZAzppRy4gwhAkugo9inM3EEU.cache +0 -1
  108. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8AVC27x21kixmECkHeOm4sR-mSbzhJO320NRwrW6B38.cache +0 -0
  109. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8KCGLeeBgsHpq-GGsxAKvONGThHONpkBhLmQv5x-5i8.cache +0 -0
  110. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8cyMCW5yogfK5gPFpci4rPtVb8pVIiZmF5DpOH8F07Y.cache +0 -1
  111. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9EThCCo9tuqXzBz-afDke-GvEyM_NG0dxw7dSdkzINw.cache +0 -2
  112. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9NoeClumq19p-VmRk5PPOHLvDXN_Jr6BCYnczJWWfv4.cache +0 -0
  113. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9YD7CWCBCkOdAYp-yB8nGhaNDiiUWsP7fzRWPmHbzKI.cache +0 -2
  114. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AY9mbclr0zMOzxzP4BYRTYyvBOlpLFHHQAimzs6dSDI.cache +0 -38
  115. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AqkMYZH-ERTqi-15YvdhRVtysLKqim5CV7-GILZNras.cache +0 -0
  116. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Au8GVVKkzmp8TySAWMgFJQObozIt4Mr-RW5BolO8J2k.cache +0 -2
  117. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/BBPtOTznDSAhX5tIqbw_JRw9Cppz2SVtSFsJ1CpC37k.cache +0 -2
  118. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CC0dQuHqBjWqdKsRp2Ntw6nn3M1nC5lUY-dd8lMzJ6Y.cache +0 -1
  119. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CWYN7KxLVsU-N9FbSIrHgO979x5b6AeyckCfZ892Y7k.cache +0 -2
  120. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/C_Sjupfz09XcSquDwczKxSTxWrEUrjaf49VmA5x68CQ.cache +0 -1
  121. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CcJCtip5hherUpH0eiHdJI5Stl08Txl1AU8NxDLKtro.cache +0 -0
  122. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Clf7dMHxXwzeU3tZ2yxP8d3xr0HRWHFMdqjBuSceJZ0.cache +0 -0
  123. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Cnkk4N8ysSWHH6ujQDBGzEiLuGa0dVNDL5Zq53tJq-M.cache +0 -0
  124. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/D0USxWIEUAxLvX9bhYdtB_SXMXAJ9nQr9vewnyqrk5k.cache +0 -0
  125. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Dy0AC2wVM0afv2MB-u7UGGLsb_2ExNZ8S6w7SGE-djg.cache +0 -1
  126. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Ee1BFKugxHkzKUuAsIqQc60hV47E4VSUMZwBOThvSeY.cache +0 -1
  127. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EghXS1aAsnoopkxb4Fv0S21wqJGL59ryH5HV9-30KI8.cache +0 -2
  128. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Eq8I8ukRZZ9BZ2SQxzSNc8mOoyKksxtzwtDh2FRZ1FE.cache +0 -0
  129. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Eu26_D_tZu1dr7mVRA4F2--NUZ2UMM4QRXv9JcqO2TY.cache +0 -0
  130. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FEfkZdxv5MUSvLMUUWoC3lif13VZBbiaUYPNv8uizgM.cache +0 -0
  131. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FF9LKRGOPVZl03UeeMXbHRXBFwG4SkAdOfcDClwXXx8.cache +0 -1
  132. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/F_NOlk6iL-Gonygn5tsU_AaDA69HBxeExwCiAa6Ezi4.cache +0 -2
  133. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FuMG_mCkNUt0OV_qrahX3ne-LN8Y3J-17T-I5BwYT_U.cache +0 -2
  134. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FzIl4k5FDcnN8SbzckzMXWXsj2DwBv_tGvZZky8_cvk.cache +0 -0
  135. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/GBe9GA2qATaLqF7GTbxcZ8sWcPJ2zWeT8PFE8Cynb4U.cache +0 -1
  136. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/GUcaNDg0KOqTIS7ltde6vWEZy4eTkdPuecVr52xaqY4.cache +0 -4
  137. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/GWveyzQul11IW7JP-MFTH1p2O-FAiSldGQCixPtBWZc.cache +0 -1
  138. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/H8Py9_cLtmjiNd1zVjVpr-60bPm8OKt1NzBdYpuRoSg.cache +0 -2
  139. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HIOnKEwfKW9leZhYm8hw2zTPcTC7Lhr9QO3pGkpVUC0.cache +0 -1
  140. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IUOCPt0S05lp6-q_7CuqTJjuySoP7ZTTe1srP_Sgdag.cache +0 -0
  141. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IlxQ_nfFkpBhgHXJ9EL7TgHKTrQYX_1ockXtSOHH_1Q.cache +0 -1
  142. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Intu4bn50Zl1tGpuw8N2VhNjvLeG367yEoPjIxYkYxA.cache +0 -49
  143. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/J3EzfF5t_RDdiaU-svpP2DBjb8gnlHHHCQjjpPvzvpk.cache +0 -0
  144. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/J5rhZ_6c58sjOvHqDBBBBTvsLDbUGfHatkjiF1M-Fys.cache +0 -1
  145. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/JP9pt25R98BIDqvwjp_DgmdNj4U1wLrVUhOnoDtekS8.cache +0 -1
  146. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/K2yr6YhOBxRdaqrHViPlAYUKVTWMlI24INQctCW0rWQ.cache +0 -0
  147. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LT9baTsZAaEEgS5raUZGGsP2vTnlzW9LzvyCfQgqLLs.cache +0 -2
  148. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LW03HTHDvMz6l4ReQ29sJeZqRg3QLrcVdAutCg9ROyU.cache +0 -0
  149. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LcZdIStJUZnaKHh7vs-yLld_jzO3MSU4gCJaORFrjYk.cache +0 -7
  150. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LruVN3C21yeFX4pfE6ZQw7z2CzkYXY5b8PXOTfz2o1E.cache +0 -1
  151. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/M2tXWSvBjMhGoQLT8CaoVYULKWDVirToNVLYqstyW-g.cache +0 -0
  152. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MJxRV2KlWMJ5KrraeWvC4yp7N4-aMpktlzqBpoLhft8.cache +0 -0
  153. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NGgP2dkovkWF23p4ypqAUEO3kldLkAA7E9hERHoxJ_M.cache +0 -2
  154. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NX-xwAHuCC7QChZD4MSpX9fgCXgl532SBhXfSsIxG4k.cache +0 -0
  155. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OQdV6HhyTI5Otzo9cwR6IY-8eX0eip8x561B8hXKikY.cache +0 -0
  156. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OSmr2Sj9749HFHCMkGsJP2YGkQxIztofCliXs0urGE8.cache +0 -0
  157. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/P73ImcSy1BYWt27ZGM-JKdkbzyIm2063NZr-dn-ygPE.cache +0 -1
  158. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PVxgcRUvLL0uRj6ScbeM7YyccWyjP2O2kvs2640MHck.cache +0 -1
  159. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PmcUgH3Y4bLndb9k4NAJlxdFPTXl3T8-jEskNYv7T9M.cache +0 -15
  160. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PmrPSezdyM_8N-tzxdbn62XyY_l-YJPz7Tm7Qi1z2_M.cache +0 -0
  161. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QAr8mslUFMN0vPkEEQAZEbAUGes7lnpEtfFtKSK8lCc.cache +0 -1
  162. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QFioo2rOp-ljy1-PIoxzqOTmxmc6HFAft-qNbbQvfkQ.cache +0 -0
  163. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QPGkAA8L-cs-AO80ws0mqld73EIG2HCd8hzkga35Ydc.cache +0 -1
  164. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QaJhvzKs8vkSfWT534wn8jNcxfcnMDp4i8cDbwWESbs.cache +0 -0
  165. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RICRLw8IGgYZrEFYgyA-MY8-o_kXcmcY1gCavTvwW64.cache +0 -2
  166. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RgyohxMtV3OKNhuwrAaDjfXMV7SsjprKrEVgZ6NhwzE.cache +0 -0
  167. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RsbxexS-d0Msc_BIthGWINzE8v7aFHiWQVqTbifUHp4.cache +0 -1
  168. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SZlNp_5FFT99-2Qs5TFLbTZ4ZOG2UFO6sExA-aa-9Xc.cache +0 -0
  169. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/T5Z3oNqbaal-reBCFzxyo8yxV-drGVwQjIC1O_pkHNI.cache +0 -0
  170. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/T6Ft0zMwwCntps471lA0_0aXo1KaOp-ZFeptSt9SRks.cache +0 -2
  171. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/TQ7i9C1sBaWIfDFYnQo4TqjBOMYbOVxm6f4Qhl0Uf6M.cache +0 -1
  172. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/TR10mW2AT2rabnCmUhSF2tBx-ZpQJZfpoezdescBWxg.cache +0 -0
  173. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/TSR9oCO5WIJZHL855zPdgj-pvzkWlz0vlnIPSMRudy4.cache +0 -0
  174. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/V9W2dbEVRrR0tD27e8bft0flt50g1HHugzTd7lFVoMY.cache +0 -2
  175. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VHnCzqYhXqo4PNpfO5rhh1rxxllOWMQWrJ_1an8CxJ8.cache +0 -0
  176. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Vs4mCFlsskLe0HvAg_ODhYRP8lNofUxZ45d6sOzUfC0.cache +0 -1
  177. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VsHDpo2bcpN87OPpULfpEIuC7ArNRDa4RgDTqYSgbbc.cache +0 -1
  178. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/W1XNy0_UmGwk7xmb-0QiIdkD_gx_tjV351xE8X5LCPY.cache +0 -1
  179. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WEPPUYRJVm2CgPjW9cTdBuuFhadPuO7qPEqvqecfKjg.cache +0 -1
  180. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WIwRcAEBsLT7LSFw8071ukLJbJlwFoX_JaHD9w7fEAc.cache +0 -16
  181. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WSR5PdIRaA9ix0LLhrUegJL8ztgPoIgZHdaq1d3Jm7k.cache +0 -2
  182. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WxVFbgL4Oty9vrd1AD37P2KqOGjwvcH5o_LSGrMI_do.cache +0 -1
  183. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XSXbBZ-YPcBvmUp0fzcIUcTwqNvYHvUU7xfLa38qYvg.cache +0 -1
  184. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YB9oCB5SEQMC6OwASUsvmD1GE90Ul31VfE2ZRo1Hd2k.cache +0 -1
  185. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Yf6ZOsV9gRVVFTsRNcQPGxKgCQ63L3JprFkpZMD0slI.cache +0 -1
  186. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YjXlZUeBr9ONZpMKis8Beab3ld-NdnlSKXm2oZOsysc.cache +0 -0
  187. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZBbRPnK9QPeL_bLmZNttUrL0MMH6DtrYDpD4f1DbYtc.cache +0 -0
  188. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_7w_iwIfp6xsakWz0Ww-HrRNserrl5q6WzSq1iYZGaQ.cache +0 -0
  189. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_k6iDcm-RS6SK8ChV7hlp56ZM2bVtgzaDCrpSHIDFZ4.cache +0 -0
  190. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_tne4TjP6WhsfK-a0TBVts5lr-lr-sDxyQiKIugRPhM.cache +0 -1
  191. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_zOYmE_ymvMvcRhHFdH2JutNJimhiytkMAhh4Oq6mkk.cache +0 -0
  192. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/aDjgtkQ97t1Rcjxv5nZUTSSYXea5orrfkCeCNrlNNao.cache +0 -0
  193. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/aKAjc-eEaECxCE89czdDC52Kqkw11EBSF9vk7QorxPA.cache +0 -0
  194. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/auLKIVQfT6ZcV9nSxkDD4xMrcIRtB_1-hO1qKXOcwxo.cache +0 -2
  195. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/axJrczuMPd6m4cWaLl9wfSWgg5SWjyHvv1N0d8e7cas.cache +0 -1
  196. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/cWuWB7O6uRomqwh3IemLWVclp4_ioPR7TBAF7yrPpV0.cache +0 -1
  197. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ciEBvpxWzLqer60DBJkr319p1iKyYHZxfCm3tIPMqcI.cache +0 -0
  198. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ct5UmPAxknsInqDq17r9u_NbuFw8F6w4ZLKNU05xZ_Q.cache +0 -1
  199. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/cxW0sGi1l_Lc7eCBF8kxQo4kNtHw27K5H-Ngpiixm2A.cache +0 -0
  200. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/d7lXJjCfvSvwTWSI3x4kn3TQzzYG0DGvqTOJL3avl6Y.cache +0 -0
  201. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/dW3LJvt2E0gKdWoqZTSTWtntGqxhTENv8_-mbT_kfn0.cache +0 -0
  202. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/dfT6vHCtyIBci9lpNUVgyqepSYt55BCo8MDzrPXxUEw.cache +0 -2
  203. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/e7OkNhH6RmnQjEY0ZEO597J545crZH0qZdVDYz71KT4.cache +0 -2
  204. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ea-3NiBlut0EOdCVqVGn-RwNm0CiwA8YVBRqfRqhgLg.cache +0 -1
  205. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/eqpR2RCSOj4T0wmrPGJDb_td3gtOdiyLwD02BpzuBkg.cache +0 -1
  206. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/eqrwo9jjG9uZiNQCUMkdkvT40JGz2uvrufAv-l00X1k.cache +0 -2
  207. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fG1WmTPapxY9EMQ5D8HQw8E2MpudT32v--jD6VgazTU.cache +0 -2
  208. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fLosOyYOiUc-ZJIEAtgmz68UfDVlAVCVMAxtAlML-nQ.cache +0 -1
  209. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/faEE1R7Sb00wgGFfL9FC9IqAGSkEHNY7rLPURjZVFv0.cache +0 -1
  210. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fgmBwPUcbsTKyMd7bxMbzh9YFF7GkD269KSZbCOpe54.cache +0 -1
  211. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/g4m06tmSxrOnDxGpUyYkIEY8hi0ymUoUzYMAh06YkGc.cache +0 -0
  212. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gP9Pm0rpnz4IvvhguI8VxK8xhDKU8WisGwfm5ox97RY.cache +0 -0
  213. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gtka4cvnxw2bm_SnkE-5LxtRYKxD-MvM_T7lYxdLAug.cache +0 -0
  214. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hQFzaNvvDOyvg2U4FZcg-xUjctMTLEdb7tK-RYIziz8.cache +0 -0
  215. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hcS2HARtyE_tpJmmwUqYO-9e-Tshg3TF6W6XL29_cwM.cache +0 -1
  216. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hdMwJqicGzH0qHgBqMVfxHB8u3-zdirRgb1zpnRfb6w.cache +0 -2
  217. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hfIPOqDhaIk7vhQa4hLyWEIQasPwJSn3H-i2egLuFvQ.cache +0 -2
  218. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/i3Mr4BCaCS865aFe9brU973ERtfoSONrUQhX5FW509w.cache +0 -0
  219. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jBOiy_uvOKOoBovFao2qEf6xVkGYRFmw-CR_I756N5g.cache +0 -1
  220. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jZZQUkAYSpxGGWp7Vb_vs2S3Clde8_XKFWwjwHaBmU0.cache +0 -0
  221. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jiUvf7zJxbsJ9a9IiZOy06PqL6dOOfprzyXci5p8vMM.cache +0 -0
  222. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/kd10Jyu0ZXLelGbmQo03cFEKpR0qQRw-QyPPMlnY-FQ.cache +0 -0
  223. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ksZL57FCLWVpXdOSIHVytq_XIsGz78TdArP4aWt7uQA.cache +0 -1
  224. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/l4Mb7Zqpi9HWWa67ftgd_ZkPTvGuhxm--tpHlgu4Eyc.cache +0 -0
  225. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/m3gQ2mqyaWT0r9UVJriOzT0qkFiL4aZ5mhMgbbyLmyw.cache +0 -1
  226. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/n6NcZJQK0j-WDDTq_7wksLUZBBYhGRPaW38Cua19t4E.cache +0 -0
  227. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nKs1V_XYWUW2uG9E7WQPaiVIvYx2I5ttwdMZ9bRsUVY.cache +0 -2
  228. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/oB34rjWhV_SBgt62MMSw20hEYuiVTjLMILeSBjagbDo.cache +0 -0
  229. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/oydOGeF22N2dttfBS68MA5PK4ofniHzd-LgBwVmJvI4.cache +0 -0
  230. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pA1evykc28UE2mszGRw015uHbbmBCU9gFZIcU8Hrwls.cache +0 -1
  231. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pBYZnqSsUmggXeAPQXcQrZSfrScDOEsZQdeXOIqfHaA.cache +0 -1
  232. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pENTpYJeZrQ-P80SXbbHVaXcEd7kaOm1bZRItPVK7OE.cache +0 -0
  233. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pYKIN2HEVMsGLDogjm8iDQ_4W8iGEq98NsJbOdA822o.cache +0 -1
  234. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pb5zODtFDJpqFTtbh09cOhwG1mZowQW1EZ-54eauNTc.cache +0 -1
  235. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pnDWkMT2Wf6v8kCepJzn9oEGWrxNOY-H9MlCq85zTlU.cache +0 -0
  236. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qJ6pwEWoy3oUs_aPayRv5D5d_F7oEyNIzxrJCaEpcpM.cache +0 -0
  237. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rJ88KtO5aBXvyE9sef5emc-MsAJaTna76vG5TNayYa4.cache +0 -0
  238. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rPyv5XauOpu-aOgB95w5ZSl6jCFUGvS8YE1h1eZZID0.cache +0 -2
  239. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rcp1tSuAgctt1BdAdUoGgD_UtZeD7w3rLuANXg8YU58.cache +0 -0
  240. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rfYNZtDWV3PCq5a57xTyj0-_iC1Psq1TaxWG86fXR2A.cache +0 -1
  241. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/smmkAgu4NNfatz7vllczgMFH_tckzDUAmeV3WvmmsRE.cache +0 -0
  242. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/szDR2M9t_osfhsE_agd1lcIjKrl5nwRmORMlyoWxTus.cache +0 -0
  243. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/t4fruk986h623vtFPEW2sALWc3kl3ayPfBbgOzRm6Cs.cache +0 -0
  244. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tJDIhl16K_HokIK8UZx1y9hy-Ne6lk9ie2kMbsHVxdY.cache +0 -1
  245. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tSDhvZZY2gcpUHWppbAMQYQL0iNPOc3Vo2HHrnqKlDw.cache +0 -1
  246. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tYYAXLHGMIYQ1Ls-jw8thSBIzdixEpeQC2kg6irmEy0.cache +0 -0
  247. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tgFK--mLRPBU9bZUb6lc4kt6Qq9-Ux6AAfG7mDQBpu8.cache +0 -1
  248. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tpBLVkgP9PSqHqSHfPf9ZLar0vHGOTCOUl0FKOqGN54.cache +0 -1
  249. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/u0B5U9yc20iANkRJi6-SiyL9U5RMrThVGmgnWSR2Rew.cache +0 -1
  250. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vtTvV-oGMOMD-l4YDTQRNHPiFRebBjqEfL9IoavTSGE.cache +0 -0
  251. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/w3rjuVGSs9xUdab61H5KOFtoRsLH5abeNs9uloC2b94.cache +0 -0
  252. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/w9RM9nORoFIx66Xb5PwygnSIR3922sjAkZkXvyeykgE.cache +0 -1
  253. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wK-n2sVphfsiv5g-IV404qJkdw6Skfo5wk55Yf8IHfs.cache +0 -0
  254. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wbSRRkjts6z6OP0o88ZwLIz6Za9iMMeF8F1FMAubBxc.cache +0 -1
  255. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xE9HS1AxUe2VZv8zzVYALc75Yhv53_LPpQNxurm0oSI.cache +0 -1
  256. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xX3QhVOxSxG9HjrdSvjeQoK1iBpYJX3Kw-yjea2vSuo.cache +0 -0
  257. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xa4ZU0nFS4WqDtDriIXMlwNURqkpUm_djZVqiz0ZynA.cache +0 -2
  258. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xzsnr6Bgr0MP4j4FZVUcYBADfkQCUHoShH_9hGp0ckk.cache +0 -0
  259. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/y6xgU0dR6b-1_hjgAZAhFFq1T9zGZ8yjUQzOefGpcu8.cache +0 -0
  260. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yJ9qoQ6ZeEPmm4ttulT9hdYPemgTF4VUSdmFjmr9Vpw.cache +0 -0
  261. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yJuZz8Lopwyvmy-rto8ycJ0nOLWeWSobCY8z-421Bec.cache +0 -0
  262. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yLZAaEFOlOcJfmo3pRpRpTiQMzBcqSRTrZYb_pJpTBs.cache +0 -2
  263. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yV9yGvP4CDMeEbb4ff4n_Hzu-GuBbM-S39cIE1WQy6Y.cache +0 -1
  264. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/y_4IIBYH_ItxQoEeXjWm9Igwn6hAkl669CNtYfo0fyI.cache +0 -1
  265. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zF_lfa7oUNjRgtepm9Ufi0DCzN_IXCJTDHRrH-JHu7Q.cache +0 -2
  266. data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zeqXKQA7lKQnvEaJsDO404ZaYCV0dk57z-SXUkfmz24.cache +0 -1
  267. data/test/dummy/vendor/assets/javascripts/revelry_content/content.js +0 -4
@@ -1,20 +1,19 @@
1
1
  # @cjsx
2
2
 
3
- RevelryContent.Utilities.lazyComponentDefinition ->
4
- RevelryContent.TopBar = React.createClass
5
- mixins: [RevelryContent.EditModeListener]
3
+ Rev.Content.TopBar = React.createClass
4
+ mixins: [Rev.Content.EditModeListener]
6
5
 
7
- render: ->
8
- if RevelryContent.inEditMode
9
- <nav className="topBar">
10
- <ul className="inline-list right">
11
- <a href={ "#{RevelryContent.base_path}contents" }><li><span className="icon-loop2"></span>History</li></a>
12
- </ul>
13
- <div className="topBar-container">
14
- <div className="topBar-items"><span className="icon-warning"></span>
15
- You're in edit mode - Don't screw anything up!
16
- </div>
6
+ render: ->
7
+ if Rev.Content.inEditMode
8
+ <nav className="topBar">
9
+ <ul className="inline-list right">
10
+ <a href={ "#{Rev.Content.base_path}contents" }><li><span className="icon-loop2"></span>History</li></a>
11
+ </ul>
12
+ <div className="topBar-container">
13
+ <div className="topBar-items"><span className="icon-warning"></span>
14
+ You're in edit mode - Don't screw anything up!
17
15
  </div>
18
- </nav>
19
- else
20
- <span />
16
+ </div>
17
+ </nav>
18
+ else
19
+ <span />
@@ -1,295 +1,327 @@
1
1
  # @cjsx
2
-
3
- RevelryContent.Utilities.lazyComponentDefinition ->
4
- RevelryContent.EditableText = React.createClass
5
- mixins: [RevelryContent.EditModeListener]
6
-
7
- propTypes:
8
- canEdit: React.PropTypes.bool
9
- content: React.PropTypes.object
10
- lookup: React.PropTypes.object
11
- contentKey: React.PropTypes.string
12
-
13
- getDefaultProps: ->
14
- props =
15
- canEdit: false
16
-
17
- getInitialState: ->
18
- state =
19
- editing: false
20
-
21
- render: ->
22
- <div className={ @className() } {...@getHandlers()}>
23
- <span dangerouslySetInnerHTML={{__html: @getContent().html_content }} />
2
+ Rev.Content.EditableText = React.createClass
3
+ mixins: [Rev.Mixins.Core, Rev.Content.EditModeListener]
4
+
5
+ propTypes:
6
+ canEdit: React.PropTypes.bool
7
+ content: React.PropTypes.object
8
+ lookup: React.PropTypes.object
9
+ contentKey: React.PropTypes.string
10
+ defaultValue: React.PropTypes.string
11
+ disableMarkdown: React.PropTypes.bool
12
+
13
+ getDefaultProps: ->
14
+ props =
15
+ canEdit: false
16
+
17
+ getInitialState: ->
18
+ state =
19
+ editing: false
20
+
21
+ render: ->
22
+ <div className={ @className() } {...@getHandlers()}>
23
+ {
24
+ if @props.disableMarkdown
25
+ <span>{@getContent().content or @props.defaultValue or @props.children or @props.contentKey}</span>
26
+ else
27
+ <span dangerouslySetInnerHTML={{__html: @getContent().html_content }} />
28
+ }
29
+ {
30
+ if @state.editing && Rev.Content.inEditMode
31
+ <Rev.Content.TextEditor disableMarkdown={ @props.disableMarkdown } content={ @getContent() } onSave={ @onSave } onCancel={ @onCancel } />
32
+ }
33
+ </div>
34
+
35
+ getContent: ->
36
+ if @props.content? && @props.content
37
+ @props.content.content
38
+ else
39
+ (@props.lookup || App.props.revelry_content_contents)[@props.contentKey] || @defaultContent()
40
+
41
+ defaultContent: ->
42
+ { html_content: @props.defaultValue || @props.contentKey, key: @props.contentKey }
43
+
44
+ className: ->
45
+ classes =
46
+ EditableText: true
47
+ 'EditableText--editing': @state.editing
48
+ 'EditableText--inEditMode': Rev.Content.inEditMode
49
+ "#{this.classSet classes} #{@props.className or ''}"
50
+
51
+ getHandlers: ->
52
+ if Rev.Content.inEditMode and !@state.editing
53
+ { onClick: @onClick }
54
+ else
55
+ { }
56
+
57
+ onClick: (e) ->
58
+ # these 3 calls do nothing at the moment, but see the return comment
59
+ e.stopPropagation()
60
+ e.nativeEvent.stopPropagation()
61
+ e.nativeEvent.stopImmediatePropagation()
62
+ @setState editing: true
63
+ return false # this is deprecated but it's the only thing that makes a parent link stop navigating
64
+
65
+ onCancel: ->
66
+ @setState editing: false
67
+
68
+ onSave: (model)->
69
+ @props.content = model.attributes
70
+ @setState editing: false
71
+
72
+ Rev.Content.TextEditor = React.createClass
73
+ propTypes:
74
+ content: React.PropTypes.object.isRequired
75
+ onSave: React.PropTypes.func
76
+ disableMarkdown: React.PropTypes.bool
77
+
78
+ mixins: [Rev.Mixins.Core]
79
+
80
+ componentDidMount: ->
81
+ window.textEditor = @
82
+
83
+ componentWillUnmount: ->
84
+ window.textEditor = null
85
+
86
+ componentDidUpdate: (prevProps, prevState)->
87
+ if @state.newSelectionPosition
88
+ @setSelection @state.newSelectionPosition
89
+ @state.newSelectionPosition = null
90
+
91
+ getInitialState: ->
92
+ state =
93
+ contentString: @props.content.content
94
+ saving: false
95
+ error: false
96
+ linkURL: null
97
+
98
+ stateChangeHandler: (field)->
99
+ return (e)=>
100
+ e.preventDefault()
101
+ newState = {}
102
+ newState[field] = e.target.value
103
+ @setState(newState)
104
+
105
+ render: ->
106
+ <div className="EditorWrapper">
107
+ <div className={ @className() }>
24
108
  {
25
- if @state.editing && RevelryContent.inEditMode
26
- <RevelryContent.TextEditor content={ @getContent() } onSave={ @onSave } onCancel={ @onCancel } />
109
+ unless @props.disableMarkdown
110
+ <div className="ButtonBar">
111
+ <button className="EditorButton EditorButton--bold" onClick={ @onClickBold }>B</button>
112
+ <button className="EditorButton EditorButton--italic" onClick={ @onClickItalic }>I</button>
113
+ <button className="EditorButton EditorButton--underline" onClick={ @onClickUnderline }>u</button>
114
+ <button className="EditorButton EditorButton--link" onClick={ @openLinkFields }>Link</button>
115
+ </div>
27
116
  }
28
- </div>
29
-
30
- getContent: ->
31
- if @props.content? && @props.content
32
- @props.content
33
- else
34
- (@props.lookup || RevelryContent.Contents)[@props.contentKey] || @defaultContent()
35
-
36
- defaultContent: ->
37
- { html_content: '', key: this.props.contentKey }
38
-
39
- className: ->
40
- classes =
41
- EditableText: true
42
- 'EditableText--editing': @state.editing
43
- 'EditableText--inEditMode': RevelryContent.inEditMode
44
- React.addons.classSet classes
45
-
46
- getHandlers: ->
47
- if RevelryContent.inEditMode
48
- { onClick: @onClick }
49
- else
50
- { }
51
-
52
- onClick: ->
53
- @setState editing: true
54
-
55
- onCancel: ->
56
- @setState editing: false
57
-
58
- onSave: (model)->
59
- @props.content = model.attributes
60
- @setState editing: false
61
-
62
- RevelryContent.TextEditor = React.createClass
63
- propTypes:
64
- content: React.PropTypes.object.isRequired
65
- onSave: React.PropTypes.func
66
-
67
- mixins: [React.addons.LinkedStateMixin]
68
-
69
- componentDidMount: ->
70
- window.textEditor = @
71
-
72
- componentWillUnmount: ->
73
- window.textEditor = null
74
-
75
- componentDidUpdate: (prevProps, prevState)->
76
- if @state.newSelectionPosition
77
- @setSelection @state.newSelectionPosition
78
- @state.newSelectionPosition = null
79
-
80
- getInitialState: ->
81
- state =
82
- contentString: @props.content.content
83
- saving: false
84
- error: false
85
- linkURL: null
86
-
87
- render: ->
88
- <div className="EditorWrapper">
89
- <div className={ @className() }>
90
- <div className="ButtonBar">
91
- <button className="EditorButton EditorButton--bold" onClick={ @onClickBold }>B</button>
92
- <button className="EditorButton EditorButton--italic" onClick={ @onClickItalic }>I</button>
93
- <button className="EditorButton EditorButton--underline" onClick={ @onClickUnderline }>u</button>
94
- <button className="EditorButton EditorButton--link" onClick={ @openLinkFields }>Link</button>
95
- </div>
96
- {
97
- if @state.linkFieldsVisible
98
- <div>
99
- <label>
100
- Link:
101
- <div>Anchor: { @getSelection().text }</div>
102
- <input valueLink={ @linkState('linkURL') } />
103
- <button onClick={ @onMakeLink }>Make Link</button>
104
- </label>
105
- </div>
106
- }
107
- <textarea valueLink={@linkState('contentString')} ref='textarea'>
108
- { @state.contentString }
109
- </textarea>
110
- <div>
111
- <button className="EditorButton" onClick={ @onCancel }>Cancel</button>
112
- <button className="EditorButton" onClick={ @saveEdits }>Save</button>
113
- </div>
114
- </div>
115
- </div>
116
-
117
- openLinkFields: ->
118
- @setState linkFieldsVisible: !@state.linkFieldsVisible
119
-
120
- onMakeLink: ->
121
- # [text that is a link](http://…)
122
- left = '['
123
- right = "](#{ @state.linkURL })"
124
- @setState contentString: @wrappedSelection(left, right), linkFieldsVisible: false, newSelectionPosition: @getSelection().end + 1
125
-
126
- onClickBold: (e)->
127
- @setState contentString: @wrappedSelection('**'), newSelectionPosition: @getSelection().end + 1
128
-
129
- onClickItalic: (e)->
130
- @setState contentString: @wrappedSelection('*'), newSelectionPosition: @getSelection().end + 1
131
-
132
- onClickUnderline: (e)->
133
- @setState contentString: @wrappedSelection('_'), newSelectionPosition: @getSelection().end + 1
134
-
135
- wrappedSelection: (left, right)->
136
- right ||= left
137
- selection = @getSelection()
138
- beforeSelection = @state.contentString[0...selection.start]
139
- selectedText = selection.text
140
- afterSelection = @state.contentString[selection.end...]
141
- "#{ beforeSelection }#{ left }#{ selectedText }#{ right }#{afterSelection}"
142
-
143
- className: ->
144
- classes =
145
- TextEditor: true
146
- 'TextEditor--saving': @state.editing
147
- 'TextEditor--error': @state.error
148
- React.addons.classSet classes
149
-
150
- makeModel: ->
151
- attributes =
152
- authenticity_token: RevelryContent.Utilities.getAuthenticityToken()
153
- content:
154
- key: @props.content.key
155
- content: @state.contentString
156
- model = new RevelryContent.Models.Content attributes
157
-
158
- saveEdits: ->
159
- model = @makeModel()
160
- @setState saving: true, error: false
161
- model.once 'sync', @onSave
162
- model.once 'error', @onSaveError
163
- model.save()
164
-
165
- onCancel: (e)->
166
- e.stopPropagation()
167
- @props.onCancel() if @props.onCancel
168
-
169
- onSave: (model)->
170
- @setState saving: false, error: false
171
- @props.content.content = @state.contentString
172
- @props.onSave(model) if @props.onSave
173
-
174
- onSaveError: ->
175
- @setState saving: false, error: true
176
-
177
- setSelection: (position)->
178
- node = @refs.textarea.getDOMNode()
179
- node.focus()
180
- node.setSelectionRange(position, position)
181
-
182
- getSelection: ->
183
- start = @refs.textarea.getDOMNode().selectionStart
184
- end = @refs.textarea.getDOMNode().selectionEnd
185
- selection =
186
- start: start
187
- end: end
188
- text: @state.contentString[start...end]
189
-
190
- RevelryContent.EditableImage = React.createClass
191
- mixins: [RevelryContent.EditModeListener]
192
-
193
- propTypes:
194
- canEdit: React.PropTypes.bool
195
- content: React.PropTypes.object
196
- lookup: React.PropTypes.object
197
- contentKey: React.PropTypes.string
198
-
199
- getContent: ->
200
- if @props.content?
201
- @props.content
202
- else
203
- (@props.lookup || RevelryContent.Content)[@props.contentKey]
204
-
205
- getDefaultProps: ->
206
- props =
207
- canEdit: false
208
-
209
- getInitialState: ->
210
- state =
211
- editing: false
212
-
213
- render: ->
214
- <div className={ @className() } {...@getHandlers()}>
215
- <img src={ @getContent().src } />
216
117
  {
217
- if @state.editing && RevelryContent.inEditMode
218
- <RevelryContent.ImageEditor contentKey={ @getContent().key } content={ @getContent().src } onSave={ @onSave } onCancel={ @onCancel } />
118
+ if @state.linkFieldsVisible
119
+ <div>
120
+ <label>
121
+ Link:
122
+ <div>Anchor: { @getSelection().text }</div>
123
+ <input onChange={ @stateChangeHandler('linkURL') } />
124
+ <button onClick={ @onMakeLink }>Make Link</button>
125
+ </label>
126
+ </div>
219
127
  }
128
+ <textarea autoFocus onChange={@stateChangeHandler('contentString')} ref='textarea'>
129
+ { @state.contentString }
130
+ </textarea>
131
+ <div>
132
+ <button className="EditorButton" onClick={ @onCancel }>Cancel</button>
133
+ <button className="EditorButton" onClick={ @saveEdits }>Save</button>
134
+ </div>
220
135
  </div>
221
-
222
- className: ->
223
- classes =
224
- EditableImage: true
225
- 'EditableImage--editing': @state.editing
226
- 'EditableImage--inEditMode': RevelryContent.inEditMode
227
- React.addons.classSet classes
228
-
229
- getHandlers: ->
230
- if RevelryContent.inEditMode
231
- { onClick: @onClick }
232
- else
233
- { }
234
-
235
- onClick: ->
236
- @setState editing: true
237
-
238
- onCancel: ->
239
- @setState editing: false
240
-
241
- onSave: (model)->
242
- @getContent().src = model.get('src')
243
- @setState editing: false
244
-
245
- RevelryContent.ImageEditor = React.createClass
246
- propTypes:
247
- content: React.PropTypes.object.isRequired
248
- onSave: React.PropTypes.func
249
-
250
- componentDidMount: ->
251
- window.imageEditor = @
252
-
253
- componentWillUnmount: ->
254
- window.imageEditor = null
255
-
256
- getInitialState: ->
257
- state =
258
- image: @props.content
259
- saving: false
260
- error: false
261
-
262
- render: ->
263
- <div className="EditorWrapper">
264
- <div className={ @className() }>
265
- <input ref="fileField" type="file"></input>
266
- <div>
267
- <button className="EditorButton" type="button" onClick={ @onCancel }>Cancel</button>
268
- <button className="EditorButton" type="button" onClick={ @saveEdits }>Save</button>
269
- </div>
136
+ </div>
137
+
138
+ openLinkFields: ->
139
+ @setState linkFieldsVisible: !@state.linkFieldsVisible
140
+
141
+ onMakeLink: ->
142
+ # [text that is a link](http://…)
143
+ left = '['
144
+ right = "](#{ @state.linkURL })"
145
+ @setState contentString: @wrappedSelection(left, right), linkFieldsVisible: false, newSelectionPosition: @getSelection().end + 1
146
+
147
+ onClickBold: (e)->
148
+ @setState contentString: @wrappedSelection('**'), newSelectionPosition: @getSelection().end + 1
149
+
150
+ onClickItalic: (e)->
151
+ @setState contentString: @wrappedSelection('*'), newSelectionPosition: @getSelection().end + 1
152
+
153
+ onClickUnderline: (e)->
154
+ @setState contentString: @wrappedSelection('_'), newSelectionPosition: @getSelection().end + 1
155
+
156
+ wrappedSelection: (left, right)->
157
+ right ||= left
158
+ selection = @getSelection()
159
+ beforeSelection = @state.contentString[0...selection.start]
160
+ selectedText = selection.text
161
+ afterSelection = @state.contentString[selection.end...]
162
+ "#{ beforeSelection }#{ left }#{ selectedText }#{ right }#{afterSelection}"
163
+
164
+ className: ->
165
+ classes =
166
+ TextEditor: true
167
+ 'TextEditor--saving': @state.editing
168
+ 'TextEditor--error': @state.error
169
+ this.classSet classes
170
+
171
+ makeModel: ->
172
+ attributes =
173
+ authenticity_token: App.props.csrf_token
174
+ content:
175
+ key: @props.content.key
176
+ content: @state.contentString
177
+ model = new Rev.Content.Models.Content attributes
178
+
179
+ saveEdits: ->
180
+ model = @makeModel()
181
+ @setState saving: true, error: false
182
+ model.once 'sync', @onSave
183
+ model.once 'error', @onSaveError
184
+ model.save()
185
+
186
+ onCancel: (e)->
187
+ e.stopPropagation()
188
+ @props.onCancel() if @props.onCancel
189
+
190
+ onSave: (model)->
191
+ @setState saving: false, error: false
192
+ @props.content.content = @state.contentString
193
+ @props.onSave(model) if @props.onSave
194
+
195
+ onSaveError: ->
196
+ @setState saving: false, error: true
197
+
198
+ setSelection: (position)->
199
+ node = @refs.textarea.getDOMNode()
200
+ node.focus()
201
+ node.setSelectionRange(position, position)
202
+
203
+ getSelection: ->
204
+ start = @refs.textarea.getDOMNode().selectionStart
205
+ end = @refs.textarea.getDOMNode().selectionEnd
206
+ selection =
207
+ start: start
208
+ end: end
209
+ text: @state.contentString[start...end]
210
+
211
+ Rev.Content.EditableImage = React.createClass
212
+ mixins: [Rev.Mixins.Core, Rev.Content.EditModeListener]
213
+
214
+ propTypes:
215
+ canEdit: React.PropTypes.bool
216
+ content: React.PropTypes.object
217
+ lookup: React.PropTypes.object
218
+ contentKey: React.PropTypes.string
219
+ defaultSrc: React.PropTypes.string
220
+
221
+ getContent: ->
222
+ if @props.content?
223
+ @props.content
224
+ else
225
+ (@props.lookup || App.props.revelry_content_contents)[@props.contentKey] || @defaultContent()
226
+
227
+ defaultContent: ->
228
+ { src: @props.defaultSrc || @props.contentKey, key: @props.contentKey }
229
+
230
+ getDefaultProps: ->
231
+ props =
232
+ canEdit: false
233
+
234
+ getInitialState: ->
235
+ state =
236
+ editing: false
237
+
238
+ render: ->
239
+ <div className={ @className() } {...@getHandlers()}>
240
+ <img className={ @props.innerClassName } src={ @getContent().src } />
241
+ {
242
+ if @state.editing && Rev.Content.inEditMode
243
+ <Rev.Content.ImageEditor contentKey={ @getContent().key } content={ @getContent().src } onSave={ @onSave } onCancel={ @onCancel } />
244
+ }
245
+ </div>
246
+
247
+ className: ->
248
+ classes =
249
+ EditableImage: true
250
+ 'EditableImage--editing': @state.editing
251
+ 'EditableImage--inEditMode': Rev.Content.inEditMode
252
+ "#{this.classSet classes} #{@props.className or ''}"
253
+
254
+ getHandlers: ->
255
+ if Rev.Content.inEditMode and !@state.editing
256
+ { onClick: @onClick }
257
+ else
258
+ { }
259
+
260
+ onClick: (e) ->
261
+ # these 3 calls do nothing at the moment, but see the return comment
262
+ e.stopPropagation()
263
+ e.nativeEvent.stopPropagation()
264
+ e.nativeEvent.stopImmediatePropagation()
265
+ @setState editing: true
266
+ return false # this is deprecated but it's the only thing that makes a parent link stop navigating
267
+
268
+ onCancel: ->
269
+ @setState editing: false
270
+
271
+ onSave: (model)->
272
+ @getContent().src = model.get('src')
273
+ @setState editing: false
274
+
275
+ Rev.Content.ImageEditor = React.createClass
276
+ propTypes:
277
+ content: React.PropTypes.object.isRequired
278
+ onSave: React.PropTypes.func
279
+
280
+ mixins: [Rev.Mixins.Core]
281
+
282
+ componentDidMount: ->
283
+ window.imageEditor = @
284
+
285
+ componentWillUnmount: ->
286
+ window.imageEditor = null
287
+
288
+ getInitialState: ->
289
+ state =
290
+ image: @props.content
291
+ saving: false
292
+ error: false
293
+
294
+ render: ->
295
+ <div className="EditorWrapper">
296
+ <div className={ @className() }>
297
+ <input autoFocus ref="fileField" type="file"></input>
298
+ <div>
299
+ <button className="EditorButton" type="button" onClick={ @onCancel }>Cancel</button>
300
+ <button className="EditorButton" type="button" onClick={ @saveEdits }>Save</button>
270
301
  </div>
271
302
  </div>
272
-
273
- className: ->
274
- classes =
275
- ImageEditor: true
276
- 'ImageEditor--saving': @state.editing
277
- 'ImageEditor--error': @state.error
278
- React.addons.classSet classes
279
-
280
- saveEdits: (e) ->
281
- @setState saving: true, error: false
282
- fc = new RevelryContent.Models.FileContent({ key: @props.contentKey, src: @refs.fileField.getDOMNode().files[0] })
283
- fc.once 'sync', (model)=> @onSave(model)
284
- fc.save()
285
-
286
- onCancel: (e)->
287
- e.stopPropagation()
288
- @props.onCancel() if @props.onCancel
289
-
290
- onSave: (model)->
291
- @setState saving: false, error: false
292
- @props.onSave(model) if @props.onSave
293
-
294
- onSaveError: ->
295
- @setState saving: false, error: true
303
+ </div>
304
+
305
+ className: ->
306
+ classes =
307
+ ImageEditor: true
308
+ 'ImageEditor--saving': @state.editing
309
+ 'ImageEditor--error': @state.error
310
+ this.classSet classes
311
+
312
+ saveEdits: (e) ->
313
+ @setState saving: true, error: false
314
+ fc = new Rev.Content.Models.FileContent({ key: @props.contentKey, src: @refs.fileField.getDOMNode().files[0] })
315
+ fc.once 'sync', (model)=> @onSave(model)
316
+ fc.save()
317
+
318
+ onCancel: (e)->
319
+ e.stopPropagation()
320
+ @props.onCancel() if @props.onCancel
321
+
322
+ onSave: (model)->
323
+ @setState saving: false, error: false
324
+ @props.onSave(model) if @props.onSave
325
+
326
+ onSaveError: ->
327
+ @setState saving: false, error: true