kowl 0.0.1

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 (250) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +7 -0
  3. data/README.md +383 -0
  4. data/bin/console +14 -0
  5. data/bin/kowl +106 -0
  6. data/bin/setup +13 -0
  7. data/lib/kowl/actions.rb +240 -0
  8. data/lib/kowl/docker.rb +447 -0
  9. data/lib/kowl/generators/README.md +5 -0
  10. data/lib/kowl/generators/action_generator.rb +113 -0
  11. data/lib/kowl/generators/admin_generator.rb +114 -0
  12. data/lib/kowl/generators/assets_generator.rb +188 -0
  13. data/lib/kowl/generators/base.rb +40 -0
  14. data/lib/kowl/generators/circleci_generator.rb +11 -0
  15. data/lib/kowl/generators/config_generator.rb +180 -0
  16. data/lib/kowl/generators/controller_generator.rb +64 -0
  17. data/lib/kowl/generators/database_generator.rb +42 -0
  18. data/lib/kowl/generators/decorators_generator.rb +16 -0
  19. data/lib/kowl/generators/docker_generator.rb +40 -0
  20. data/lib/kowl/generators/dotfiles_generator.rb +73 -0
  21. data/lib/kowl/generators/libs_generator.rb +19 -0
  22. data/lib/kowl/generators/mailer_generator.rb +58 -0
  23. data/lib/kowl/generators/misc_generator.rb +20 -0
  24. data/lib/kowl/generators/overrides/app_base.rb +15 -0
  25. data/lib/kowl/generators/overrides/app_builder.rb +58 -0
  26. data/lib/kowl/generators/overrides/app_generator.rb +249 -0
  27. data/lib/kowl/generators/pages_generator.rb +46 -0
  28. data/lib/kowl/generators/routes_generator.rb +20 -0
  29. data/lib/kowl/generators/sidekiq_generator.rb +31 -0
  30. data/lib/kowl/generators/staging_generator.rb +14 -0
  31. data/lib/kowl/generators/test_generator.rb +42 -0
  32. data/lib/kowl/generators/text_files_generator.rb +41 -0
  33. data/lib/kowl/generators/users_and_auth_generator.rb +143 -0
  34. data/lib/kowl/generators/uuid_generator.rb +39 -0
  35. data/lib/kowl/generators/views_and_helpers_generator.rb +104 -0
  36. data/lib/kowl/geodb.rb +96 -0
  37. data/lib/kowl/helpers.rb +139 -0
  38. data/lib/kowl/templates/Gemfile.erb.tt +253 -0
  39. data/lib/kowl/templates/README.md.erb +33 -0
  40. data/lib/kowl/templates/app/assets/javascripts/semantic.js.tt +26 -0
  41. data/lib/kowl/templates/app/assets/stylesheets/administrate/application.scss +44 -0
  42. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/_custom_styling.scss +38 -0
  43. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/application-mailer.scss +1 -0
  44. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/application.scss +14 -0
  45. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_alerts.scss +7 -0
  46. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_errors.scss +28 -0
  47. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/components/_navbar.scss +17 -0
  48. data/lib/kowl/templates/app/assets/stylesheets/bootstrap/variables.scss +6 -0
  49. data/lib/kowl/templates/app/assets/stylesheets/semantic/_custom_styling.scss +20 -0
  50. data/lib/kowl/templates/app/assets/stylesheets/semantic/application.scss +24 -0
  51. data/lib/kowl/templates/app/controllers/admin/application_controller.rb +29 -0
  52. data/lib/kowl/templates/app/controllers/admin/login_activities_controller.rb +29 -0
  53. data/lib/kowl/templates/app/controllers/admin/users_controller.rb +37 -0
  54. data/lib/kowl/templates/app/controllers/concerns/auth/authentication.rb +18 -0
  55. data/lib/kowl/templates/app/controllers/concerns/auth/authorization.rb +20 -0
  56. data/lib/kowl/templates/app/controllers/concerns/auth/error_handlers.rb +27 -0
  57. data/lib/kowl/templates/app/controllers/concerns/noauth/error_handlers.rb +25 -0
  58. data/lib/kowl/templates/app/controllers/users_controller.rb +17 -0
  59. data/lib/kowl/templates/app/dashboards/login_activity_dashboard.rb.tt +59 -0
  60. data/lib/kowl/templates/app/dashboards/rich_text_body_dashboard.rb.tt +17 -0
  61. data/lib/kowl/templates/app/dashboards/user_dashboard.rb.tt +60 -0
  62. data/lib/kowl/templates/app/fields/gravatar_field.rb +10 -0
  63. data/lib/kowl/templates/app/fields/rich_text_area_field.rb +8 -0
  64. data/lib/kowl/templates/app/inputs/rich_text_area_input.rb +11 -0
  65. data/lib/kowl/templates/app/javascript/administrate/components/date_time_picker.js.tt +32 -0
  66. data/lib/kowl/templates/app/javascript/administrate/components/table.js.tt +49 -0
  67. data/lib/kowl/templates/app/javascript/administrate/index.js +3 -0
  68. data/lib/kowl/templates/app/javascript/packs/administrate.js.tt +21 -0
  69. data/lib/kowl/templates/app/javascript/packs/semantic.js +11 -0
  70. data/lib/kowl/templates/app/mailers/application_mailer.rb +7 -0
  71. data/lib/kowl/templates/app/mailers/devise_mailer.rb +5 -0
  72. data/lib/kowl/templates/app/models/login_activity.rb.tt +29 -0
  73. data/lib/kowl/templates/app/models/user.rb.tt +72 -0
  74. data/lib/kowl/templates/app/policies/application_policy.rb +38 -0
  75. data/lib/kowl/templates/app/policies/login_activity_policy.rb +35 -0
  76. data/lib/kowl/templates/app/policies/user_policy.rb +43 -0
  77. data/lib/kowl/templates/app/views/admin/templates/navigation.erb.tt +23 -0
  78. data/lib/kowl/templates/app/views/admin/views/application/_javascript.html.erb +21 -0
  79. data/lib/kowl/templates/app/views/admin/views/users/_collection.html.erb +102 -0
  80. data/lib/kowl/templates/app/views/admin/views/users/_form.html.erb +46 -0
  81. data/lib/kowl/templates/app/views/admin/views/users/edit.html.erb +36 -0
  82. data/lib/kowl/templates/app/views/admin/views/users/index.html.erb +66 -0
  83. data/lib/kowl/templates/app/views/fields/gravatar_field/_form.html.erb +6 -0
  84. data/lib/kowl/templates/app/views/fields/gravatar_field/_index.html.erb +1 -0
  85. data/lib/kowl/templates/app/views/fields/gravatar_field/_show.html.erb +1 -0
  86. data/lib/kowl/templates/app/views/fields/rich_text_area_field/_form.html.erb +6 -0
  87. data/lib/kowl/templates/app/views/fields/rich_text_area_field/_index.html.erb +1 -0
  88. data/lib/kowl/templates/app/views/fields/rich_text_area_field/_show.html.erb +1 -0
  89. data/lib/kowl/templates/app/views/layouts/admin.html.erb.tt +47 -0
  90. data/lib/kowl/templates/app/views/layouts/devise_mailer.html.erb +14 -0
  91. data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.erb +18 -0
  92. data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.haml +17 -0
  93. data/lib/kowl/templates/app/views/pages/welcome/bootstrap.html.slim +17 -0
  94. data/lib/kowl/templates/app/views/pages/welcome/default.html.erb +0 -0
  95. data/lib/kowl/templates/app/views/pages/welcome/default.html.haml +0 -0
  96. data/lib/kowl/templates/app/views/pages/welcome/default.html.slim +0 -0
  97. data/lib/kowl/templates/app/views/pages/welcome/semantic.html.erb +20 -0
  98. data/lib/kowl/templates/app/views/pages/welcome/semantic.html.haml +17 -0
  99. data/lib/kowl/templates/app/views/pages/welcome/semantic.html.slim +17 -0
  100. data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.erb.tt +5 -0
  101. data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.haml.tt +3 -0
  102. data/lib/kowl/templates/app/views/shared/footer/bootstrap.html.slim.tt +3 -0
  103. data/lib/kowl/templates/app/views/shared/footer/semantic.html.erb.tt +7 -0
  104. data/lib/kowl/templates/app/views/shared/footer/semantic.html.haml.tt +5 -0
  105. data/lib/kowl/templates/app/views/shared/footer/semantic.html.slim.tt +5 -0
  106. data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.erb.tt +51 -0
  107. data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.haml.tt +36 -0
  108. data/lib/kowl/templates/app/views/shared/navigation/bootstrap.html.slim.tt +36 -0
  109. data/lib/kowl/templates/app/views/shared/navigation/semantic.html.erb.tt +48 -0
  110. data/lib/kowl/templates/app/views/shared/navigation/semantic.html.haml.tt +36 -0
  111. data/lib/kowl/templates/app/views/shared/navigation/semantic.html.slim.tt +36 -0
  112. data/lib/kowl/templates/app/workers/scheduler/pghero_scheduler.rb +11 -0
  113. data/lib/kowl/templates/config/autoprefixer.yml +4 -0
  114. data/lib/kowl/templates/config/db/mysql.yml.tt +43 -0
  115. data/lib/kowl/templates/config/db/oracle.yml.tt +29 -0
  116. data/lib/kowl/templates/config/db/postgresql.yml.tt +37 -0
  117. data/lib/kowl/templates/config/db/sqlite3.yml.tt +20 -0
  118. data/lib/kowl/templates/config/db/sqlserver.yml.tt +28 -0
  119. data/lib/kowl/templates/config/initializers/administrate.rb.tt +9 -0
  120. data/lib/kowl/templates/config/initializers/bullet.rb +21 -0
  121. data/lib/kowl/templates/config/initializers/devise-security.rb +44 -0
  122. data/lib/kowl/templates/config/initializers/devise_argon2.rb +29 -0
  123. data/lib/kowl/templates/config/initializers/faker.rb +6 -0
  124. data/lib/kowl/templates/config/initializers/generators.rb.tt +31 -0
  125. data/lib/kowl/templates/config/initializers/geocoder.rb +10 -0
  126. data/lib/kowl/templates/config/initializers/letter_opener.rb +13 -0
  127. data/lib/kowl/templates/config/initializers/lockbox.rb +11 -0
  128. data/lib/kowl/templates/config/initializers/logging.rb +6 -0
  129. data/lib/kowl/templates/config/initializers/lograge.rb +7 -0
  130. data/lib/kowl/templates/config/initializers/logstop.rb +4 -0
  131. data/lib/kowl/templates/config/initializers/middleware.rb +9 -0
  132. data/lib/kowl/templates/config/initializers/oj.rb +7 -0
  133. data/lib/kowl/templates/config/initializers/pagy.rb.tt +16 -0
  134. data/lib/kowl/templates/config/initializers/postmark.rb +8 -0
  135. data/lib/kowl/templates/config/initializers/rack_attack.rb.tt +71 -0
  136. data/lib/kowl/templates/config/initializers/sass.rb +5 -0
  137. data/lib/kowl/templates/config/initializers/sidekiq.rb +11 -0
  138. data/lib/kowl/templates/config/initializers/simpleform/semantic.rb +225 -0
  139. data/lib/kowl/templates/config/initializers/slim.rb +6 -0
  140. data/lib/kowl/templates/config/initializers/sparkpost.rb +13 -0
  141. data/lib/kowl/templates/config/routes.rb.tt +28 -0
  142. data/lib/kowl/templates/config/sidekiq.yml.tt +17 -0
  143. data/lib/kowl/templates/db/migrations/create_action_text_tables.action_text.rb.tt +16 -0
  144. data/lib/kowl/templates/db/migrations/create_active_storage_tables.active_storage.rb.tt +29 -0
  145. data/lib/kowl/templates/db/migrations/devise.rb.tt +59 -0
  146. data/lib/kowl/templates/db/migrations/login_activities.rb.tt +41 -0
  147. data/lib/kowl/templates/db/seeds.rb.tt +14 -0
  148. data/lib/kowl/templates/docker/Dockerfile.alpine.tt +92 -0
  149. data/lib/kowl/templates/docker/Dockerfile.debian.tt +133 -0
  150. data/lib/kowl/templates/docker/docker-compose.yml.tt +55 -0
  151. data/lib/kowl/templates/docker/mysql/Dockerfile.tt +15 -0
  152. data/lib/kowl/templates/dotfiles/Aptfile.tt +34 -0
  153. data/lib/kowl/templates/dotfiles/Brewfile.tt +49 -0
  154. data/lib/kowl/templates/dotfiles/Procfile.tt +12 -0
  155. data/lib/kowl/templates/dotfiles/codeclimate.yml +76 -0
  156. data/lib/kowl/templates/dotfiles/coffeelint.json +10 -0
  157. data/lib/kowl/templates/dotfiles/coffeelintignore +15 -0
  158. data/lib/kowl/templates/dotfiles/dockerignore +23 -0
  159. data/lib/kowl/templates/dotfiles/editorconfig +13 -0
  160. data/lib/kowl/templates/dotfiles/env.tt +58 -0
  161. data/lib/kowl/templates/dotfiles/erb-lint.yml +10 -0
  162. data/lib/kowl/templates/dotfiles/erdconfig.tt +24 -0
  163. data/lib/kowl/templates/dotfiles/eslintignore +20 -0
  164. data/lib/kowl/templates/dotfiles/eslintrc.js +31 -0
  165. data/lib/kowl/templates/dotfiles/fasterer.yml +14 -0
  166. data/lib/kowl/templates/dotfiles/foreman +1 -0
  167. data/lib/kowl/templates/dotfiles/gitattributes +15 -0
  168. data/lib/kowl/templates/dotfiles/gitignore +69 -0
  169. data/lib/kowl/templates/dotfiles/haml-lint.yml +23 -0
  170. data/lib/kowl/templates/dotfiles/jsbeautifyrc +15 -0
  171. data/lib/kowl/templates/dotfiles/jshintrc +3 -0
  172. data/lib/kowl/templates/dotfiles/mailmap +3 -0
  173. data/lib/kowl/templates/dotfiles/nvmrc +1 -0
  174. data/lib/kowl/templates/dotfiles/prettierignore +21 -0
  175. data/lib/kowl/templates/dotfiles/prettierrc.js +62 -0
  176. data/lib/kowl/templates/dotfiles/pryrc +7 -0
  177. data/lib/kowl/templates/dotfiles/rspec +3 -0
  178. data/lib/kowl/templates/dotfiles/rubocop.yml.tt +78 -0
  179. data/lib/kowl/templates/dotfiles/scss-lint.yml +132 -0
  180. data/lib/kowl/templates/dotfiles/simplecov +19 -0
  181. data/lib/kowl/templates/dotfiles/slim-lint.yml +23 -0
  182. data/lib/kowl/templates/dotfiles/slugignore +10 -0
  183. data/lib/kowl/templates/dotfiles/yamllint +7 -0
  184. data/lib/kowl/templates/dotfiles/yarnclean +46 -0
  185. data/lib/kowl/templates/lib/tasks/stats.rake +42 -0
  186. data/lib/kowl/templates/tests/factories/README.md +0 -0
  187. data/lib/kowl/templates/tests/factories/login_activity.rb +11 -0
  188. data/lib/kowl/templates/tests/factories/user.rb +11 -0
  189. data/lib/kowl/templates/tests/minitest/README.md +3 -0
  190. data/lib/kowl/templates/tests/minitest/application_system_test_case.rb +7 -0
  191. data/lib/kowl/templates/tests/minitest/controllers/pages_controller_test.rb +10 -0
  192. data/lib/kowl/templates/tests/minitest/models/login_activity_test.rb +8 -0
  193. data/lib/kowl/templates/tests/minitest/models/user_test.rb +15 -0
  194. data/lib/kowl/templates/tests/minitest/policies/login_activity_policy_test.rb +7 -0
  195. data/lib/kowl/templates/tests/minitest/policies/user_policy_test.rb +7 -0
  196. data/lib/kowl/templates/tests/minitest/support/capybara.rb +38 -0
  197. data/lib/kowl/templates/tests/minitest/support/database_cleaner.rb +20 -0
  198. data/lib/kowl/templates/tests/minitest/support/database_cleaner_support.rb +15 -0
  199. data/lib/kowl/templates/tests/minitest/support/deferred_garbage_collection.rb +21 -0
  200. data/lib/kowl/templates/tests/minitest/support/devise.rb +16 -0
  201. data/lib/kowl/templates/tests/minitest/support/factories.rb +6 -0
  202. data/lib/kowl/templates/tests/minitest/support/formulaic.rb +8 -0
  203. data/lib/kowl/templates/tests/minitest/support/helpers/devise_helper.rb +57 -0
  204. data/lib/kowl/templates/tests/minitest/support/papertrail.rb +17 -0
  205. data/lib/kowl/templates/tests/minitest/support/pundit.rb +0 -0
  206. data/lib/kowl/templates/tests/minitest/support/shoulda.rb +11 -0
  207. data/lib/kowl/templates/tests/minitest/support/simplecov.rb +8 -0
  208. data/lib/kowl/templates/tests/minitest/test_helper.rb +17 -0
  209. data/lib/kowl/templates/tests/rspec/README.md +9 -0
  210. data/lib/kowl/templates/tests/rspec/controllers/admin/application_controller_spec.rb +12 -0
  211. data/lib/kowl/templates/tests/rspec/controllers/admin/users_controller_spec.rb +14 -0
  212. data/lib/kowl/templates/tests/rspec/controllers/pages_controller_spec.rb +10 -0
  213. data/lib/kowl/templates/tests/rspec/features/README.md +15 -0
  214. data/lib/kowl/templates/tests/rspec/features/visitor_sign_up_spec.rb +25 -0
  215. data/lib/kowl/templates/tests/rspec/helpers/application_helper_spec.rb +7 -0
  216. data/lib/kowl/templates/tests/rspec/helpers/pages_helper_spec.rb +15 -0
  217. data/lib/kowl/templates/tests/rspec/models/login_activity_spec.rb +11 -0
  218. data/lib/kowl/templates/tests/rspec/models/user_spec.rb +21 -0
  219. data/lib/kowl/templates/tests/rspec/policies/login_activity_policy_spec.rb +59 -0
  220. data/lib/kowl/templates/tests/rspec/policies/user_policy_spec.rb +56 -0
  221. data/lib/kowl/templates/tests/rspec/rails_helper.rb +72 -0
  222. data/lib/kowl/templates/tests/rspec/requests/pages_spec.rb +11 -0
  223. data/lib/kowl/templates/tests/rspec/spec_helper.rb +96 -0
  224. data/lib/kowl/templates/tests/rspec/support/bullet.rb +17 -0
  225. data/lib/kowl/templates/tests/rspec/support/capybara.rb +37 -0
  226. data/lib/kowl/templates/tests/rspec/support/controller_testing.rb +10 -0
  227. data/lib/kowl/templates/tests/rspec/support/database_cleaner.rb +55 -0
  228. data/lib/kowl/templates/tests/rspec/support/deferred_garbage_collection.rb +32 -0
  229. data/lib/kowl/templates/tests/rspec/support/devise.rb +21 -0
  230. data/lib/kowl/templates/tests/rspec/support/factories.rb +5 -0
  231. data/lib/kowl/templates/tests/rspec/support/formulaic.rb +8 -0
  232. data/lib/kowl/templates/tests/rspec/support/helpers/devise_helpers.rb +56 -0
  233. data/lib/kowl/templates/tests/rspec/support/papertrail.rb +5 -0
  234. data/lib/kowl/templates/tests/rspec/support/pi_ci.rb +6 -0
  235. data/lib/kowl/templates/tests/rspec/support/pundit.rb +6 -0
  236. data/lib/kowl/templates/tests/rspec/support/shoulda.rb +10 -0
  237. data/lib/kowl/templates/tests/rspec/support/sidekiq.rb +10 -0
  238. data/lib/kowl/templates/tests/rspec/support/simplecov.rb +7 -0
  239. data/lib/kowl/templates/tests/rspec/support/warden.rb +8 -0
  240. data/lib/kowl/templates/text_files/AUTHORS.md +4 -0
  241. data/lib/kowl/templates/text_files/CHANGELOG.md.tt +12 -0
  242. data/lib/kowl/templates/text_files/CODE_OF_CONDUCT.md +76 -0
  243. data/lib/kowl/templates/text_files/TODO.md +7 -0
  244. data/lib/kowl/templates/text_files/VERSION +1 -0
  245. data/lib/kowl/templates/text_files/humans.txt.tt +15 -0
  246. data/lib/kowl/templates/text_files/robots.txt.tt +6 -0
  247. data/lib/kowl/templates/text_files/security.txt +6 -0
  248. data/lib/kowl/version.rb +9 -0
  249. data/lib/kowl.rb +18 -0
  250. metadata +404 -0
