hyper-kitten-tables 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +3 -0
  5. data/lib/hyper-kitten-tables.rb +6 -0
  6. data/lib/hyper_kitten_tables/components/table.rb +7 -0
  7. data/lib/hyper_kitten_tables/concerns/table.rb +134 -0
  8. data/lib/hyper_kitten_tables/engine.rb +5 -0
  9. data/lib/hyper_kitten_tables/version.rb +3 -0
  10. data/lib/tasks/tables_tasks.rake +4 -0
  11. data/spec/components/table_spec.rb +209 -0
  12. data/spec/dummy/Rakefile +6 -0
  13. data/spec/dummy/app/assets/config/manifest.js +3 -0
  14. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  15. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  16. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  17. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  18. data/spec/dummy/app/controllers/pages_controller.rb +3 -0
  19. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  20. data/spec/dummy/app/jobs/application_job.rb +7 -0
  21. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  22. data/spec/dummy/app/models/application_record.rb +3 -0
  23. data/spec/dummy/app/views/hyper_kitten_meow/pages/hardcoded_page.html.haml +4 -0
  24. data/spec/dummy/app/views/pages/app_hardcoded_page.html.haml +4 -0
  25. data/spec/dummy/app/views/pages/show.html.haml +3 -0
  26. data/spec/dummy/bin/rails +4 -0
  27. data/spec/dummy/bin/rake +4 -0
  28. data/spec/dummy/bin/setup +33 -0
  29. data/spec/dummy/config/application.rb +26 -0
  30. data/spec/dummy/config/boot.rb +5 -0
  31. data/spec/dummy/config/cable.yml +10 -0
  32. data/spec/dummy/config/database.yml +16 -0
  33. data/spec/dummy/config/environment.rb +5 -0
  34. data/spec/dummy/config/environments/development.rb +56 -0
  35. data/spec/dummy/config/environments/production.rb +93 -0
  36. data/spec/dummy/config/environments/test.rb +50 -0
  37. data/spec/dummy/config/initializers/assets.rb +12 -0
  38. data/spec/dummy/config/initializers/content_security_policy.rb +26 -0
  39. data/spec/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  40. data/spec/dummy/config/initializers/inflections.rb +16 -0
  41. data/spec/dummy/config/initializers/permissions_policy.rb +11 -0
  42. data/spec/dummy/config/locales/en.yml +33 -0
  43. data/spec/dummy/config/puma.rb +43 -0
  44. data/spec/dummy/config/routes.rb +3 -0
  45. data/spec/dummy/config/storage.yml +34 -0
  46. data/spec/dummy/config.ru +6 -0
  47. data/spec/dummy/db/migrate/20220805173427_create_action_text_tables.action_text.rb +26 -0
  48. data/spec/dummy/db/migrate/20220805173748_create_active_storage_tables.active_storage.rb +57 -0
  49. data/spec/dummy/db/schema.rb +134 -0
  50. data/spec/dummy/db/seeds.rb +23 -0
  51. data/spec/dummy/log/development.log +12689 -0
  52. data/spec/dummy/log/test.log +58989 -0
  53. data/spec/dummy/public/404.html +67 -0
  54. data/spec/dummy/public/422.html +67 -0
  55. data/spec/dummy/public/500.html +66 -0
  56. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  57. data/spec/dummy/public/apple-touch-icon.png +0 -0
  58. data/spec/dummy/public/favicon.ico +0 -0
  59. data/spec/dummy/storage/it/lb/itlbn65dlnw20cu9ii6epg3qtr0h +0 -0
  60. data/spec/dummy/tmp/capybara/screenshot_2022-10-04-16-58-13.777.html +148 -0
  61. data/spec/dummy/tmp/capybara/screenshot_2022-10-04-16-59-53.965.html +148 -0
  62. data/spec/dummy/tmp/capybara/screenshot_2022-10-04-17-00-42.481.html +148 -0
  63. data/spec/dummy/tmp/capybara/screenshot_2022-10-04-17-01-02.940.html +229 -0
  64. data/spec/dummy/tmp/capybara/screenshot_2022-10-04-17-03-02.450.html +229 -0
  65. data/spec/dummy/tmp/capybara/screenshot_2022-10-04-17-03-17.782.html +148 -0
  66. data/spec/dummy/tmp/capybara/screenshot_2022-10-04-17-03-57.376.html +229 -0
  67. data/spec/dummy/tmp/capybara/screenshot_2022-10-04-17-07-53.996.html +232 -0
  68. data/spec/dummy/tmp/capybara/screenshot_2022-10-04-17-13-29.891.html +232 -0
  69. data/spec/dummy/tmp/capybara/screenshot_2022-10-04-17-13-56.197.html +232 -0
  70. data/spec/dummy/tmp/capybara/screenshot_2022-10-04-17-15-26.557.html +232 -0
  71. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-14-43-43.563.html +165 -0
  72. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-14-45-19.375.html +157 -0
  73. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-15-29-06.088.html +1 -0
  74. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-15-29-06.102.html +1 -0
  75. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-15-29-06.116.html +1 -0
  76. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-15-29-06.193.html +1 -0
  77. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-15-29-06.206.html +1 -0
  78. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-26-51.644.html +96 -0
  79. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-26-54.957.html +91 -0
  80. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-30-28.415.html +91 -0
  81. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-30-34.037.html +96 -0
  82. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-43-01.197.html +91 -0
  83. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-43-04.942.html +96 -0
  84. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-45-09.535.html +96 -0
  85. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-45-14.082.html +91 -0
  86. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-45-26.094.html +96 -0
  87. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-45-26.446.html +91 -0
  88. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-57-08.858.html +96 -0
  89. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-57-11.332.html +91 -0
  90. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-58-08.456.html +91 -0
  91. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-16-58-08.832.html +96 -0
  92. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-02-35.674.html +91 -0
  93. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-02-39.415.html +96 -0
  94. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-03-38.082.html +96 -0
  95. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-03-38.564.html +91 -0
  96. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-04-08.143.html +91 -0
  97. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-04-08.472.html +96 -0
  98. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-04-34.570.html +91 -0
  99. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-04-40.657.html +96 -0
  100. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-04-52.001.html +91 -0
  101. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-04-52.410.html +96 -0
  102. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-06-40.488.html +91 -0
  103. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-06-46.796.html +96 -0
  104. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-09-28.828.html +91 -0
  105. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-09-32.459.html +96 -0
  106. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-09-45.931.html +91 -0
  107. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-09-46.318.html +96 -0
  108. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-12-03.393.html +96 -0
  109. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-12-06.113.html +91 -0
  110. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-12-11.111.html +96 -0
  111. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-12-16.868.html +91 -0
  112. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-15-57.176.html +91 -0
  113. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-16-03.653.html +96 -0
  114. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-29-32.001.html +91 -0
  115. data/spec/dummy/tmp/capybara/screenshot_2022-10-05-17-29-34.702.html +96 -0
  116. data/spec/dummy/tmp/capybara/screenshot_2022-10-11-16-24-42.604.html +85 -0
  117. data/spec/dummy/tmp/capybara/screenshot_2022-10-11-16-25-08.753.html +76 -0
  118. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-02-02.769.html +0 -0
  119. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-08-16.549.html +0 -0
  120. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-09-06.988.html +0 -0
  121. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-10-02.456.html +0 -0
  122. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-12-58.767.html +0 -0
  123. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-13-38.946.html +0 -0
  124. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-20-23.040.html +0 -0
  125. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-22-40.972.html +31 -0
  126. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-30-50.210.html +31 -0
  127. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-31-41.216.html +31 -0
  128. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-42-03.223.html +31 -0
  129. data/spec/dummy/tmp/capybara/screenshot_2022-10-12-14-53-14.392.html +0 -0
  130. data/spec/dummy/tmp/capybara/screenshot_2022-10-18-16-52-54.850.html +35 -0
  131. data/spec/dummy/tmp/capybara/screenshot_2022-10-18-16-53-03.992.html +0 -0
  132. data/spec/dummy/tmp/capybara/screenshot_2022-10-18-16-53-40.077.html +0 -0
  133. data/spec/dummy/tmp/capybara/screenshot_2022-10-18-16-53-55.068.html +0 -0
  134. data/spec/dummy/tmp/capybara/screenshot_2022-10-18-16-54-08.951.html +0 -0
  135. data/spec/dummy/tmp/capybara/screenshot_2022-10-18-16-54-39.523.html +0 -0
  136. data/spec/dummy/tmp/capybara/screenshot_2022-10-18-16-55-46.588.html +0 -0
  137. data/spec/dummy/tmp/capybara/screenshot_2022-10-18-16-56-53.302.html +0 -0
  138. data/spec/dummy/tmp/capybara/screenshot_2022-10-18-16-57-13.712.html +0 -0
  139. data/spec/dummy/tmp/capybara/screenshot_2022-10-18-16-59-55.972.html +0 -0
  140. data/spec/dummy/tmp/capybara/screenshot_2022-10-18-17-04-32.815.html +0 -0
  141. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-19-45-56.483.html +1 -0
  142. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-19-51-45.853.html +54 -0
  143. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-19-56-35.870.html +1 -0
  144. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-19-58-42.872.html +1 -0
  145. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-19-59-53.565.html +1 -0
  146. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-25-51.194.html +1 -0
  147. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-27-18.607.html +1 -0
  148. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-34-14.915.html +1 -0
  149. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-34-23.967.html +1 -0
  150. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-35-20.693.html +0 -0
  151. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-38-57.780.html +1 -0
  152. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-39-59.478.html +1 -0
  153. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-40-32.807.html +0 -0
  154. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-40-42.311.html +1 -0
  155. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-41-40.038.html +1 -0
  156. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-43-18.794.html +1 -0
  157. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-45-22.057.html +9 -0
  158. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-46-07.622.html +1 -0
  159. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-46-23.810.html +1 -0
  160. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-46-42.443.html +9 -0
  161. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-47-03.378.html +1 -0
  162. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-49-38.206.html +1 -0
  163. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-49-53.697.html +1 -0
  164. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-50-25.359.html +1 -0
  165. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-50-43.146.html +9 -0
  166. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-51-18.812.html +54 -0
  167. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-51-55.591.html +78 -0
  168. data/spec/dummy/tmp/capybara/screenshot_2022-11-16-20-52-42.586.html +78 -0
  169. data/spec/dummy/tmp/development_secret.txt +1 -0
  170. data/spec/dummy/tmp/restart.txt +0 -0
  171. data/spec/features/admin/create_first_user_spec.rb +34 -0
  172. data/spec/features/admin/menu_management_spec.rb +137 -0
  173. data/spec/features/admin/page_management_spec.rb +73 -0
  174. data/spec/features/admin/post_management_spec.rb +80 -0
  175. data/spec/features/admin/users_management_spec.rb +65 -0
  176. data/spec/features/display_pages_spec.rb +45 -0
  177. data/spec/features/display_posts_spec.rb +0 -0
  178. data/spec/rails_helper.rb +13 -0
  179. metadata +502 -0
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1,9 @@
1
+ <section class='new-user'>
2
+ <h2>Welcome to <span class="translation_missing" title="translation missing: en.hyper_kitten_meow.title">Title</span></h2>
3
+ <p>Please create your first user account to get started.</p>
4
+ <form class="simple_form new_user" id="new_user" novalidate="novalidate" action="/hyper-kitten-meow/admin/first_users" accept-charset="UTF-8" method="post"><div class="mb-3 string required user_name"><label class="form-label string required" for="user_name">Name <abbr title="required">*</abbr></label><input class="form-control string required" type="text" name="user[name]" id="user_name" /></div>
5
+ <div class="mb-3 email required user_email"><label class="form-label email required" for="user_email">Email <abbr title="required">*</abbr></label><input class="form-control string email required" type="email" name="user[email]" id="user_email" /></div>
6
+ <div class="mb-3 password optional user_password"><label class="form-label password optional" for="user_password">Password</label><input class="form-control password optional" type="password" name="user[password]" id="user_password" /></div>
7
+ <div class="mb-3 password optional user_password_confirmation"><label class="form-label password optional" for="user_password_confirmation">Password confirmation</label><input class="form-control password optional" type="password" name="user[password_confirmation]" id="user_password_confirmation" /></div>
8
+ <input type="submit" name="commit" value="Create User" class="btn btn-primary" data-disable-with="Create User" />
9
+ </form></section>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1,9 @@
1
+ <section class='new-user'>
2
+ <h2>Welcome to <span class="translation_missing" title="translation missing: en.hyper_kitten_meow.title">Title</span></h2>
3
+ <p>Please create your first user account to get started.</p>
4
+ <form class="simple_form new_user" id="new_user" novalidate="novalidate" action="/hyper-kitten-meow/admin/first_users" accept-charset="UTF-8" method="post"><div class="mb-3 string required user_name"><label class="form-label string required" for="user_name">Name <abbr title="required">*</abbr></label><input class="form-control string required" type="text" name="user[name]" id="user_name" /></div>
5
+ <div class="mb-3 email required user_email"><label class="form-label email required" for="user_email">Email <abbr title="required">*</abbr></label><input class="form-control string email required" type="email" name="user[email]" id="user_email" /></div>
6
+ <div class="mb-3 password optional user_password"><label class="form-label password optional" for="user_password">Password</label><input class="form-control password optional" type="password" name="user[password]" id="user_password" /></div>
7
+ <div class="mb-3 password optional user_password_confirmation"><label class="form-label password optional" for="user_password_confirmation">Password confirmation</label><input class="form-control password optional" type="password" name="user[password_confirmation]" id="user_password_confirmation" /></div>
8
+ <input type="submit" name="commit" value="Create User" class="btn btn-primary" data-disable-with="Create User" />
9
+ </form></section>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1 @@
1
+ <html><body>You are being <a href="http://www.example.com/hyper-kitten-meow/admin">redirected</a>.</body></html>
@@ -0,0 +1,9 @@
1
+ <section class='new-user'>
2
+ <h2>Welcome to <span class="translation_missing" title="translation missing: en.hyper_kitten_meow.title">Title</span></h2>
3
+ <p>Please create your first user account to get started.</p>
4
+ <form class="simple_form new_user" id="new_user" novalidate="novalidate" action="/hyper-kitten-meow/admin/first_users" accept-charset="UTF-8" method="post"><div class="mb-3 string required user_name"><label class="form-label string required" for="user_name">Name <abbr title="required">*</abbr></label><input class="form-control string required" type="text" name="user[name]" id="user_name" /></div>
5
+ <div class="mb-3 email required user_email"><label class="form-label email required" for="user_email">Email <abbr title="required">*</abbr></label><input class="form-control string email required" type="email" name="user[email]" id="user_email" /></div>
6
+ <div class="mb-3 password optional user_password"><label class="form-label password optional" for="user_password">Password</label><input class="form-control password optional" type="password" name="user[password]" id="user_password" /></div>
7
+ <div class="mb-3 password optional user_password_confirmation"><label class="form-label password optional" for="user_password_confirmation">Password confirmation</label><input class="form-control password optional" type="password" name="user[password_confirmation]" id="user_password_confirmation" /></div>
8
+ <input type="submit" name="commit" value="Create User" class="btn btn-primary" data-disable-with="Create User" />
9
+ </form></section>
@@ -0,0 +1,54 @@
1
+ <!DOCTYPE html>
2
+ <html class='h-100'>
3
+ <head>
4
+ <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
5
+ <title>Your Title</title>
6
+ <link rel="stylesheet" crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" />
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/trix/1.3.1/trix.min.css" />
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.9.1/font/bootstrap-icons.css" />
9
+ <script type="importmap" data-turbo-track="reload">{
10
+ "imports": {
11
+ "bootstrap": "https://ga.jspm.io/npm:bootstrap@5.2.2/dist/js/bootstrap.esm.js",
12
+ "@popperjs/core": "https://ga.jspm.io/npm:@popperjs/core@2.11.6/lib/index.js",
13
+ "@hotwired/stimulus": "/assets/stimulus.min-aab608fae21f2c1bac54028a5ea332762374c7d5.js",
14
+ "@hotwired/stimulus-loading": "/assets/stimulus-loading-e367296568a6df104dc84fcfe5d1aafae5076fc0.js",
15
+ "sortablejs": "https://ga.jspm.io/npm:sortablejs@1.15.0/modular/sortable.esm.js",
16
+ "trix": "https://ga.jspm.io/npm:trix@2.0.0-beta.0/dist/trix.js",
17
+ "hyper_kitten_meow/application": "/assets/hyper_kitten_meow/application-233450bbc5437a34f4fbb75045e1b0ae337c879e.js",
18
+ "@rails/activestorage": "https://ga.jspm.io/npm:@rails/activestorage@7.0.4/app/assets/javascripts/activestorage.esm.js",
19
+ "@rails/actiontext": "https://ga.jspm.io/npm:@rails/actiontext@7.0.4/app/assets/javascripts/actiontext.js",
20
+ "hyper_kitten_meow/controllers/application": "/assets/hyper_kitten_meow/controllers/application-a45fcffa4627508814a7727d04043357d1dcedbe.js",
21
+ "hyper_kitten_meow/controllers": "/assets/hyper_kitten_meow/controllers/index-75d6331f3e6ac38720595fca892d1179c84dd34e.js",
22
+ "hyper_kitten_meow/controllers/menu_items_form_controller": "/assets/hyper_kitten_meow/controllers/menu_items_form_controller-82ceff726898a80786aca24b9ae62b5862bd41b0.js"
23
+ }
24
+ }</script>
25
+ <link rel="modulepreload" href="/assets/stimulus.min-aab608fae21f2c1bac54028a5ea332762374c7d5.js">
26
+ <link rel="modulepreload" href="/assets/stimulus-loading-e367296568a6df104dc84fcfe5d1aafae5076fc0.js">
27
+ <script src="/assets/es-module-shims.min-f7a11f41d669b1f9ca6432c0ba58580ba2b4087a.js" async="async" data-turbo-track="reload"></script>
28
+ <script type="module">import "application"</script>
29
+ <script type="module">import "hyper_kitten_meow/application"</script>
30
+
31
+ </head>
32
+ <body class='h-100'>
33
+ <div class='container-fluid h-100'>
34
+ <div class='row h-100'>
35
+ <nav class='col-md-3 col-lg-2 d-md-block sidebar bg-dark text-white d-flex flex-column'>
36
+ <h3 class='mb-3 mt-3'>Your Title</h3>
37
+ <hr>
38
+ </nav>
39
+ <div class='col-md-9 col-lg-10 mt-3 px-4'>
40
+ <section class='new-user'>
41
+ <h2>Welcome to <span class="translation_missing" title="translation missing: en.hyper_kitten_meow.title">Title</span></h2>
42
+ <p>Please create your first user account to get started.</p>
43
+ <form class="simple_form new_user" id="new_user" novalidate="novalidate" action="/hyper-kitten-meow/admin/first_users" accept-charset="UTF-8" method="post"><div class="mb-3 string required user_name"><label class="form-label string required" for="user_name">Name <abbr title="required">*</abbr></label><input class="form-control string required" type="text" name="user[name]" id="user_name" /></div>
44
+ <div class="mb-3 email required user_email"><label class="form-label email required" for="user_email">Email <abbr title="required">*</abbr></label><input class="form-control string email required" type="email" name="user[email]" id="user_email" /></div>
45
+ <div class="mb-3 password optional user_password"><label class="form-label password optional" for="user_password">Password</label><input class="form-control password optional" type="password" name="user[password]" id="user_password" /></div>
46
+ <div class="mb-3 password optional user_password_confirmation"><label class="form-label password optional" for="user_password_confirmation">Password confirmation</label><input class="form-control password optional" type="password" name="user[password_confirmation]" id="user_password_confirmation" /></div>
47
+ <input type="submit" name="commit" value="Create User" class="btn btn-primary" data-disable-with="Create User" />
48
+ </form></section>
49
+
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </body>
54
+ </html>
@@ -0,0 +1,78 @@
1
+ <!DOCTYPE html>
2
+ <html class='h-100'>
3
+ <head>
4
+ <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
5
+ <title>Your Title</title>
6
+ <link rel="stylesheet" crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" />
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/trix/1.3.1/trix.min.css" />
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.9.1/font/bootstrap-icons.css" />
9
+ <script type="importmap" data-turbo-track="reload">{
10
+ "imports": {
11
+ "bootstrap": "https://ga.jspm.io/npm:bootstrap@5.2.2/dist/js/bootstrap.esm.js",
12
+ "@popperjs/core": "https://ga.jspm.io/npm:@popperjs/core@2.11.6/lib/index.js",
13
+ "@hotwired/stimulus": "/assets/stimulus.min-aab608fae21f2c1bac54028a5ea332762374c7d5.js",
14
+ "@hotwired/stimulus-loading": "/assets/stimulus-loading-e367296568a6df104dc84fcfe5d1aafae5076fc0.js",
15
+ "sortablejs": "https://ga.jspm.io/npm:sortablejs@1.15.0/modular/sortable.esm.js",
16
+ "trix": "https://ga.jspm.io/npm:trix@2.0.0-beta.0/dist/trix.js",
17
+ "hyper_kitten_meow/application": "/assets/hyper_kitten_meow/application-233450bbc5437a34f4fbb75045e1b0ae337c879e.js",
18
+ "@rails/activestorage": "https://ga.jspm.io/npm:@rails/activestorage@7.0.4/app/assets/javascripts/activestorage.esm.js",
19
+ "@rails/actiontext": "https://ga.jspm.io/npm:@rails/actiontext@7.0.4/app/assets/javascripts/actiontext.js",
20
+ "hyper_kitten_meow/controllers/application": "/assets/hyper_kitten_meow/controllers/application-a45fcffa4627508814a7727d04043357d1dcedbe.js",
21
+ "hyper_kitten_meow/controllers": "/assets/hyper_kitten_meow/controllers/index-75d6331f3e6ac38720595fca892d1179c84dd34e.js",
22
+ "hyper_kitten_meow/controllers/menu_items_form_controller": "/assets/hyper_kitten_meow/controllers/menu_items_form_controller-82ceff726898a80786aca24b9ae62b5862bd41b0.js"
23
+ }
24
+ }</script>
25
+ <link rel="modulepreload" href="/assets/stimulus.min-aab608fae21f2c1bac54028a5ea332762374c7d5.js">
26
+ <link rel="modulepreload" href="/assets/stimulus-loading-e367296568a6df104dc84fcfe5d1aafae5076fc0.js">
27
+ <script src="/assets/es-module-shims.min-f7a11f41d669b1f9ca6432c0ba58580ba2b4087a.js" async="async" data-turbo-track="reload"></script>
28
+ <script type="module">import "application"</script>
29
+ <script type="module">import "hyper_kitten_meow/application"</script>
30
+
31
+ </head>
32
+ <body class='h-100'>
33
+ <div class='container-fluid h-100'>
34
+ <div class='row h-100'>
35
+ <nav class='col-md-3 col-lg-2 d-md-block sidebar bg-dark text-white d-flex flex-column'>
36
+ <h3 class='mb-3 mt-3'>Your Title</h3>
37
+ <hr>
38
+ <ul class='nav nav-pills flex-column mb-auto'>
39
+ <li class='nav-item'><a class="nav-link text-white" href="/hyper-kitten-meow/admin/posts">Posts</a></li>
40
+ <li class='nav-item'><a class="nav-link text-white" href="/hyper-kitten-meow/admin/pages">Pages</a></li>
41
+ <li class='nav-item'><a class="nav-link text-white" href="/hyper-kitten-meow/admin/menus">Menus</a></li>
42
+ <li class='nav-item'><a class="nav-link text-white" href="/hyper-kitten-meow/admin/tags">Tags</a></li>
43
+ <li class='nav-item'><a class="nav-link text-white" href="/hyper-kitten-meow/admin/users">Users</a></li>
44
+ </ul>
45
+ <hr>
46
+ <a class="nav-link d-flex align-items-center text-white text-decoration-none dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false" href="#"><strong>Andrew</strong>
47
+ </a><ul class='dropdown-menu dropdown-menu-dark text-small shadow'>
48
+ <li><a class="dropdown-item" href="/hyper-kitten-meow/admin/logout">Log Out</a></li>
49
+ </ul>
50
+ </nav>
51
+ <div class='col-md-9 col-lg-10 mt-3 px-4'>
52
+ <section>
53
+ <div class='d-flex justify-content-between'>
54
+ <h2>New Post</h2>
55
+ <div class='action'>
56
+ <a class="btn btn-secondary" href="/hyper-kitten-meow/admin/posts">Back to Posts</a>
57
+ </div>
58
+ </div>
59
+ <form class="simple_form new_post" id="new_post" novalidate="novalidate" action="/hyper-kitten-meow/admin/posts" accept-charset="UTF-8" method="post"><div class="mb-3 string required post_title"><label class="form-label string required" for="post_title">Title <abbr title="required">*</abbr></label><input class="form-control string required" type="text" name="post[title]" id="post_title" /></div>
60
+ <div class="mb-3 text optional post_summary"><label class="form-label text optional" for="post_summary">Summary</label><textarea class="form-control text optional" name="post[summary]" id="post_summary">
61
+ </textarea></div>
62
+ <div class="mb-3 rich_text_area required post_body"><label class="form-label rich_text_area required" for="post_body">Body <abbr title="required">*</abbr></label><input type="hidden" name="post[body]" id="post_body_trix_input_post" autocomplete="off" /><trix-editor class="form-control rich_text_area required" id="post_body" input="post_body_trix_input_post" data-direct-upload-url="http://www.example.com/rails/active_storage/direct_uploads" data-blob-url-template="http://www.example.com/rails/active_storage/blobs/redirect/:signed_id/:filename"></trix-editor></div>
63
+ <div class="mb-3 select required post_user"><label class="form-label select required" for="post_user_id">User <abbr title="required">*</abbr></label><select class="form-select select required" name="post[user_id]" id="post_user_id"><option value="" label=" "></option>
64
+ <option value="52">Andrew</option>
65
+ <option value="53">Josh</option></select></div>
66
+ <div class="mb-3 string required post_slug"><label class="form-label string required" for="post_slug">Slug <abbr title="required">*</abbr></label><input class="form-control string required" type="text" name="post[slug]" id="post_slug" /></div>
67
+ <fieldset class="mb-3 check_boxes optional post_tags"><legend class="col-form-label pt-0">Tags</legend><div class="row"></div><input type="hidden" name="post[tag_ids][]" value="" autocomplete="off" /><div class="form-check"><input class="form-check-input check_boxes optional" type="checkbox" value="1" name="post[tag_ids][]" id="post_tag_ids_1" /><label class="form-check-label collection_check_boxes" for="post_tag_ids_1">coffee</label></div></fieldset>
68
+ <hr>
69
+ <fieldset class="mb-3 boolean optional post_published"><div class="form-check"><input name="post[published]" type="hidden" value="0" autocomplete="off" /><input class="form-check-input boolean optional" type="checkbox" value="1" name="post[published]" id="post_published" /><label class="form-check-label boolean optional" for="post_published">Published</label></div></fieldset>
70
+ <input type="submit" name="commit" value="Create Post" class="btn btn-primary" data-disable-with="Create Post" />
71
+
72
+ </form></section>
73
+
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </body>
78
+ </html>
@@ -0,0 +1,78 @@
1
+ <!DOCTYPE html>
2
+ <html class='h-100'>
3
+ <head>
4
+ <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
5
+ <title>Your Title</title>
6
+ <link rel="stylesheet" crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" />
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/trix/1.3.1/trix.min.css" />
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.9.1/font/bootstrap-icons.css" />
9
+ <script type="importmap" data-turbo-track="reload">{
10
+ "imports": {
11
+ "bootstrap": "https://ga.jspm.io/npm:bootstrap@5.2.2/dist/js/bootstrap.esm.js",
12
+ "@popperjs/core": "https://ga.jspm.io/npm:@popperjs/core@2.11.6/lib/index.js",
13
+ "@hotwired/stimulus": "/assets/stimulus.min-aab608fae21f2c1bac54028a5ea332762374c7d5.js",
14
+ "@hotwired/stimulus-loading": "/assets/stimulus-loading-e367296568a6df104dc84fcfe5d1aafae5076fc0.js",
15
+ "sortablejs": "https://ga.jspm.io/npm:sortablejs@1.15.0/modular/sortable.esm.js",
16
+ "trix": "https://ga.jspm.io/npm:trix@2.0.0-beta.0/dist/trix.js",
17
+ "hyper_kitten_meow/application": "/assets/hyper_kitten_meow/application-233450bbc5437a34f4fbb75045e1b0ae337c879e.js",
18
+ "@rails/activestorage": "https://ga.jspm.io/npm:@rails/activestorage@7.0.4/app/assets/javascripts/activestorage.esm.js",
19
+ "@rails/actiontext": "https://ga.jspm.io/npm:@rails/actiontext@7.0.4/app/assets/javascripts/actiontext.js",
20
+ "hyper_kitten_meow/controllers/application": "/assets/hyper_kitten_meow/controllers/application-a45fcffa4627508814a7727d04043357d1dcedbe.js",
21
+ "hyper_kitten_meow/controllers": "/assets/hyper_kitten_meow/controllers/index-75d6331f3e6ac38720595fca892d1179c84dd34e.js",
22
+ "hyper_kitten_meow/controllers/menu_items_form_controller": "/assets/hyper_kitten_meow/controllers/menu_items_form_controller-82ceff726898a80786aca24b9ae62b5862bd41b0.js"
23
+ }
24
+ }</script>
25
+ <link rel="modulepreload" href="/assets/stimulus.min-aab608fae21f2c1bac54028a5ea332762374c7d5.js">
26
+ <link rel="modulepreload" href="/assets/stimulus-loading-e367296568a6df104dc84fcfe5d1aafae5076fc0.js">
27
+ <script src="/assets/es-module-shims.min-f7a11f41d669b1f9ca6432c0ba58580ba2b4087a.js" async="async" data-turbo-track="reload"></script>
28
+ <script type="module">import "application"</script>
29
+ <script type="module">import "hyper_kitten_meow/application"</script>
30
+
31
+ </head>
32
+ <body class='h-100'>
33
+ <div class='container-fluid h-100'>
34
+ <div class='row h-100'>
35
+ <nav class='col-md-3 col-lg-2 d-md-block sidebar bg-dark text-white d-flex flex-column'>
36
+ <h3 class='mb-3 mt-3'>Your Title</h3>
37
+ <hr>
38
+ <ul class='nav nav-pills flex-column mb-auto'>
39
+ <li class='nav-item'><a class="nav-link text-white" href="/hyper-kitten-meow/admin/posts">Posts</a></li>
40
+ <li class='nav-item'><a class="nav-link text-white" href="/hyper-kitten-meow/admin/pages">Pages</a></li>
41
+ <li class='nav-item'><a class="nav-link text-white" href="/hyper-kitten-meow/admin/menus">Menus</a></li>
42
+ <li class='nav-item'><a class="nav-link text-white" href="/hyper-kitten-meow/admin/tags">Tags</a></li>
43
+ <li class='nav-item'><a class="nav-link text-white" href="/hyper-kitten-meow/admin/users">Users</a></li>
44
+ </ul>
45
+ <hr>
46
+ <a class="nav-link d-flex align-items-center text-white text-decoration-none dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false" href="#"><strong>Andrew</strong>
47
+ </a><ul class='dropdown-menu dropdown-menu-dark text-small shadow'>
48
+ <li><a class="dropdown-item" href="/hyper-kitten-meow/admin/logout">Log Out</a></li>
49
+ </ul>
50
+ </nav>
51
+ <div class='col-md-9 col-lg-10 mt-3 px-4'>
52
+ <section>
53
+ <div class='d-flex justify-content-between'>
54
+ <h2>New Post</h2>
55
+ <div class='action'>
56
+ <a class="btn btn-secondary" href="/hyper-kitten-meow/admin/posts">Back to Posts</a>
57
+ </div>
58
+ </div>
59
+ <form class="simple_form new_post" id="new_post" novalidate="novalidate" action="/hyper-kitten-meow/admin/posts" accept-charset="UTF-8" method="post"><div class="mb-3 string required post_title"><label class="form-label string required" for="post_title">Title <abbr title="required">*</abbr></label><input class="form-control string required" type="text" name="post[title]" id="post_title" /></div>
60
+ <div class="mb-3 text optional post_summary"><label class="form-label text optional" for="post_summary">Summary</label><textarea class="form-control text optional" name="post[summary]" id="post_summary">
61
+ </textarea></div>
62
+ <div class="mb-3 rich_text_area required post_body"><label class="form-label rich_text_area required" for="post_body">Body <abbr title="required">*</abbr></label><input type="hidden" name="post[body]" id="post_body_trix_input_post" autocomplete="off" /><trix-editor class="form-control rich_text_area required" id="post_body" input="post_body_trix_input_post" data-direct-upload-url="http://www.example.com/rails/active_storage/direct_uploads" data-blob-url-template="http://www.example.com/rails/active_storage/blobs/redirect/:signed_id/:filename"></trix-editor></div>
63
+ <div class="mb-3 select required post_user"><label class="form-label select required" for="post_user_id">User <abbr title="required">*</abbr></label><select class="form-select select required" name="post[user_id]" id="post_user_id"><option value="" label=" "></option>
64
+ <option value="87">Andrew</option>
65
+ <option value="88">Josh</option></select></div>
66
+ <div class="mb-3 string required post_slug"><label class="form-label string required" for="post_slug">Slug <abbr title="required">*</abbr></label><input class="form-control string required" type="text" name="post[slug]" id="post_slug" /></div>
67
+ <fieldset class="mb-3 check_boxes optional post_tags"><legend class="col-form-label pt-0">Tags</legend><div class="row"></div><input type="hidden" name="post[tag_ids][]" value="" autocomplete="off" /><div class="form-check"><input class="form-check-input check_boxes optional" type="checkbox" value="5" name="post[tag_ids][]" id="post_tag_ids_5" /><label class="form-check-label collection_check_boxes" for="post_tag_ids_5">coffee</label></div></fieldset>
68
+ <hr>
69
+ <fieldset class="mb-3 boolean optional post_published"><div class="form-check"><input name="post[published]" type="hidden" value="0" autocomplete="off" /><input class="form-check-input boolean optional" type="checkbox" value="1" name="post[published]" id="post_published" /><label class="form-check-label boolean optional" for="post_published">Published</label></div></fieldset>
70
+ <input type="submit" name="commit" value="Create Post" class="btn btn-primary" data-disable-with="Create Post" />
71
+
72
+ </form></section>
73
+
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </body>
78
+ </html>
@@ -0,0 +1 @@
1
+ 5c4cd38aca1b322d26ba7abba365d900103096af59b0dfe84dafc25bea38598d0039d7ff7870677ff05d7c323da185e60559555ae8db2a23463c2dcae7bfedde
File without changes
@@ -0,0 +1,34 @@
1
+ require "rails_helper"
2
+
3
+ RSpec.feature "Creating the first user", :type => :feature do
4
+ context "when there are no users" do
5
+ scenario "trying to login redirects to the first user form" do
6
+ visit hyper_kitten_meow.admin_login_path
7
+
8
+ expect(page).to have_current_path(hyper_kitten_meow.new_admin_first_user_path)
9
+ end
10
+
11
+ scenario "visitor can create first user" do
12
+ visit hyper_kitten_meow.new_admin_first_user_path
13
+
14
+ fill_in "Name", with: "David Byrne"
15
+ fill_in "Email", with: "test@test.com"
16
+ fill_in "Password", with: "password"
17
+ fill_in "Password confirmation", with: "password"
18
+ click_on "Create User"
19
+
20
+ expect(page).to have_current_path(hyper_kitten_meow.admin_login_path)
21
+ expect(page).to have_text("User successfully created. Please log in.")
22
+ end
23
+ end
24
+
25
+ context "when there are users" do
26
+ scenario "trying to create a first user redirects to the login page" do
27
+ create(:user)
28
+
29
+ visit hyper_kitten_meow.new_admin_first_user_path
30
+
31
+ expect(page).to have_current_path(hyper_kitten_meow.admin_login_path)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,137 @@
1
+ require "rails_helper"
2
+
3
+ RSpec.feature "Menu management", :type => :feature do
4
+ scenario "user can view posts" do
5
+ user = create_user_and_login
6
+ menu = create(:menu, name: "My Title")
7
+
8
+ visit hyper_kitten_meow.admin_menus_path
9
+
10
+ expect(page).to have_text("My Title")
11
+ end
12
+
13
+ scenario "user can create a menu" do
14
+ user = create_user_and_login
15
+ static_page = create(:page, title: "My Page")
16
+
17
+ visit hyper_kitten_meow.new_admin_menu_path
18
+
19
+ fill_in "Name", with: "Hello World!"
20
+ select "My Page", from: "Page"
21
+ fill_in "Title", with: "My Title"
22
+ check "New window"
23
+ click_button "Create Menu"
24
+
25
+ expect(page).to have_text("Menu was successfully created.")
26
+ expect(page).to have_text("Hello World!")
27
+ menu = HyperKittenMeow::Menu.last
28
+ menu_item = menu.menu_items.first
29
+ expect(menu_item.title).to eq("My Title")
30
+ expect(menu_item.page).to eq(static_page)
31
+ expect(menu_item.new_window).to eq(true)
32
+ expect(menu_item.position).to eq(1)
33
+ end
34
+
35
+ scenario "user can edit menus" do
36
+ user = create_user_and_login(name: 'Andrew')
37
+ menu = create(:menu, name: "My Menu")
38
+ static_page = create(:page, title: "My Page")
39
+
40
+ visit hyper_kitten_meow.edit_admin_menu_path(menu)
41
+
42
+ expect(page).to have_text("My Menu")
43
+
44
+ fill_in "Name", with: "Hello World!"
45
+ select "My Page", from: "Page"
46
+ fill_in "Title", with: "My Title"
47
+ click_on "Update Menu"
48
+
49
+ expect(page).to have_text("Menu was successfully updated.")
50
+ expect(page).to have_text("Hello World!")
51
+ menu.reload
52
+ menu_item = menu.menu_items.first
53
+ expect(menu_item.title).to eq("My Title")
54
+ expect(menu_item.page).to eq(static_page)
55
+ expect(menu_item.position).to eq(1)
56
+ end
57
+
58
+ scenario "user can edit menus and add menu items", js: true do
59
+ user = create_user_and_login(name: 'Andrew')
60
+ menu = create(:menu, name: "My Menu")
61
+ static_page1 = create(:page, title: "My Page 1")
62
+ static_page2 = create(:page, title: "My Page 2")
63
+
64
+ visit hyper_kitten_meow.edit_admin_menu_path(menu)
65
+
66
+ expect(page).to have_text("My Menu")
67
+
68
+ click_on "Add Menu Item"
69
+ expect(page).to have_selector(".menu-item", count: 2)
70
+ menu_items = all(".menu-item")
71
+ within menu_items.first do
72
+ select "My Page 1", from: "Page"
73
+ fill_in "Title", with: "First Item"
74
+ end
75
+ within menu_items.last do
76
+ select "My Page 2", from: "Page"
77
+ fill_in "Title", with: "Second Item"
78
+ end
79
+ click_on "Update Menu"
80
+
81
+ expect(page).to have_text("My Menu")
82
+ menu.reload
83
+ expect(menu.menu_items.size).to eq(2)
84
+ menu_item = menu.menu_items.first
85
+ expect(menu_item.title).to eq("First Item")
86
+ expect(menu_item.page).to eq(static_page1)
87
+ expect(menu_item.position).to eq(1)
88
+ menu_item2 = menu.menu_items.last
89
+ expect(menu_item2.title).to eq("Second Item")
90
+ expect(menu_item2.page).to eq(static_page2)
91
+ expect(menu_item2.position).to eq(2)
92
+ end
93
+
94
+ scenario "user can edit menus and remove menu items", js: true do
95
+ user = create_user_and_login(name: 'Andrew')
96
+ menu = create(:menu, name: "My Menu")
97
+ static_page1 = create(:page, title: "My Page 1")
98
+ static_page2 = create(:page, title: "My Page 2")
99
+ create(:menu_item, menu: menu, page: static_page1, title: "First Item", position: 1)
100
+ create(:menu_item, menu: menu, page: static_page2, title: "Second Item", position: 2)
101
+
102
+ visit hyper_kitten_meow.edit_admin_menu_path(menu)
103
+
104
+ expect(page).to have_text("My Menu")
105
+ expect(page).to have_selector(".menu-item", count: 2)
106
+ menu_items = all(".menu-item")
107
+ within menu_items.first do
108
+ click_on "Remove"
109
+ end
110
+ click_on "Update Menu"
111
+
112
+ expect(page).to have_text("My Menu")
113
+ menu.reload
114
+ expect(menu.menu_items.size).to eq(1)
115
+ menu_item = menu.menu_items.first
116
+ expect(menu_item.title).to eq("Second Item")
117
+ expect(menu_item.page).to eq(static_page2)
118
+ expect(menu_item.position).to eq(1)
119
+ end
120
+
121
+ scenario "user can delete a menu" do
122
+ user = create_user_and_login(name: 'Andrew')
123
+ menu = create(:menu, name: "My Menu")
124
+ static_page1 = create(:page, title: "My Page 1")
125
+ static_page2 = create(:page, title: "My Page 2")
126
+ create(:menu_item, menu: menu, page: static_page1, title: "First Item", position: 1)
127
+ create(:menu_item, menu: menu, page: static_page2, title: "Second Item", position: 2)
128
+
129
+ visit hyper_kitten_meow.admin_menus_path
130
+
131
+ click_on "Delete"
132
+
133
+ expect(page).to have_text("Menu was successfully deleted.")
134
+ expect(page).to_not have_text("My Menu")
135
+ end
136
+ end
137
+
@@ -0,0 +1,73 @@
1
+ require "rails_helper"
2
+
3
+ RSpec.feature "Page management", :type => :feature do
4
+ scenario "user can view pages" do
5
+ user = create_user_and_login
6
+ static_page = create(:page, title: "My Title")
7
+
8
+ visit hyper_kitten_meow.admin_pages_path
9
+
10
+ expect(page).to have_text("My Title")
11
+ end
12
+
13
+ it "paginates pages" do
14
+ create_user_and_login
15
+ paginates(factory: :page, increment: 10, selector: '.page') do
16
+ visit hyper_kitten_meow.admin_pages_path
17
+ end
18
+ end
19
+
20
+ scenario "user can paginate through the pages" do
21
+ create_user_and_login
22
+ pages = FactoryBot.create_list(:page, 11)
23
+
24
+ visit hyper_kitten_meow.admin_pages_path
25
+ expect(page).to have_selector('.page', count: 10)
26
+ click_on('Next')
27
+
28
+ expect(page).to have_selector('.page', count: 1)
29
+ end
30
+
31
+ scenario "user can edit pages", js: true do
32
+ user = create_user_and_login
33
+ static_page = create(:page, title: "My Title")
34
+
35
+ visit hyper_kitten_meow.edit_admin_page_path(static_page)
36
+
37
+ expect(page).to have_text("My Title")
38
+
39
+ fill_in "Title", with: "Hello World!"
40
+ fill_in "Slug", with: "my slug"
41
+ fill_in_rich_text_area "Body", with: "Fuzzy waffle!"
42
+ check "Published"
43
+ click_on "Update Page"
44
+
45
+ expect(current_path).to eq(hyper_kitten_meow.admin_pages_path)
46
+ expect(page).to have_text("Hello World!")
47
+ expect(page).to have_text("my-slug")
48
+ end
49
+
50
+ scenario "user can create pages", js: true do
51
+ user = create_user_and_login
52
+
53
+ visit hyper_kitten_meow.new_admin_page_path
54
+ fill_in "Title", with: "Hello World!"
55
+ fill_in_rich_text_area "Body", with: "Fuzzy waffle!"
56
+ check "Published"
57
+ click_on "Create Page"
58
+
59
+ expect(current_path).to eq(hyper_kitten_meow.admin_pages_path)
60
+ expect(page).to have_text("Hello World!")
61
+ expect(page).to have_text("Page successfully created.")
62
+ end
63
+
64
+ scenario "user can fix invalid pages", js: true do
65
+ user = create_user_and_login
66
+ visit hyper_kitten_meow.new_admin_page_path
67
+
68
+ fill_in "Title", with: ""
69
+ click_on "Create Page"
70
+
71
+ expect(page).to have_text("Title can't be blank")
72
+ end
73
+ end