message_train 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.rspec +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +7 -0
  7. data/Gemfile +51 -0
  8. data/LICENSE.txt +20 -0
  9. data/README.rdoc +83 -0
  10. data/Rakefile +71 -0
  11. data/VERSION +1 -0
  12. data/app/assets/javascripts/message_train.js +138 -0
  13. data/app/assets/stylesheets/message_train.scss +107 -0
  14. data/app/controllers/message_train/application_controller.rb +64 -0
  15. data/app/controllers/message_train/boxes_controller.rb +37 -0
  16. data/app/controllers/message_train/conversations_controller.rb +38 -0
  17. data/app/controllers/message_train/messages_controller.rb +74 -0
  18. data/app/controllers/message_train/participants_controller.rb +36 -0
  19. data/app/helpers/message_train/application_helper.rb +4 -0
  20. data/app/helpers/message_train/boxes_helper.rb +30 -0
  21. data/app/helpers/message_train/conversations_helper.rb +73 -0
  22. data/app/helpers/message_train/messages_helper.rb +58 -0
  23. data/app/models/message_train/attachment.rb +17 -0
  24. data/app/models/message_train/box.rb +268 -0
  25. data/app/models/message_train/conversation.rb +101 -0
  26. data/app/models/message_train/ignore.rb +18 -0
  27. data/app/models/message_train/message.rb +146 -0
  28. data/app/models/message_train/receipt.rb +70 -0
  29. data/app/views/application/404.html.haml +3 -0
  30. data/app/views/message_train/application/results.json.jbuilder +8 -0
  31. data/app/views/message_train/boxes/_dropdown_list.html.haml +5 -0
  32. data/app/views/message_train/boxes/_list_item.html.haml +5 -0
  33. data/app/views/message_train/boxes/_widget.html.haml +6 -0
  34. data/app/views/message_train/boxes/show.html.haml +47 -0
  35. data/app/views/message_train/conversations/_conversation.html.haml +9 -0
  36. data/app/views/message_train/conversations/_deleted_toggle.html.haml +1 -0
  37. data/app/views/message_train/conversations/_ignored_toggle.html.haml +4 -0
  38. data/app/views/message_train/conversations/_read_toggle.html.haml +4 -0
  39. data/app/views/message_train/conversations/_toggle.html.haml +1 -0
  40. data/app/views/message_train/conversations/_trashed_toggle.html.haml +4 -0
  41. data/app/views/message_train/conversations/show.html.haml +11 -0
  42. data/app/views/message_train/conversations/show.json.jbuilder +2 -0
  43. data/app/views/message_train/messages/_deleted_toggle.html.haml +1 -0
  44. data/app/views/message_train/messages/_form.html.haml +8 -0
  45. data/app/views/message_train/messages/_message.html.haml +35 -0
  46. data/app/views/message_train/messages/_read_toggle.html.haml +4 -0
  47. data/app/views/message_train/messages/_toggle.html.haml +1 -0
  48. data/app/views/message_train/messages/_trashed_toggle.html.haml +4 -0
  49. data/app/views/message_train/messages/edit.html.haml +2 -0
  50. data/app/views/message_train/messages/new.html.haml +2 -0
  51. data/app/views/message_train/messages/show.json.jbuilder +2 -0
  52. data/app/views/message_train/participants/_field.html.haml +4 -0
  53. data/app/views/message_train/participants/_participant.json.jbuilder +5 -0
  54. data/app/views/message_train/participants/index.json.jbuilder +3 -0
  55. data/app/views/message_train/participants/show.json.jbuilder +1 -0
  56. data/bin/rails +12 -0
  57. data/config/initializers/bootstrap_pager_config.rb +10 -0
  58. data/config/initializers/date_time.rb +5 -0
  59. data/config/locales/en.yml +50 -0
  60. data/config/routes.rb +11 -0
  61. data/db/migrate/20150721145319_create_message_train_conversations.rb +9 -0
  62. data/db/migrate/20150721160322_create_message_train_messages.rb +14 -0
  63. data/db/migrate/20150721161144_create_message_train_attachments.rb +10 -0
  64. data/db/migrate/20150721161940_create_message_train_receipts.rb +16 -0
  65. data/db/migrate/20150721163838_create_message_train_ignores.rb +11 -0
  66. data/lib/generators/message_train/install/install_generator.rb +30 -0
  67. data/lib/generators/message_train/install/templates/initializer.rb +10 -0
  68. data/lib/generators/message_train/utils.rb +16 -0
  69. data/lib/message_train/configuration.rb +35 -0
  70. data/lib/message_train/engine.rb +19 -0
  71. data/lib/message_train/localization.rb +31 -0
  72. data/lib/message_train/mixin.rb +83 -0
  73. data/lib/message_train/version.rb +7 -0
  74. data/lib/message_train.rb +20 -0
  75. data/lib/tasks/message_train_tasks.rake +0 -0
  76. data/message_train.gemspec +325 -0
  77. data/night_train.gemspec +274 -0
  78. data/spec/controllers/message_train/boxes_controller_spec.rb +82 -0
  79. data/spec/controllers/message_train/conversations_controller_spec.rb +86 -0
  80. data/spec/controllers/message_train/messages_controller_spec.rb +210 -0
  81. data/spec/controllers/message_train/participants_controller_spec.rb +35 -0
  82. data/spec/dummy/.rspec +2 -0
  83. data/spec/dummy/Rakefile +6 -0
  84. data/spec/dummy/app/assets/files/message_train/attachments/1917-Boys_Race_Above-Wiki.jpg +0 -0
  85. data/spec/dummy/app/assets/files/message_train/attachments/ACD_Silverbarn's_Mayumi.jpg +0 -0
  86. data/spec/dummy/app/assets/files/message_train/attachments/ACD_obedience.jpg +0 -0
  87. data/spec/dummy/app/assets/files/message_train/attachments/A_Man_and_His_Dog.jpg +0 -0
  88. data/spec/dummy/app/assets/files/message_train/attachments/Alaskan_Malamute_agility_a-frame.jpg +0 -0
  89. data/spec/dummy/app/assets/files/message_train/attachments/American_water_spaniel_02.jpg +0 -0
  90. data/spec/dummy/app/assets/files/message_train/attachments/Aport_konkurs_rybnik.jpg +0 -0
  91. data/spec/dummy/app/assets/files/message_train/attachments/Askerhytta.jpg +0 -0
  92. data/spec/dummy/app/assets/files/message_train/attachments/Bambisj.jpg +0 -0
  93. data/spec/dummy/app/assets/files/message_train/attachments/Cattle_dog_skating.jpg +0 -0
  94. data/spec/dummy/app/assets/files/message_train/attachments/Dog's_Olympics_training_ground_-_geograph.org.uk_-_660324.jpg +0 -0
  95. data/spec/dummy/app/assets/files/message_train/attachments/DogShowHierarchy.png +0 -0
  96. data/spec/dummy/app/assets/files/message_train/attachments/Dog_weight_pull.jpg +0 -0
  97. data/spec/dummy/app/assets/files/message_train/attachments/Draghuntpostcard.jpg +0 -0
  98. data/spec/dummy/app/assets/files/message_train/attachments/Esham_51.JPG +0 -0
  99. data/spec/dummy/app/assets/files/message_train/attachments/FastCourseExample.jpg +0 -0
  100. data/spec/dummy/app/assets/files/message_train/attachments/Fotos_joel_141.JPG +0 -0
  101. data/spec/dummy/app/assets/files/message_train/attachments/Galgo_Spanish_male_brindle.jpg +0 -0
  102. data/spec/dummy/app/assets/files/message_train/attachments/Golden-retriever-carlos-bei-der-dummyarbeit.jpg +0 -0
  103. data/spec/dummy/app/assets/files/message_train/attachments/Habavk.jpg +0 -0
  104. data/spec/dummy/app/assets/files/message_train/attachments/Haie_rci.svg +1714 -0
  105. data/spec/dummy/app/assets/files/message_train/attachments/Hanging_18.jpg +0 -0
  106. data/spec/dummy/app/assets/files/message_train/attachments/Hundewa.jpg +0 -0
  107. data/spec/dummy/app/assets/files/message_train/attachments/K9ProSports_AttackOnHandler.jpg +0 -0
  108. data/spec/dummy/app/assets/files/message_train/attachments/K9ProSports_heel.jpg +0 -0
  109. data/spec/dummy/app/assets/files/message_train/attachments/K9Pro_Civil_agitation.JPG +0 -0
  110. data/spec/dummy/app/assets/files/message_train/attachments/TrainingSchutzhundRetrieveOverWall.jpg +0 -0
  111. data/spec/dummy/app/assets/files/message_train/attachments/example.pdf +0 -0
  112. data/spec/dummy/app/assets/files/message_train/attachments/letterlegal5.doc +0 -0
  113. data/spec/dummy/app/assets/files/message_train/attachments/pdf-sample.pdf +0 -0
  114. data/spec/dummy/app/assets/files/message_train/attachments/sample.pdf +0 -0
  115. data/spec/dummy/app/assets/files/message_train/attachments/tips.doc +0 -0
  116. data/spec/dummy/app/assets/files/message_train/attachments/wd-spectools-word-sample-04.doc +0 -0
  117. data/spec/dummy/app/assets/images/logo.svg +140 -0
  118. data/spec/dummy/app/assets/javascripts/application.js +17 -0
  119. data/spec/dummy/app/assets/stylesheets/application.css.scss +35 -0
  120. data/spec/dummy/app/controllers/application_controller.rb +14 -0
  121. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  122. data/spec/dummy/app/mailers/.keep +0 -0
  123. data/spec/dummy/app/models/.keep +0 -0
  124. data/spec/dummy/app/models/group.rb +19 -0
  125. data/spec/dummy/app/models/role.rb +10 -0
  126. data/spec/dummy/app/models/user.rb +23 -0
  127. data/spec/dummy/app/views/layouts/_top_navigation.html.haml +5 -0
  128. data/spec/dummy/app/views/layouts/application.html.haml +29 -0
  129. data/spec/dummy/bin/bundle +3 -0
  130. data/spec/dummy/bin/rails +4 -0
  131. data/spec/dummy/bin/rake +4 -0
  132. data/spec/dummy/bin/setup +29 -0
  133. data/spec/dummy/config/application.rb +40 -0
  134. data/spec/dummy/config/boot.rb +5 -0
  135. data/spec/dummy/config/database.yml +25 -0
  136. data/spec/dummy/config/environment.rb +5 -0
  137. data/spec/dummy/config/environments/development.rb +41 -0
  138. data/spec/dummy/config/environments/production.rb +79 -0
  139. data/spec/dummy/config/environments/test.rb +42 -0
  140. data/spec/dummy/config/initializers/assets.rb +11 -0
  141. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  142. data/spec/dummy/config/initializers/bootstrap_leather.rb +7 -0
  143. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  144. data/spec/dummy/config/initializers/devise.rb +265 -0
  145. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  146. data/spec/dummy/config/initializers/inflections.rb +16 -0
  147. data/spec/dummy/config/initializers/message_train.rb +10 -0
  148. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  149. data/spec/dummy/config/initializers/paperclip.rb +2 -0
  150. data/spec/dummy/config/initializers/rolify.rb +7 -0
  151. data/spec/dummy/config/initializers/session_store.rb +3 -0
  152. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  153. data/spec/dummy/config/locales/devise.en.yml +60 -0
  154. data/spec/dummy/config/locales/en.yml +23 -0
  155. data/spec/dummy/config/routes.rb +5 -0
  156. data/spec/dummy/config/secrets.yml +22 -0
  157. data/spec/dummy/config/unused/temporary_i18n_debugging.rb +12 -0
  158. data/spec/dummy/config.ru +4 -0
  159. data/spec/dummy/db/migrate/20150721140013_devise_create_users.rb +42 -0
  160. data/spec/dummy/db/migrate/20150721141009_rolify_create_roles.rb +19 -0
  161. data/spec/dummy/db/migrate/20150721141128_create_groups.rb +11 -0
  162. data/spec/dummy/db/migrate/20150721150307_add_display_name_column_to_users.rb +6 -0
  163. data/spec/dummy/db/migrate/20150724142846_create_message_train_conversations.night_train.rb +10 -0
  164. data/spec/dummy/db/migrate/20150724142847_create_message_train_messages.night_train.rb +15 -0
  165. data/spec/dummy/db/migrate/20150724142848_create_message_train_attachments.night_train.rb +11 -0
  166. data/spec/dummy/db/migrate/20150724142849_create_message_train_receipts.night_train.rb +17 -0
  167. data/spec/dummy/db/migrate/20150724142850_create_message_train_ignores.night_train.rb +12 -0
  168. data/spec/dummy/db/schema.rb +121 -0
  169. data/spec/dummy/db/seeds/conversations.seeds.rb +86 -0
  170. data/spec/dummy/db/seeds/development/conversations.seeds.rb +9 -0
  171. data/spec/dummy/db/seeds/groups.seeds.rb +9 -0
  172. data/spec/dummy/db/seeds/test/conversations.seeds.rb +9 -0
  173. data/spec/dummy/db/seeds/users.seeds.rb +15 -0
  174. data/spec/dummy/db/seeds.rb +0 -0
  175. data/spec/dummy/db/test.sqlite3 +0 -0
  176. data/spec/dummy/lib/assets/.keep +0 -0
  177. data/spec/dummy/log/.keep +0 -0
  178. data/spec/dummy/public/404.html +67 -0
  179. data/spec/dummy/public/422.html +67 -0
  180. data/spec/dummy/public/500.html +66 -0
  181. data/spec/dummy/public/capybara.html +193 -0
  182. data/spec/dummy/public/favicon.ico +0 -0
  183. data/spec/factories/attachment.rb +6 -0
  184. data/spec/factories/group.rb +20 -0
  185. data/spec/factories/message.rb +68 -0
  186. data/spec/factories/user.rb +8 -0
  187. data/spec/features/boxes_spec.rb +50 -0
  188. data/spec/features/conversations_spec.rb +36 -0
  189. data/spec/features/messages_spec.rb +53 -0
  190. data/spec/helpers/message_train/boxes_helper_spec.rb +44 -0
  191. data/spec/message_train_spec.rb +7 -0
  192. data/spec/models/group_spec.rb +23 -0
  193. data/spec/models/message_train/attachment_spec.rb +12 -0
  194. data/spec/models/message_train/box_spec.rb +195 -0
  195. data/spec/models/message_train/conversation_spec.rb +98 -0
  196. data/spec/models/message_train/ignore_spec.rb +27 -0
  197. data/spec/models/message_train/message_spec.rb +83 -0
  198. data/spec/models/message_train/receipt_spec.rb +73 -0
  199. data/spec/models/user_spec.rb +68 -0
  200. data/spec/rails_helper.rb +83 -0
  201. data/spec/spec_helper.rb +92 -0
  202. data/spec/support/controller_behaviors.rb +88 -0
  203. data/spec/support/controller_macros.rb +13 -0
  204. data/spec/support/conversations.rb +10 -0
  205. data/spec/support/factory_girl.rb +3 -0
  206. data/spec/support/feature_behaviors.rb +62 -0
  207. data/spec/support/groups.rb +3 -0
  208. data/spec/support/loaded_site.rb +5 -0
  209. data/spec/support/shared_connection.rb +13 -0
  210. data/spec/support/users.rb +6 -0
  211. data/spec/support/utilities.rb +8 -0
  212. data/vendor/assets/javascripts/bootstrap-tags.js +623 -0
  213. data/vendor/assets/stylesheets/bootstrap-tags.css +78 -0
  214. metadata +608 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 209640603bb9942cbeb56f784f7cb82f17ea8c4b