@@ -0,0 +1,44 @@
1
+ @charset 'utf-8';
2
+
3
+ @import 'reset/normalize';
4
+ @import 'selectize';
5
+ @import 'datetime_picker';
6
+
7
+ @import 'library/clearfix';
8
+ @import 'library/data-label';
9
+ @import 'library/variables';
10
+
11
+ @import 'base/forms';
12
+ @import 'base/layout';
13
+ @import 'base/lists';
14
+ @import 'base/tables';
15
+ @import 'base/typography';
16
+
17
+ @import 'components/app-container';
18
+ @import 'components/attributes';
19
+ @import 'components/buttons';
20
+ @import 'components/cells';
21
+ @import 'components/field-unit';
22
+ @import 'components/flashes';
23
+ @import 'components/form-actions';
24
+ @import 'components/main-content';
25
+ @import 'components/navigation';
26
+ @import 'components/pagination';
27
+ @import 'components/search';
28
+
29
+ @import 'utilities/text-color';
30
+
31
+ // Plugins and additional Components
32
+ @import 'font-awesome-sprockets';
33
+ @import 'font-awesome';
34
+
35
+ // Smooth out the fonts and text displayed on the dashboard
36
+ body {
37
+ /* Antialias the font for smooth text rendering */
38
+ text-rendering: optimizeLegibility;
39
+ -webkit-font-smoothing: antialiased;
40
+ -moz-font-smoothing: grayscale;
41
+ -moz-osx-font-smoothing: grayscale;
42
+ font-smoothing: antialiased;
43
+ font-smooth: always;
44
+ }
@@ -0,0 +1,38 @@
1
+ html {
2
+ position: relative;
3
+ min-height: 100%;
4
+ }
5
+
6
+ body {
7
+ /* Antialias the font for smooth text rendering */
8
+ text-rendering: optimizeLegibility;
9
+ -webkit-font-smoothing: antialiased;
10
+ -moz-font-smoothing: grayscale;
11
+ -moz-osx-font-smoothing: grayscale;
12
+ font-smoothing: antialiased;
13
+ font-smooth: always;
14
+ // Margin bottom by footer height
15
+ margin-bottom: 60px;
16
+ }
17
+
18
+ h1, h2, h3, h4, h5 {
19
+ .text-muted {
20
+ color: #969ea5 !important;
21
+ font-size: 90% !important;
22
+ font-style: italic;
23
+ }
24
+ }
25
+
26
+ /* Sticky footer styles
27
+ -------------------------------------------------- */
28
+ // => https://getbootstrap.com/docs/4.1/examples/sticky-footer-navbar/sticky-footer-navbar.css
29
+ .footer {
30
+ background-color: #f5f5f5;
31
+ bottom: 0;
32
+ /* Vertically center the text there */
33
+ /* Set the fixed height of the footer here */
34
+ height: 60px;
35
+ line-height: 60px;
36
+ position: absolute;
37
+ width: 100%;
38
+ }
@@ -0,0 +1 @@
1
+ @import 'bootstrap-email';
@@ -0,0 +1,14 @@
1
+ @import 'variables';
2
+ @import 'bootstrap';
3
+ @import 'font-awesome-sprockets';
4
+ @import 'font-awesome';
5
+ @import 'custom_styling';
6
+
7
+
8
+ // equivalent to 'require_tree .' if required
9
+ // @import '/\*';
10
+
11
+ //////////////////////////////////////////////////
12
+ // Components
13
+ //////////////////////////////////////////////////
14
+ @import 'components/errors';
@@ -0,0 +1,7 @@
1
+ // src: https://hackerthemes.com/kit/
2
+ // Add nifty borders to alery boxes
3
+ // @each $color, $value in $theme-colors {
4
+ // .alert-#{$color} {
5
+ // box-shadow: 3px 3px theme-color-level($color, -3);
6
+ // }
7
+ // }
@@ -0,0 +1,28 @@
1
+ // Form error messages
2
+ #error_explanation {
3
+ color: #f00;
4
+
5
+ ul {
6
+ list-style: none;
7
+ margin: 0 0 18px;
8
+ }
9
+ }
10
+
11
+ .field_with_errors label,
12
+ .field_with_errors .form-control-feedback,
13
+ .field_with_errors .form-control-label,
14
+ .field_with_errors .col-form-label,
15
+ .field_with_errors .form-check-label,
16
+ .field_with_errors .custom-control {
17
+ color: $softcherry;
18
+ }
19
+
20
+ .field_with_errors .form-control {
21
+ color: $softcherry;
22
+ }
23
+
24
+ .field_with_errors .input-group-addon {
25
+ background-color: #fdf7f7;
26
+ border-color: $softcherry;
27
+ color: $softcherry;
28
+ }
@@ -0,0 +1,17 @@
1
+ // Overrride the default navbar styles to let links be a little more visible
2
+ // .navbar {
3
+ // a.nav-link {
4
+ // color: rgba($white, 0.65) !important;
5
+ //
6
+ // &:hover { color: rgba($white, 0.85) !important; }
7
+ // }
8
+ //
9
+ // // link styling when you're logged in as another user
10
+ // .current_user {
11
+ // a {
12
+ // color: lighten($black, 20%) !important;
13
+ //
14
+ // &:hover { color: $black !important; }
15
+ // }
16
+ // }
17
+ // }
@@ -0,0 +1,6 @@
1
+ // Bootstrap: https://github.com/twbs/bootstrap-rubygem/blob/0a29879d8df1e6f7feba0ff29df7734c1695b009/assets/stylesheets/bootstrap/_variables.scss
2
+
3
+ //////////////////////////////
4
+ //
5
+ //////////////////////////////
6
+ $softcherry: #ff705b;
@@ -0,0 +1,20 @@
1
+ html { min-height: 100%; margin: 0; padding: 0; position: relative; }
2
+ body { background-color: #FFFFFF; }
3
+
4
+ .ui.menu .item img.logo { margin-right: 1.5em; }
5
+ .main.container { min-height: 90%; padding-top: 5em; }
6
+ .wireframe { margin-top: 2em; }
7
+ // spacing add, otherwise form buttons will end up right along the bottom of previous input
8
+ .form-actions { margin: 1em 0; }
9
+
10
+ // NAVBAR
11
+ a.header.item { margin-right: 1rem !important; }
12
+
13
+ // link styling when you're logged in
14
+ span.current_user {
15
+ color: darken(#26d4cb, 7%) !important;
16
+
17
+ &:hover {
18
+ color: #26d4cb !important;
19
+ }
20
+ }
@@ -0,0 +1,24 @@
1
+ @import 'semantic-ui';
2
+ @import 'font-awesome-sprockets';
3
+ @import 'font-awesome';
4
+ @import 'custom_styling';
5
+
6
+ body {
7
+ /* Antialias the font for smooth text rendering */
8
+ text-rendering: optimizeLegibility;
9
+ -webkit-font-smoothing: antialiased;
10
+ -moz-font-smoothing: grayscale;
11
+ -moz-osx-font-smoothing: grayscale;
12
+ font-smoothing: antialiased;
13
+ font-smooth: always;
14
+ margin: 0;
15
+ padding: 0;
16
+ }
17
+
18
+ .footer {
19
+ background-color: #f5f5f5;
20
+ bottom: 0;
21
+ height: 1.5rem;
22
+ position: absolute;
23
+ width: 100%;
24
+ }
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ # All Administrate controllers inherit from this `Admin::ApplicationController`,
4
+ # making it the ideal place to put authentication logic or other
5
+ # before_actions.
6
+ #
7
+ # If you want to add pagination or other controller-level concerns,
8
+ # you're free to overwrite the RESTful controller actions.
9
+ module Admin
10
+ class ApplicationController < Administrate::ApplicationController
11
+ protect_from_forgery with: :exception
12
+ before_action :authenticate_user!
13
+ before_action :ensure_admin!
14
+ impersonates :user
15
+ include Pundit
16
+ include Administrate::Punditize
17
+ include ErrorHandlers
18
+
19
+ # Override this value to specify the number of elements to display at a time
20
+ # on index pages. Defaults to 20.
21
+ # def records_per_page
22
+ # params[:per_page] || 20
23
+ # end
24
+ # Used to ensure only superusers and staff members can access the admin dashboards
25
+ def ensure_admin!
26
+ redirect_to root_path, notice: 'Not authorized!' unless current_user.present? && current_user.staff_member?
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class LoginActivitiesController < Admin::ApplicationController
5
+ # To customize the behavior of this controller,
6
+ # you can overwrite any of the RESTful actions. For example:
7
+ #
8
+ # def index
9
+ # super
10
+ # @resources = LoginActivity.
11
+ # page(params[:page]).
12
+ # per(10)
13
+ # end
14
+
15
+ # Define a custom finder by overriding the `find_resource` method:
16
+ # def find_resource(param)
17
+ # LoginActivity.find_by!(slug: param)
18
+ # end
19
+
20
+ # See https://administrate-prototype.herokuapp.com/customizing_controller_actions
21
+ # for more information
22
+ def order
23
+ @order ||= Administrate::Order.new(
24
+ params.fetch(resource_name, {}).fetch(:order, 'created_at'),
25
+ params.fetch(resource_name, {}).fetch(:direction, 'desc')
26
+ )
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class UsersController < Admin::ApplicationController
5
+ # This is because we want to allow the admins to log out of user accounts that aren't admins
6
+ # To customize the behavior of this controller,
7
+ # you can overwrite any of the RESTful actions. For example:
8
+ #
9
+ # def index
10
+ # super
11
+ # @resources = User.
12
+ # page(params[:page]).
13
+ # per(10)
14
+ # end
15
+
16
+ # Define a custom finder by overriding the `find_resource` method:
17
+ # def find_resource(param)
18
+ # User.find_by!(slug: param)
19
+ # end
20
+
21
+ # See https://administrate-prototype.herokuapp.com/customizing_controller_actions
22
+ # for more information
23
+
24
+ # This is used in the users dashboard to limit assigning roles
25
+ # => because an admin should be able to assign any role to any user
26
+ # => but someone with a staff role should not be able to assign themselves or anyone else as an admin
27
+
28
+ # Used for setting a default sort for the users
29
+ # => https://github.com/thoughtbot/administrate/issues/442
30
+ def order
31
+ @order ||= Administrate::Order.new(
32
+ params.fetch(resource_name, {}).fetch(:order, 'created_at'),
33
+ params.fetch(resource_name, {}).fetch(:direction, 'desc')
34
+ )
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authentication
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_action :configure_permitted_parameters, if: :devise_controller?
8
+ end
9
+
10
+ private
11
+
12
+ # If you want to add custom attributes to the devise to be editable (ie: username)
13
+ def configure_permitted_parameters
14
+ # devise_parameter_sanitizer.permit(:username)
15
+ # devise_parameter_sanitizer.permit(:username)
16
+ # devise_parameter_sanitizer.permit(:username)
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authorization
4
+ extend ActiveSupport::Concern
5
+ include Pundit
6
+
7
+ included do
8
+ # after_action :verify_authorized, unless: :skip_auth_controllers
9
+ end
10
+
11
+ def pundit_useies
12
+ current_user
13
+ end
14
+
15
+ private
16
+
17
+ def skip_auth_controllers
18
+ devise_controller? || controller_path == 'pages'
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ErrorHandlers
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ rescue_from ActiveRecord::RecordInvalid, with: :render_not_found
8
+ rescue_from ActiveRecord::RecordNotFound, with: :render_not_found
9
+ # rescue_from ActionController::RoutingError, with: :render_not_found
10
+ rescue_from ActionView::MissingTemplate do
11
+ render plain: '404 Not found', status: :not_found
12
+ end
13
+ # Pundit Authorization
14
+ rescue_from Pundit::NotAuthorizedError, with: :not_authorized
15
+ end
16
+
17
+ private
18
+
19
+ def not_authorized
20
+ flash[:alert] = 'You are not authorized to access this page.'
21
+ redirect_to(request.referer || root_path)
22
+ end
23
+
24
+ def render_not_found
25
+ render template: 'errors/404', status: :not_found
26
+ end
27
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ErrorHandlers
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ rescue_from ActiveRecord::RecordInvalid, with: :render_not_found
8
+ rescue_from ActiveRecord::RecordNotFound, with: :render_not_found
9
+ # rescue_from ActionController::RoutingError, with: :render_not_found
10
+ rescue_from ActionView::MissingTemplate do
11
+ render plain: '404 Not found', status: 404
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def not_authorized
18
+ flash[:alert] = 'You are not authorized to access this page.'
19
+ redirect_to(request.referer || root_path)
20
+ end
21
+
22
+ def render_not_found
23
+ render template: 'errors/404', status: 404
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UsersController < ApplicationController
4
+ include Pundit
5
+
6
+ def impersonate
7
+ user = User.find(params[:id])
8
+ authorize user
9
+ impersonate_user(user)
10
+ redirect_to root_path
11
+ end
12
+
13
+ def stop_impersonating
14
+ stop_impersonating_user
15
+ redirect_to(request.referer || root_path)
16
+ end
17
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'administrate/base_dashboard'
4
+ class LoginActivityDashboard < Administrate::BaseDashboard
5
+ # ATTRIBUTE_TYPES
6
+ # a hash that describes the type of each of the model's fields.
7
+ #
8
+ # Each different type represents an Administrate::Field object,
9
+ # which determines how the attribute is displayed
10
+ # on pages throughout the dashboard.
11
+ ATTRIBUTE_TYPES = {
12
+ # user: Field::Polymorphic,
13
+ user: Field::BelongsTo,
14
+ <%- if options[:uuid] -%>
15
+ id: Field::String,
16
+ <%- else -%>
17
+ id: Field::Number,
18
+ <%- end -%>
19
+ scope: Field::String,
20
+ strategy: Field::String,
21
+ identity: Field::String,
22
+ success: Field::Boolean,
23
+ failure_reason: Field::String,
24
+ context: Field::String,
25
+ ip: Field::String,
26
+ user_agent: Field::Text,
27
+ referrer: Field::Text,
28
+ city: Field::String,
29
+ region: Field::String,
30
+ country: Field::String,
31
+ latitude: Field::Number.with_options(decimals: 2),
32
+ longitude: Field::Number.with_options(decimals: 2),
33
+ created_at: Field::DateTime
34
+ }.freeze
35
+
36
+ # COLLECTION_ATTRIBUTES
37
+ # an array of attributes that will be displayed on the model's index page.
38
+ #
39
+ # By default, it's limited to four items to reduce clutter on index pages.
40
+ # Feel free to add, remove, or rearrange items.
41
+ COLLECTION_ATTRIBUTES = %i[id identity scope strategy].freeze
42
+
43
+ # SHOW_PAGE_ATTRIBUTES
44
+ # an array of attributes that will be displayed on the model's show page.
45
+ SHOW_PAGE_ATTRIBUTES = %i[user id scope strategy identity success failure_reason context ip user_agent referrer
46
+ city region country latitude longitude created_at].freeze
47
+
48
+ # FORM_ATTRIBUTES
49
+ # an array of attributes that will be displayed
50
+ # on the model's form (`new` and `edit`) pages.
51
+ FORM_ATTRIBUTES = %i[user scope strategy identity success failure_reason context ip user_agent referrer city region country latitude longitude].freeze
52
+
53
+ # Overwrite this method to customize how login activities are displayed
54
+ # across all pages of the admin dashboard.
55
+ #
56
+ # def display_resource(login_activity)
57
+ # "LoginActivity ##{login_activity.id}"
58
+ # end
59
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'administrate/base_dashboard'
4
+ class RichTextBodyDashboard < Administrate::BaseDashboard
5
+ ATTRIBUTE_TYPES = {
6
+ name: Field::String,
7
+ body: Field::Text,
8
+ <%- if options[:uuid] -%>
9
+ record_id: Field::String,
10
+ <%- else -%>
11
+ record_id: Field::BelongsTo,
12
+ <%- end -%>
13
+ record_type: Field::String
14
+ }.freeze
15
+
16
+ FORM_ATTRIBUTES = %i[body].freeze
17
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'administrate/base_dashboard'
4
+ class UserDashboard < Administrate::BaseDashboard
5
+ # ATTRIBUTE_TYPES
6
+ # a hash that describes the type of each of the model's fields.
7
+ #
8
+ # Each different type represents an Administrate::Field object,
9
+ # which determines how the attribute is displayed
10
+ # on pages throughout the dashboard.
11
+ ATTRIBUTE_TYPES = {
12
+ login_activities: Field::HasMany,
13
+ <%- if options[:uuid] -%>
14
+ id: Field::String,
15
+ <%- else -%>
16
+ id: Field::Number,
17
+ <%- end -%>
18
+ avatar: GravatarField,
19
+ email: Field::String,
20
+ encrypted_password: Field::String,
21
+ reset_password_token: Field::String,
22
+ reset_password_sent_at: Field::DateTime,
23
+ remember_created_at: Field::DateTime,
24
+ sign_in_count: Field::Number,
25
+ current_sign_in_at: Field::DateTime,
26
+ last_sign_in_at: Field::DateTime,
27
+ current_sign_in_ip: Field::String,
28
+ last_sign_in_ip: Field::String,
29
+ failed_attempts: Field::Number,
30
+ unlock_token: Field::String,
31
+ locked_at: Field::DateTime,
32
+ role: Field::Select.with_options(collection: User.roles.keys),
33
+ created_at: Field::DateTime,
34
+ updated_at: Field::DateTime
35
+ }.freeze
36
+
37
+ # COLLECTION_ATTRIBUTES
38
+ # an array of attributes that will be displayed on the model's index page.
39
+ #
40
+ # By default, it's limited to four items to reduce clutter on index pages.
41
+ # Feel free to add, remove, or rearrange items.
42
+ COLLECTION_ATTRIBUTES = %i[id avatar email last_sign_in_at role].freeze
43
+
44
+ # SHOW_PAGE_ATTRIBUTES
45
+ # an array of attributes that will be displayed on the model's show page.
46
+ SHOW_PAGE_ATTRIBUTES = %i[id email sign_in_count current_sign_in_at current_sign_in_ip failed_attempts
47
+ locked_at role created_at updated_at login_activities].freeze
48
+
49
+ # FORM_ATTRIBUTES
50
+ # an array of attributes that will be displayed
51
+ # on the model's form (`new` and `edit`) pages.
52
+ FORM_ATTRIBUTES = %i[email locked_at role].freeze
53
+
54
+ # Overwrite this method to customize how users are displayed
55
+ # across all pages of the admin dashboard.
56
+ #
57
+ # def display_resource(user)
58
+ # "User ##{user.id}"
59
+ # end
60
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest/md5'
4
+ class GravatarField < Administrate::Field::Base
5
+ def gravatar_url
6
+ email_address = data.downcase
7
+ hash = Digest::MD5.hexdigest(email_address)
8
+ "http://www.gravatar.com/avatar/#{hash}"
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'administrate/field/text'
4
+ class RichTextAreaField < Administrate::Field::Text
5
+ def to_s
6
+ data
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Enable RichTextArea input type for simple_form
4
+ # => https://github.com/plataformatec/simple_form/issues/1638
5
+ class RichTextAreaInput < SimpleForm::Inputs::Base
6
+ def input(wrapper_options = nil)
7
+ merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
8
+
9
+ @builder.rich_text_area(attribute_name, merged_input_options)
10
+ end
11
+ end
@@ -0,0 +1,32 @@
1
+ import flatpickr from 'flatpickr'
2
+
3
+ function bindDateTimePickers() {
4
+ [...document.querySelectorAll('[data-type="time"]')].forEach((time) => {
5
+ flatpickr(time, {
6
+ enableTime: true,
7
+ enableSeconds: true,
8
+ noCalendar: true,
9
+ altInput: true,
10
+ altFormat: ' h:i:S K',
11
+ dateFormat: 'H:i:S' // H:i
12
+ })
13
+ });
14
+
15
+ [...document.querySelectorAll('[data-type="datetime"]')].forEach((time) => {
16
+ flatpickr(time, {
17
+ enableTime: true,
18
+ altInput: true,
19
+ altFormat: 'F J (D), Y - h:i:S K',
20
+ dateFormat: 'Z' // Y-m-d H:i
21
+ })
22
+ })
23
+ }
24
+
25
+
26
+ <%- if options[:skip_turbolinks] -%>
27
+ $(document).ready(function () {
28
+ <%- else -%>
29
+ document.addEventListener('turbolinks:load', function () {
30
+ <%- end -%>
31
+ bindDateTimePickers()
32
+ })