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.
- checksums.yaml +4 -4
- data/README.md +21 -84
- data/Rakefile +1 -1
- data/app/assets/javascripts/revelry_content.js.coffee +3 -15
- data/app/assets/javascripts/revelry_content/components/Admin.js.cjsx +82 -78
- data/app/assets/javascripts/revelry_content/components/EditModeButton.js.cjsx +14 -15
- data/app/assets/javascripts/revelry_content/components/Loader.js.cjsx +9 -10
- data/app/assets/javascripts/revelry_content/components/Time.js.cjsx +13 -14
- data/app/assets/javascripts/revelry_content/components/TopBar.js.cjsx +15 -16
- data/app/assets/javascripts/revelry_content/components/editor.js.coffee +319 -287
- data/app/assets/javascripts/revelry_content/components/versions.js.coffee +154 -155
- data/app/assets/javascripts/revelry_content/config.js.coffee.erb +2 -2
- data/app/assets/javascripts/revelry_content/mixins/EditModeListener.coffee +3 -3
- data/app/assets/javascripts/revelry_content/models/Content.js.coffee +4 -4
- data/app/assets/javascripts/revelry_content/models/Version.js.coffee +5 -5
- data/app/assets/javascripts/revelry_content/setup.js +1 -0
- data/app/assets/stylesheets/revelry_content/components/buttons.scss +1 -1
- data/app/assets/stylesheets/revelry_content/components/loader.scss +1 -1
- data/app/controllers/{revelry_content → revelry/content}/application_controller.rb +1 -1
- data/app/controllers/{revelry_content → revelry/content}/contents_controller.rb +17 -12
- data/app/controllers/revelry/content/pages_controller.rb +30 -0
- data/app/controllers/{revelry_content → revelry/content}/versions_controller.rb +14 -6
- data/app/models/{revelry_content → revelry/content}/content.rb +25 -9
- data/app/models/{revelry_content → revelry/content}/content_version.rb +1 -1
- data/app/models/revelry/content/page.rb +6 -0
- data/app/views/layouts/revelry_content/application.html.erb +2 -2
- data/app/views/revelry_content/contents/_menus.html.erb +2 -2
- data/app/views/revelry_content/contents/index.html.erb +1 -1
- data/config/routes.rb +1 -1
- data/lib/generators/revelry/content/css_generator.rb +51 -0
- data/lib/generators/revelry/content/initializer_generator.rb +13 -0
- data/lib/generators/revelry/content/install_generator.rb +40 -0
- data/lib/generators/revelry/content/js_generator.rb +45 -0
- data/lib/generators/revelry/content/migrations_generator.rb +28 -0
- data/lib/generators/{revelry_content → revelry/content}/templates/create_revelry_content_contents.rb +0 -0
- data/lib/generators/revelry/content/templates/create_revelry_content_pages.rb +17 -0
- data/lib/generators/{revelry_content → revelry/content}/templates/create_versions.rb +0 -0
- data/lib/generators/revelry/content/templates/initializer.rb +13 -0
- data/lib/revelry/content/admin_concern.rb +13 -0
- data/lib/{revelry_content → revelry/content}/configuration.rb +2 -2
- data/lib/revelry/content/content_concern.rb +18 -0
- data/{app/helpers/revelry_content → lib/revelry/content}/contents_helper.rb +5 -5
- data/lib/{revelry_content → revelry/content}/engine.rb +5 -3
- data/lib/{revelry_content → revelry/content}/js_exporter.rb +4 -4
- data/lib/{revelry_content → revelry/content}/railtie.rb +2 -2
- data/lib/revelry/content/version.rb +5 -0
- data/lib/revelry_content.rb +25 -18
- data/lib/tasks/revelry_content_tasks.rake +1 -1
- data/test/controllers/revelry_content/contents_controller_test.rb +1 -1
- data/test/controllers/revelry_content/revelry_content/pages_controller_test.rb +9 -0
- data/test/dummy/app/controllers/home_controller.rb +1 -1
- data/test/dummy/config/initializers/content.rb +1 -1
- data/test/dummy/config/initializers/revelry_content.rb +1 -1
- data/test/dummy/config/routes.rb +1 -1
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/log/development.log +0 -2990
- data/test/dummy/log/test.log +0 -0
- data/test/fixtures/revelry_content/pages.yml +11 -0
- data/test/helpers/rev_content/contents_helper_test.rb +1 -1
- data/test/models/rev_content/content_test.rb +1 -1
- data/test/models/revelry_content/page_test.rb +9 -0
- data/test/revelry_content_test.rb +1 -1
- metadata +50 -438
- data/app/assets/javascripts/revelry_content/server_side.js.coffee +0 -10
- data/app/assets/javascripts/revelry_content/utilities.js +0 -69
- data/app/assets/javascripts/vendor/react_ujs.js +0 -64
- data/app/helpers/revelry_content/application_helper.rb +0 -4
- data/lib/generators/revelry_content/css_generator.rb +0 -47
- data/lib/generators/revelry_content/initializer_generator.rb +0 -11
- data/lib/generators/revelry_content/install_generator.rb +0 -38
- data/lib/generators/revelry_content/js_generator.rb +0 -43
- data/lib/generators/revelry_content/migrations_generator.rb +0 -25
- data/lib/generators/revelry_content/templates/initializer.rb +0 -13
- data/lib/revelry_content/controller_concern.rb +0 -11
- data/lib/revelry_content/model_concern.rb +0 -11
- data/lib/revelry_content/version.rb +0 -3
- data/test/dummy/public/uploads/revelry_content/content/src/3/Screen_Shot_2015-05-04_at_9.50.48_AM.png +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/-I_fh6Ob3TV3ynXTvv2TsuKA8cQq62L1tKIrIuNXWjA.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/-YnOULGJdPpgh539S1Ms1ELd5--WkKXQZL4yYylOy-0.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/01i3BQNbZnC6BxmgguLy4xMYU2RnsNjDy_lEOEdzhxY.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0CsApXQBjT34U567rgWiQGYOFwIpgM1ZcV3ZvrXPAXg.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0LnMwfkPx0KckDudP0t_qfcIfrUx2JEt9_W28i5ota8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0Soh65Z50qGQ79OzRV5ywJzksbLPZ9Y7Xukmqyr6k5E.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/0XbuhYD4hx4ktBwomnPqrp-8ofGrK18w0XFrKr9A0TQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1aGcEQlzCZqj47bR8b18bidGhSM2TCoUF8PH47DmsLU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1k4qrvfTSqyZpqJotrEJvryNYKwAYhcPYDr762tOceA.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1qAjZK81hSd2VjC4whKNDW4X7SdJpLItpFtUW5R2vUU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/1tgQBRMWbVAGLWkDo0fO1_ePFLz60fDuTdCKwp-LIJU.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/22e58P_cEp6-Pu5wgZqEMEpiJGooGJ2dI6gfNXacBaw.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/2ZbqEyDxBgh2_LtnR16sYKThwIziSqlASeCjQjkwL7Q.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/2t8ZjvFIs5Qg2owTTr20k8NqE0dCrbY5mHTjJGQd2To.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/4cBcXkgJSg0A9kNtcagSpP-C7RpYMO7GIYMiIdC0K48.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/4eWrs3PFkK1uDMlHgGflFhNtKLF63kY4nMqArSbZBpY.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5-_j0ZY9kq3RzZvSq8dpYirIlmqsRJUSBNkE97ZcqWY.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/55ea_CKRYg4qGN5pyZy2H1oKxEnbQuJzgGyrVQ1ZE-k.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5PZzqc1OeigG9XRqgCM3SCT9fLVn6wTm6awQx74XAD0.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5WUZd0B2PMhhtp-V7XsX5zFLOPXl9z2WpIVdT8rW5AE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5cWdZIkyqWp1hyfiXzGiMnuqZ_4SlHG0DmWpUkQYuS8.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/5wFIFg4lQ-rd1ZWBhlRi9J56-EqjP61WWYq0jOA7bek.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6COX4oqZCCZnmoes6ehqGZqIr2xtXv5HVYqJzRnccnU.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6Ck5oeyDTZNctS2vkmtYRv6UU5SCv8DW_cqAumQHEW4.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6W7Zp0ylWiCA_3Z-Hese0EPiWLITfAv2OViiC3GHvzU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/6ajykKpm3QojPPBBJIx6vRImRgKpc_V_zX68dF-yV1Q.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/75Qu5KXpoOg--ZIa5yMWG0sQS_OoZiF0og8GEfCKodI.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/78FVepsCcIAm-tqmhFYO4eaDkF1BHiAwzZjoc1W6XrI.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/7OzH_p-6ZYmSIl-UNVwWQfD6PJHalPe5Y01jCP_MF1w.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/856F5ONTmAq3bpS5lqrZAzppRy4gwhAkugo9inM3EEU.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8AVC27x21kixmECkHeOm4sR-mSbzhJO320NRwrW6B38.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8KCGLeeBgsHpq-GGsxAKvONGThHONpkBhLmQv5x-5i8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/8cyMCW5yogfK5gPFpci4rPtVb8pVIiZmF5DpOH8F07Y.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9EThCCo9tuqXzBz-afDke-GvEyM_NG0dxw7dSdkzINw.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9NoeClumq19p-VmRk5PPOHLvDXN_Jr6BCYnczJWWfv4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/9YD7CWCBCkOdAYp-yB8nGhaNDiiUWsP7fzRWPmHbzKI.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AY9mbclr0zMOzxzP4BYRTYyvBOlpLFHHQAimzs6dSDI.cache +0 -38
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/AqkMYZH-ERTqi-15YvdhRVtysLKqim5CV7-GILZNras.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Au8GVVKkzmp8TySAWMgFJQObozIt4Mr-RW5BolO8J2k.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/BBPtOTznDSAhX5tIqbw_JRw9Cppz2SVtSFsJ1CpC37k.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CC0dQuHqBjWqdKsRp2Ntw6nn3M1nC5lUY-dd8lMzJ6Y.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CWYN7KxLVsU-N9FbSIrHgO979x5b6AeyckCfZ892Y7k.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/C_Sjupfz09XcSquDwczKxSTxWrEUrjaf49VmA5x68CQ.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/CcJCtip5hherUpH0eiHdJI5Stl08Txl1AU8NxDLKtro.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Clf7dMHxXwzeU3tZ2yxP8d3xr0HRWHFMdqjBuSceJZ0.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Cnkk4N8ysSWHH6ujQDBGzEiLuGa0dVNDL5Zq53tJq-M.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/D0USxWIEUAxLvX9bhYdtB_SXMXAJ9nQr9vewnyqrk5k.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Dy0AC2wVM0afv2MB-u7UGGLsb_2ExNZ8S6w7SGE-djg.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Ee1BFKugxHkzKUuAsIqQc60hV47E4VSUMZwBOThvSeY.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/EghXS1aAsnoopkxb4Fv0S21wqJGL59ryH5HV9-30KI8.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Eq8I8ukRZZ9BZ2SQxzSNc8mOoyKksxtzwtDh2FRZ1FE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Eu26_D_tZu1dr7mVRA4F2--NUZ2UMM4QRXv9JcqO2TY.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FEfkZdxv5MUSvLMUUWoC3lif13VZBbiaUYPNv8uizgM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FF9LKRGOPVZl03UeeMXbHRXBFwG4SkAdOfcDClwXXx8.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/F_NOlk6iL-Gonygn5tsU_AaDA69HBxeExwCiAa6Ezi4.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FuMG_mCkNUt0OV_qrahX3ne-LN8Y3J-17T-I5BwYT_U.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/FzIl4k5FDcnN8SbzckzMXWXsj2DwBv_tGvZZky8_cvk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/GBe9GA2qATaLqF7GTbxcZ8sWcPJ2zWeT8PFE8Cynb4U.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/GUcaNDg0KOqTIS7ltde6vWEZy4eTkdPuecVr52xaqY4.cache +0 -4
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/GWveyzQul11IW7JP-MFTH1p2O-FAiSldGQCixPtBWZc.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/H8Py9_cLtmjiNd1zVjVpr-60bPm8OKt1NzBdYpuRoSg.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/HIOnKEwfKW9leZhYm8hw2zTPcTC7Lhr9QO3pGkpVUC0.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IUOCPt0S05lp6-q_7CuqTJjuySoP7ZTTe1srP_Sgdag.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/IlxQ_nfFkpBhgHXJ9EL7TgHKTrQYX_1ockXtSOHH_1Q.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Intu4bn50Zl1tGpuw8N2VhNjvLeG367yEoPjIxYkYxA.cache +0 -49
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/J3EzfF5t_RDdiaU-svpP2DBjb8gnlHHHCQjjpPvzvpk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/J5rhZ_6c58sjOvHqDBBBBTvsLDbUGfHatkjiF1M-Fys.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/JP9pt25R98BIDqvwjp_DgmdNj4U1wLrVUhOnoDtekS8.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/K2yr6YhOBxRdaqrHViPlAYUKVTWMlI24INQctCW0rWQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LT9baTsZAaEEgS5raUZGGsP2vTnlzW9LzvyCfQgqLLs.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LW03HTHDvMz6l4ReQ29sJeZqRg3QLrcVdAutCg9ROyU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LcZdIStJUZnaKHh7vs-yLld_jzO3MSU4gCJaORFrjYk.cache +0 -7
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/LruVN3C21yeFX4pfE6ZQw7z2CzkYXY5b8PXOTfz2o1E.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/M2tXWSvBjMhGoQLT8CaoVYULKWDVirToNVLYqstyW-g.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/MJxRV2KlWMJ5KrraeWvC4yp7N4-aMpktlzqBpoLhft8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NGgP2dkovkWF23p4ypqAUEO3kldLkAA7E9hERHoxJ_M.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/NX-xwAHuCC7QChZD4MSpX9fgCXgl532SBhXfSsIxG4k.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OQdV6HhyTI5Otzo9cwR6IY-8eX0eip8x561B8hXKikY.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/OSmr2Sj9749HFHCMkGsJP2YGkQxIztofCliXs0urGE8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/P73ImcSy1BYWt27ZGM-JKdkbzyIm2063NZr-dn-ygPE.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PVxgcRUvLL0uRj6ScbeM7YyccWyjP2O2kvs2640MHck.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PmcUgH3Y4bLndb9k4NAJlxdFPTXl3T8-jEskNYv7T9M.cache +0 -15
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/PmrPSezdyM_8N-tzxdbn62XyY_l-YJPz7Tm7Qi1z2_M.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QAr8mslUFMN0vPkEEQAZEbAUGes7lnpEtfFtKSK8lCc.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QFioo2rOp-ljy1-PIoxzqOTmxmc6HFAft-qNbbQvfkQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QPGkAA8L-cs-AO80ws0mqld73EIG2HCd8hzkga35Ydc.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/QaJhvzKs8vkSfWT534wn8jNcxfcnMDp4i8cDbwWESbs.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RICRLw8IGgYZrEFYgyA-MY8-o_kXcmcY1gCavTvwW64.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RgyohxMtV3OKNhuwrAaDjfXMV7SsjprKrEVgZ6NhwzE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/RsbxexS-d0Msc_BIthGWINzE8v7aFHiWQVqTbifUHp4.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/SZlNp_5FFT99-2Qs5TFLbTZ4ZOG2UFO6sExA-aa-9Xc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/T5Z3oNqbaal-reBCFzxyo8yxV-drGVwQjIC1O_pkHNI.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/T6Ft0zMwwCntps471lA0_0aXo1KaOp-ZFeptSt9SRks.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/TQ7i9C1sBaWIfDFYnQo4TqjBOMYbOVxm6f4Qhl0Uf6M.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/TR10mW2AT2rabnCmUhSF2tBx-ZpQJZfpoezdescBWxg.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/TSR9oCO5WIJZHL855zPdgj-pvzkWlz0vlnIPSMRudy4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/V9W2dbEVRrR0tD27e8bft0flt50g1HHugzTd7lFVoMY.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VHnCzqYhXqo4PNpfO5rhh1rxxllOWMQWrJ_1an8CxJ8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Vs4mCFlsskLe0HvAg_ODhYRP8lNofUxZ45d6sOzUfC0.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/VsHDpo2bcpN87OPpULfpEIuC7ArNRDa4RgDTqYSgbbc.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/W1XNy0_UmGwk7xmb-0QiIdkD_gx_tjV351xE8X5LCPY.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WEPPUYRJVm2CgPjW9cTdBuuFhadPuO7qPEqvqecfKjg.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WIwRcAEBsLT7LSFw8071ukLJbJlwFoX_JaHD9w7fEAc.cache +0 -16
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WSR5PdIRaA9ix0LLhrUegJL8ztgPoIgZHdaq1d3Jm7k.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/WxVFbgL4Oty9vrd1AD37P2KqOGjwvcH5o_LSGrMI_do.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/XSXbBZ-YPcBvmUp0fzcIUcTwqNvYHvUU7xfLa38qYvg.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YB9oCB5SEQMC6OwASUsvmD1GE90Ul31VfE2ZRo1Hd2k.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/Yf6ZOsV9gRVVFTsRNcQPGxKgCQ63L3JprFkpZMD0slI.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/YjXlZUeBr9ONZpMKis8Beab3ld-NdnlSKXm2oZOsysc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ZBbRPnK9QPeL_bLmZNttUrL0MMH6DtrYDpD4f1DbYtc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_7w_iwIfp6xsakWz0Ww-HrRNserrl5q6WzSq1iYZGaQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_k6iDcm-RS6SK8ChV7hlp56ZM2bVtgzaDCrpSHIDFZ4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_tne4TjP6WhsfK-a0TBVts5lr-lr-sDxyQiKIugRPhM.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/_zOYmE_ymvMvcRhHFdH2JutNJimhiytkMAhh4Oq6mkk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/aDjgtkQ97t1Rcjxv5nZUTSSYXea5orrfkCeCNrlNNao.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/aKAjc-eEaECxCE89czdDC52Kqkw11EBSF9vk7QorxPA.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/auLKIVQfT6ZcV9nSxkDD4xMrcIRtB_1-hO1qKXOcwxo.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/axJrczuMPd6m4cWaLl9wfSWgg5SWjyHvv1N0d8e7cas.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/cWuWB7O6uRomqwh3IemLWVclp4_ioPR7TBAF7yrPpV0.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ciEBvpxWzLqer60DBJkr319p1iKyYHZxfCm3tIPMqcI.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ct5UmPAxknsInqDq17r9u_NbuFw8F6w4ZLKNU05xZ_Q.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/cxW0sGi1l_Lc7eCBF8kxQo4kNtHw27K5H-Ngpiixm2A.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/d7lXJjCfvSvwTWSI3x4kn3TQzzYG0DGvqTOJL3avl6Y.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/dW3LJvt2E0gKdWoqZTSTWtntGqxhTENv8_-mbT_kfn0.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/dfT6vHCtyIBci9lpNUVgyqepSYt55BCo8MDzrPXxUEw.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/e7OkNhH6RmnQjEY0ZEO597J545crZH0qZdVDYz71KT4.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ea-3NiBlut0EOdCVqVGn-RwNm0CiwA8YVBRqfRqhgLg.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/eqpR2RCSOj4T0wmrPGJDb_td3gtOdiyLwD02BpzuBkg.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/eqrwo9jjG9uZiNQCUMkdkvT40JGz2uvrufAv-l00X1k.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fG1WmTPapxY9EMQ5D8HQw8E2MpudT32v--jD6VgazTU.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fLosOyYOiUc-ZJIEAtgmz68UfDVlAVCVMAxtAlML-nQ.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/faEE1R7Sb00wgGFfL9FC9IqAGSkEHNY7rLPURjZVFv0.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/fgmBwPUcbsTKyMd7bxMbzh9YFF7GkD269KSZbCOpe54.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/g4m06tmSxrOnDxGpUyYkIEY8hi0ymUoUzYMAh06YkGc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gP9Pm0rpnz4IvvhguI8VxK8xhDKU8WisGwfm5ox97RY.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/gtka4cvnxw2bm_SnkE-5LxtRYKxD-MvM_T7lYxdLAug.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hQFzaNvvDOyvg2U4FZcg-xUjctMTLEdb7tK-RYIziz8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hcS2HARtyE_tpJmmwUqYO-9e-Tshg3TF6W6XL29_cwM.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hdMwJqicGzH0qHgBqMVfxHB8u3-zdirRgb1zpnRfb6w.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/hfIPOqDhaIk7vhQa4hLyWEIQasPwJSn3H-i2egLuFvQ.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/i3Mr4BCaCS865aFe9brU973ERtfoSONrUQhX5FW509w.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jBOiy_uvOKOoBovFao2qEf6xVkGYRFmw-CR_I756N5g.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jZZQUkAYSpxGGWp7Vb_vs2S3Clde8_XKFWwjwHaBmU0.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/jiUvf7zJxbsJ9a9IiZOy06PqL6dOOfprzyXci5p8vMM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/kd10Jyu0ZXLelGbmQo03cFEKpR0qQRw-QyPPMlnY-FQ.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/ksZL57FCLWVpXdOSIHVytq_XIsGz78TdArP4aWt7uQA.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/l4Mb7Zqpi9HWWa67ftgd_ZkPTvGuhxm--tpHlgu4Eyc.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/m3gQ2mqyaWT0r9UVJriOzT0qkFiL4aZ5mhMgbbyLmyw.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/n6NcZJQK0j-WDDTq_7wksLUZBBYhGRPaW38Cua19t4E.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/nKs1V_XYWUW2uG9E7WQPaiVIvYx2I5ttwdMZ9bRsUVY.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/oB34rjWhV_SBgt62MMSw20hEYuiVTjLMILeSBjagbDo.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/oydOGeF22N2dttfBS68MA5PK4ofniHzd-LgBwVmJvI4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pA1evykc28UE2mszGRw015uHbbmBCU9gFZIcU8Hrwls.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pBYZnqSsUmggXeAPQXcQrZSfrScDOEsZQdeXOIqfHaA.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pENTpYJeZrQ-P80SXbbHVaXcEd7kaOm1bZRItPVK7OE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pYKIN2HEVMsGLDogjm8iDQ_4W8iGEq98NsJbOdA822o.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pb5zODtFDJpqFTtbh09cOhwG1mZowQW1EZ-54eauNTc.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/pnDWkMT2Wf6v8kCepJzn9oEGWrxNOY-H9MlCq85zTlU.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/qJ6pwEWoy3oUs_aPayRv5D5d_F7oEyNIzxrJCaEpcpM.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rJ88KtO5aBXvyE9sef5emc-MsAJaTna76vG5TNayYa4.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rPyv5XauOpu-aOgB95w5ZSl6jCFUGvS8YE1h1eZZID0.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rcp1tSuAgctt1BdAdUoGgD_UtZeD7w3rLuANXg8YU58.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/rfYNZtDWV3PCq5a57xTyj0-_iC1Psq1TaxWG86fXR2A.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/smmkAgu4NNfatz7vllczgMFH_tckzDUAmeV3WvmmsRE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/szDR2M9t_osfhsE_agd1lcIjKrl5nwRmORMlyoWxTus.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/t4fruk986h623vtFPEW2sALWc3kl3ayPfBbgOzRm6Cs.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tJDIhl16K_HokIK8UZx1y9hy-Ne6lk9ie2kMbsHVxdY.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tSDhvZZY2gcpUHWppbAMQYQL0iNPOc3Vo2HHrnqKlDw.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tYYAXLHGMIYQ1Ls-jw8thSBIzdixEpeQC2kg6irmEy0.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tgFK--mLRPBU9bZUb6lc4kt6Qq9-Ux6AAfG7mDQBpu8.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/tpBLVkgP9PSqHqSHfPf9ZLar0vHGOTCOUl0FKOqGN54.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/u0B5U9yc20iANkRJi6-SiyL9U5RMrThVGmgnWSR2Rew.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/vtTvV-oGMOMD-l4YDTQRNHPiFRebBjqEfL9IoavTSGE.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/w3rjuVGSs9xUdab61H5KOFtoRsLH5abeNs9uloC2b94.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/w9RM9nORoFIx66Xb5PwygnSIR3922sjAkZkXvyeykgE.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wK-n2sVphfsiv5g-IV404qJkdw6Skfo5wk55Yf8IHfs.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/wbSRRkjts6z6OP0o88ZwLIz6Za9iMMeF8F1FMAubBxc.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xE9HS1AxUe2VZv8zzVYALc75Yhv53_LPpQNxurm0oSI.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xX3QhVOxSxG9HjrdSvjeQoK1iBpYJX3Kw-yjea2vSuo.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xa4ZU0nFS4WqDtDriIXMlwNURqkpUm_djZVqiz0ZynA.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/xzsnr6Bgr0MP4j4FZVUcYBADfkQCUHoShH_9hGp0ckk.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/y6xgU0dR6b-1_hjgAZAhFFq1T9zGZ8yjUQzOefGpcu8.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yJ9qoQ6ZeEPmm4ttulT9hdYPemgTF4VUSdmFjmr9Vpw.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yJuZz8Lopwyvmy-rto8ycJ0nOLWeWSobCY8z-421Bec.cache +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yLZAaEFOlOcJfmo3pRpRpTiQMzBcqSRTrZYb_pJpTBs.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/yV9yGvP4CDMeEbb4ff4n_Hzu-GuBbM-S39cIE1WQy6Y.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/y_4IIBYH_ItxQoEeXjWm9Igwn6hAkl669CNtYfo0fyI.cache +0 -1
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zF_lfa7oUNjRgtepm9Ufi0DCzN_IXCJTDHRrH-JHu7Q.cache +0 -2
- data/test/dummy/tmp/cache/assets/development/sprockets/v3.0/zeqXKQA7lKQnvEaJsDO404ZaYCV0dk57z-SXUkfmz24.cache +0 -1
- data/test/dummy/vendor/assets/javascripts/revelry_content/content.js +0 -4
@@ -1,20 +1,19 @@
|
|
1
1
|
# @cjsx
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
mixins: [RevelryContent.EditModeListener]
|
3
|
+
Rev.Content.TopBar = React.createClass
|
4
|
+
mixins: [Rev.Content.EditModeListener]
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
</
|
19
|
-
|
20
|
-
|
16
|
+
</div>
|
17
|
+
</nav>
|
18
|
+
else
|
19
|
+
<span />
|
@@ -1,295 +1,327 @@
|
|
1
1
|
# @cjsx
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
-
|
26
|
-
<
|
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.
|
218
|
-
<
|
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
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
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
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
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
|