4
+ data.tar.gz: 3c4b3d6c2d08e57af22547f86f16028d79167224
5
+ SHA512:
6
+ metadata.gz: 9b8a44f1f76ab067a81d1eb1405476237acebf8482ed9abd4dd12b108ccd466bc32a9fc7107ea1097373560b8ef3b3ffd590bff8b73731bbab2e81099f7db112
7
+ data.tar.gz: 4f8da23ca07078ffa1093cd03186a25f450f10012c026bc9e06ecbcf5779d65957ec448a5f2e881f69edbbd54b724e62ff3687a61619b8578a231238e498c8e4
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ message_train
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.2.2
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - ruby-2.2.1
4
+ - 2.2.2
5
+ before_script:
6
+ - export DISPLAY=:99.0
7
+ - sh -e /etc/init.d/xvfb start
data/Gemfile ADDED
@@ -0,0 +1,51 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+ gem 'rails', '~> 4'
6
+ gem 'paperclip', '~> 4.3'
7
+ gem 'rails-i18n', '~> 4'
8
+ gem 'haml-rails', '~> 0.9'
9
+ gem 'jquery-rails', '~> 4'
10
+ gem 'uglifier', '~> 2.7'
11
+
12
+ # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
13
+ gem 'jbuilder', '~> 1.0.1'
14
+
15
+ gem 'sass-rails', '~> 5'
16
+ gem 'bootstrap-sass', '~> 3.3'
17
+ gem 'bootstrap_leather', '~> 0.8'
18
+ gem 'bootstrap_pager', '~> 0.10'
19
+ gem 'bootstrap_form', '~> 2.3'
20
+
21
+ # Add dependencies to develop your gem here.
22
+ # Include everything needed to run rake, tests, features, etc.
23
+ group :development do
24
+ gem "rdoc", "~> 3.12"
25
+ gem "bundler", "~> 1.0"
26
+ gem "jeweler", "~> 2.0.1"
27
+ end
28
+
29
+ group :development, :test do
30
+ gem 'sqlite3', '~> 1.3'
31
+ gem 'devise', '~> 3.5'
32
+ gem 'rolify', '~> 4'
33
+ gem 'faker', '~> 1.4'
34
+ gem 'rspec-rails', '~> 3.2'
35
+ gem 'rspec-its', '~> 1.2'
36
+ gem 'factory_girl_rails', '~> 4.5'
37
+ gem 'seedbank', '~> 0.3'
38
+ gem 'friendly_id', '~> 5'
39
+ gem 'byebug', '~> 5'
40
+ end
41
+
42
+ group :test do
43
+ gem 'capybara', '~> 2.4'
44
+ gem 'database_cleaner', '~> 1.4'
45
+ gem 'rspec-collection_matchers', '~> 1.1'
46
+ gem 'shoulda-matchers', '~> 2.8'
47
+ gem "launchy", "~> 2.1.2", require: false
48
+ gem 'coveralls', '~> 0.8', require: false
49
+ gem 'rspec-html-matchers', '~> 0.7'
50
+ gem 'selenium-webdriver', '~> 2'
51
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2015 Gem Vein
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,83 @@
1
+ = MessageTrain
2
+ {<img src="https://travis-ci.org/gemvein/message_train.svg" alt="Build Status" />}[https://travis-ci.org/gemvein/message_train]
3
+ {<img src="https://coveralls.io/repos/gemvein/message_train/badge.svg?branch=master&service=github" alt="Coverage Status" />}[https://coveralls.io/github/gemvein/message_train?branch=master]
4
+ {<img src="https://badge.fury.io/rb/message_train.svg" alt="Gem Version" />}[http://badge.fury.io/rb/message_train]
5
+
6
+
7
+ Rails 4 Private Messaging Gem
8
+
9
+ == Installation
10
+
11
+ First, install the gem:
12
+
13
+ gem 'message_train'
14
+
15
+ Then, run the install generator:
16
+
17
+ rails g message_train:install
18
+
19
+ Next, add to your models, each of which will need some kind of display name column and some kind of slug (could be the same):
20
+
21
+ # in /app/models/user.rb
22
+ message_train
23
+
24
+ OR to set the name and slug columns:
25
+
26
+ message_train slug_column: :short_name, name_column: :display_name
27
+
28
+ Add to your application.css.scss:
29
+
30
+ @import "message_train";
31
+
32
+ And in your application.js:
33
+
34
+ //= require message_train
35
+
36
+ In your layout, supposing you use haml:
37
+
38
+ #alert_area
39
+ = alert_flash_messages
40
+
41
+ === Required helper methods
42
+
43
+ If you don't use devise with its `current_user` method, you will need to configure MessageTrain to use whatever method you use:
44
+
45
+ message_train name_column: :current_subscriber
46
+
47
+ === Mixin options
48
+
49
+ The `message_train` mixin takes the following options:
50
+
51
+ [:only] A symbol or array of symbols to be the only relationships used, which can include: [:sender, :recipient]
52
+ [:except] A symbol or array of symbols not to create relationships for, which can include: [:sender, :recipient]
53
+ [:valid_senders] A method name to call for a list of valid senders for this model
54
+ [:name_column] The column by which to name and find this model. default: :name
55
+ [:slug_column] The column with the short, typeable form of the name. default: :slug
56
+
57
+ === Smaller address book
58
+
59
+ By default, the address book will contain all objects of the current_user_method object's model type. To change this behavior, define an address book method on your user model, something like this:
60
+
61
+ def address_book
62
+ friends
63
+ end
64
+
65
+ And in your initializer:
66
+
67
+ self.address_book_method = :address_book
68
+
69
+ == Contributing to MessageTrain
70
+
71
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
72
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
73
+ * Fork the project.
74
+ * Start a feature/bugfix branch.
75
+ * Commit and push until you are happy with your contribution.
76
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
77
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
78
+
79
+ == Copyright
80
+
81
+ Copyright (c) 2015 Gem Vein. See LICENSE.txt for
82
+ further details.
83
+
data/Rakefile ADDED
@@ -0,0 +1,71 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
17
+ gem.name = "message_train"
18
+ gem.homepage = "http://www.gemvein.com/museum/cases/message_train"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{Messaging for any object}
21
+ gem.description = %Q{Private/public messaging for any object, such as Users or Groups}
22
+ gem.email = "karen.e.lundgren@gmail.com"
23
+ gem.authors = ["Karen Lundgren"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rspec/core'
29
+ require 'rspec/core/rake_task'
30
+ RSpec::Core::RakeTask.new(:spec) do |spec|
31
+ spec.pattern = FileList['spec/**/*_spec.rb']
32
+ end
33
+
34
+ desc "Code coverage detail"
35
+ task :simplecov do
36
+ ENV['COVERAGE'] = "true"
37
+ Rake::Task['spec'].execute
38
+ end
39
+
40
+ task :default => :spec
41
+
42
+ require 'rdoc/task'
43
+ Rake::RDocTask.new do |rdoc|
44
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
45
+
46
+ rdoc.rdoc_dir = 'rdoc'
47
+ rdoc.title = "message_train #{version}"
48
+ rdoc.rdoc_files.include('README*')
49
+ rdoc.rdoc_files.include('lib/**/*.rb')
50
+ end
51
+
52
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
53
+ load 'rails/tasks/engine.rake'
54
+
55
+
56
+ # load 'rails/tasks/statistics.rake'
57
+
58
+ namespace :message_train do
59
+ desc "Clean out development system files"
60
+ task files: :environment do
61
+ FileUtils.rm_rf(Dir["#{Rails.root}/public/system/development/*/*"])
62
+ end
63
+ desc "Recreate database from seeds and clean out all system files"
64
+ task clean: :environment do
65
+ Rake::Task["message_train:files"].invoke
66
+ Rake::Task["app:db:drop"].invoke
67
+ Rake::Task["app:db:create"].invoke
68
+ Rake::Task["app:db:migrate"].invoke
69
+ Rake::Task["app:db:seed"].invoke
70
+ end
71
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,138 @@
1
+ //= require bootstrap-tags
2
+
3
+ function create_alert(level, message) {
4
+ $('#alert_area').append('<div class="alert alert-' + level + ' alert-dismissible fade in" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>' + message + ' </div>');
5
+ }
6
+
7
+ function set_and_change(selector, value) {
8
+ $(selector).prop('checked', value).trigger("change");
9
+ }
10
+
11
+ function flicker(selector, count) {
12
+ $(selector).addClass('flicker')
13
+ .delay(100)
14
+ .queue(function() {
15
+ $(this).removeClass('flicker');
16
+ $(this).dequeue();
17
+ })
18
+ .delay(100)
19
+ .queue(function() {
20
+ if(count > 1) {
21
+ flicker(selector, count - 1);
22
+ } else {
23
+ flick_out(selector);
24
+ }
25
+ $(this).dequeue();
26
+ });
27
+ }
28
+
29
+ function flick_out(selector) {
30
+ $(selector).addClass('flicker')
31
+ .delay(100)
32
+ .queue(function() {
33
+ $(this).addClass('flicker-out');
34
+ $(this).dequeue();
35
+ }).delay(1000)
36
+ .queue(function() {
37
+ $(this).removeClass('flicker').removeClass('flicker-out');
38
+ $(this).dequeue();
39
+ })
40
+ }
41
+
42
+ function replace_via_ajax(selector, path) {
43
+ $.getJSON( path, function( data ) {
44
+ $(selector).replaceWith(data.html);
45
+ flicker(selector, 3);
46
+ });
47
+ }
48
+
49
+ function process_results(data) {
50
+ if(typeof data.results === 'undefined' || data.results.length == 0) {
51
+ create_alert('warning', data.message);
52
+ } else {
53
+ create_alert('info', data.message);
54
+ for(var key in data.results) {
55
+ var item = data.results[key];
56
+ replace_via_ajax('#' + item.css_id, item.path);
57
+ }
58
+ }
59
+ }
60
+
61
+ function add_tag_magic(node) {
62
+ div = $(node);
63
+ $.getJSON('/box/in/participants.json', function(data){
64
+ input = div.children('input');
65
+ form = div.parents('form');
66
+ var suggestions = [];
67
+ $.each(data.participants, function (i, participant) {
68
+ suggestions.push(participant.slug);
69
+ });
70
+ tags = div.tags({
71
+ suggestions: suggestions,
72
+ tagSize: 'lg',
73
+ promptText: 'Comma separated list'
74
+ });
75
+ form.submit(function(e) {
76
+ field_template = '<input name="' + div.data('field-name') + '" value="' + tags.getTags() + '" type="hidden">';
77
+ form.append(field_template);
78
+ return true;
79
+ });
80
+ });
81
+ }
82
+
83
+ $(document).ready(function(){
84
+
85
+ $('.message_train_conversation input[type="checkbox"]').change(function(event) {
86
+ if (event.target.checked) {
87
+ //Checkbox has been checked
88
+ $(this).parents('.message_train_conversation').addClass('selected');
89
+ } else {
90
+ //Checkbox has been unchecked
91
+ $(this).parents('.message_train_conversation').removeClass('selected');
92
+ }
93
+ });
94
+ $('#check_all').change(function(event) {
95
+ if (event.target.checked) {
96
+ set_and_change( '.message_train_conversation input[type="checkbox"]', true);
97
+ } else {
98
+ set_and_change( '.message_train_conversation input[type="checkbox"]', false);
99
+ }
100
+ });
101
+ $('#box-actions .check').click(function(event) {
102
+ event.preventDefault();
103
+ selector = $(this).data('selector');
104
+ set_and_change( '.message_train_conversation input[type="checkbox"]', false);
105
+ if(selector == '.message_train_conversation') {
106
+ $('#check_all').prop('checked', true);
107
+ } else {
108
+ $('#check_all').prop('checked', false);
109
+ }
110
+ if(selector != '') {
111
+ set_and_change( selector + ' input[type="checkbox"]', true);
112
+ }
113
+ });
114
+ $('#box-actions .mark').click(function(event) {
115
+ event.preventDefault();
116
+ $('#spinner').removeClass('hide');
117
+ mark_to_set = $(this).data('mark');
118
+ if(mark_to_set == 'ignore' || mark_to_set == 'unignore') {
119
+ $('input[name="_method"]').val('delete');
120
+ } else {
121
+ $('input[name="_method"]').val('put');
122
+ }
123
+ $('input[name="mark_to_set"]').val(mark_to_set);
124
+ $('#box').submit();
125
+ });
126
+ $('#box')
127
+ .on('ajax:success', function (e, data, status, xhr) {
128
+ $('#spinner').addClass('hide');
129
+ process_results(data);
130
+ }).on('ajax:error', function (e, data, status, xhr) {
131
+ create_alert('danger', data.responseJSON.message);
132
+ });
133
+ $('#box #message_train_messages .read').each(function(e){
134
+ $(this).find('.collapse').collapse('hide');
135
+ });
136
+
137
+ add_tag_magic(".recipient-input");
138
+ });
@@ -0,0 +1,107 @@
1
+ @import 'bootstrap-tags';
2
+
3
+ #message_train_conversations {
4
+ a, a:link, a:visited {
5
+ color: $text-color;
6
+ }
7
+
8
+ a:hover {
9
+ text-decoration: none;
10
+ }
11
+
12
+ input[type='checkbox'] {
13
+ margin-right: 1em;
14
+ }
15
+ .unread {
16
+ font-weight: bold;
17
+ }
18
+
19
+ .read {
20
+ background-color: rgba($list-group-disabled-bg, 0.75);
21
+ }
22
+
23
+ .draft {
24
+ font-style: italic;
25
+ }
26
+
27
+ .selected, .read.selected {
28
+ a {
29
+ color: $state-warning-text;
30
+ }
31
+ background-color: $state-warning-bg;
32
+ }
33
+
34
+ .flicker, .read.flicker, .selected.flicker {
35
+ background-color: $state-info-bg;
36
+ transition: background-color 0.1s ease-in;
37
+ }
38
+
39
+ .flicker.flicker-out, .unread.flicker.flicker-out {
40
+ background-color: $list-group-bg;
41
+ transition: background-color 1s ease-out;
42
+ }
43
+
44
+ .read.flicker.flicker-out {
45
+ background-color: $list-group-disabled-bg;
46
+ transition: background-color 1s ease-out;
47
+ }
48
+ }
49
+
50
+ #box-actions {
51
+ margin: 2em 0 1em 0;
52
+ .check-all button {
53
+ min-height: 2.5em;
54
+ }
55
+ }
56
+
57
+ #conversation-actions {
58
+ margin: 1em 0 1em 0;
59
+ }
60
+
61
+ .conversation-actions {
62
+ a {
63
+ visibility: hidden;
64
+ }
65
+ white-space: nowrap;
66
+ }
67
+
68
+ tr:hover .conversation-actions a {
69
+ visibility: visible;
70
+ }
71
+
72
+ .glyphicon.spinning {
73
+ animation: spin 1s infinite linear;
74
+ -webkit-animation: spin2 1s infinite linear;
75
+ }
76
+
77
+ @keyframes spin {
78
+ from { transform: scale(1) rotate(0deg);}
79
+ to { transform: scale(1) rotate(360deg);}
80
+ }
81
+
82
+ @-webkit-keyframes spin2 {
83
+ from { -webkit-transform: rotate(0deg);}
84
+ to { -webkit-transform: rotate(360deg);}
85
+ }
86
+
87
+ .clear-left {
88
+ clear: left;
89
+ }
90
+
91
+ .clear-right {
92
+ clear: right;
93
+ }
94
+
95
+ .clear-both {
96
+ clear: both;
97
+ }
98
+
99
+ .btn-compose {
100
+ margin: 0 auto 10px auto;
101
+ width: 100%;
102
+ }
103
+
104
+ .tags-input {
105
+ border-radius: 4px;
106
+ padding-left: 12px;
107
+ }
@@ -0,0 +1,64 @@
1
+ module MessageTrain
2
+ class ApplicationController < ::ApplicationController
3
+ helper BoxesHelper
4
+ helper ConversationsHelper
5
+ helper MessagesHelper
6
+ before_filter :load_box
7
+ before_filter :load_objects
8
+ before_action :set_locale
9
+
10
+ rescue_from ActiveRecord::RecordNotFound do
11
+ render '404', status: :not_found
12
+ end
13
+
14
+ rescue_from ActionController::RoutingError do
15
+ redirect_to url_for(MessageTrain.configuration.user_sign_in_path), flash: { notice: :you_must_sign_in_or_sign_up_to_continue.l }
16
+ end
17
+
18
+ private
19
+ def set_locale
20
+ I18n.locale = params[:locale] || I18n.default_locale
21
+ end
22
+
23
+ def load_box
24
+ @box = send(MessageTrain.configuration.current_user_method).box(params[:box_division].to_sym)
25
+ end
26
+
27
+ def load_objects
28
+ @objects = {}
29
+ @objects['conversations'] = {}
30
+ @objects['messages'] = {}
31
+ if params[:objects].present?
32
+ params[:objects].each do |type, list|
33
+ list.each do |key, list_item|
34
+ @objects[type][key.to_s] = list_item.to_i
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def respond_to_marking
41
+ if !@box.errors.all.empty?
42
+ respond_to do |format|
43
+ format.html {
44
+ flash[:error] = @box.message
45
+ show
46
+ }
47
+ format.json { render :results, status: :unprocessable_entity }
48
+ end
49
+ else
50
+ respond_to do |format|
51
+ format.html {
52
+ if @box.results.all.empty?
53
+ flash[:alert] = @box.message
54
+ else
55
+ flash[:notice] = @box.message
56
+ end
57
+ show
58
+ }
59
+ format.json { render :results, status: :accepted }
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,37 @@
1
+ module MessageTrain
2
+ class BoxesController < MessageTrain::ApplicationController
3
+ before_filter :load_conversations
4
+
5
+ # GET /box/in
6
+ def show
7
+ @conversations = @conversations.page(params[:page])
8
+ render :show
9
+ end
10
+
11
+ # PATCH/PUT /box/in
12
+ def update
13
+ if params[:mark_to_set].present? && @objects.present?
14
+ @box.mark(params[:mark_to_set], @objects)
15
+ end
16
+ respond_to_marking
17
+ end
18
+
19
+ # DELETE /box/in
20
+ def destroy
21
+ if ['ignore', 'unignore'].include? params[:mark_to_set]
22
+ @box.send(params[:mark_to_set], @objects)
23
+ end
24
+ respond_to_marking
25
+ end
26
+
27
+ private
28
+
29
+ def load_conversations
30
+ @conversations = @box.conversations
31
+ end
32
+
33
+ def load_box
34
+ @box = send(MessageTrain.configuration.current_user_method).box(params[:division].to_sym)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ module MessageTrain
2
+ class ConversationsController < MessageTrain::ApplicationController
3
+ before_filter :load_conversation
4
+ after_filter :mark_as_read
5
+
6
+ # GET /box/in/conversations/1
7
+ def show
8
+ @messages = @conversation.messages.page(params[:page])
9
+ render :show
10
+ end
11
+
12
+ # PATCH/PUT /box/in/conversations/1
13
+ def update
14
+ if params[:mark_to_set].present? && @objects.present?
15
+ @box.mark params[:mark_to_set], @objects
16
+ end
17
+ respond_to_marking
18
+ end
19
+
20
+ # DELETE /box/in/conversations/1
21
+ def destroy
22
+ if ['ignore', 'unignore'].include? params[:mark_to_set]
23
+ @box.send(params[:mark_to_set], @conversation)
24
+ end
25
+ respond_to_marking
26
+ end
27
+
28
+ private
29
+
30
+ def load_conversation
31
+ @conversation = @box.find_conversation(params[:id])
32
+ end
33
+
34
+ def mark_as_read
35
+ @box.mark :read, conversations: @conversation
36
+ end
37
+ end
38
+ end