message_train 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.rspec +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +7 -0
- data/Gemfile +51 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +83 -0
- data/Rakefile +71 -0
- data/VERSION +1 -0
- data/app/assets/javascripts/message_train.js +138 -0
- data/app/assets/stylesheets/message_train.scss +107 -0
- data/app/controllers/message_train/application_controller.rb +64 -0
- data/app/controllers/message_train/boxes_controller.rb +37 -0
- data/app/controllers/message_train/conversations_controller.rb +38 -0
- data/app/controllers/message_train/messages_controller.rb +74 -0
- data/app/controllers/message_train/participants_controller.rb +36 -0
- data/app/helpers/message_train/application_helper.rb +4 -0
- data/app/helpers/message_train/boxes_helper.rb +30 -0
- data/app/helpers/message_train/conversations_helper.rb +73 -0
- data/app/helpers/message_train/messages_helper.rb +58 -0
- data/app/models/message_train/attachment.rb +17 -0
- data/app/models/message_train/box.rb +268 -0
- data/app/models/message_train/conversation.rb +101 -0
- data/app/models/message_train/ignore.rb +18 -0
- data/app/models/message_train/message.rb +146 -0
- data/app/models/message_train/receipt.rb +70 -0
- data/app/views/application/404.html.haml +3 -0
- data/app/views/message_train/application/results.json.jbuilder +8 -0
- data/app/views/message_train/boxes/_dropdown_list.html.haml +5 -0
- data/app/views/message_train/boxes/_list_item.html.haml +5 -0
- data/app/views/message_train/boxes/_widget.html.haml +6 -0
- data/app/views/message_train/boxes/show.html.haml +47 -0
- data/app/views/message_train/conversations/_conversation.html.haml +9 -0
- data/app/views/message_train/conversations/_deleted_toggle.html.haml +1 -0
- data/app/views/message_train/conversations/_ignored_toggle.html.haml +4 -0
- data/app/views/message_train/conversations/_read_toggle.html.haml +4 -0
- data/app/views/message_train/conversations/_toggle.html.haml +1 -0
- data/app/views/message_train/conversations/_trashed_toggle.html.haml +4 -0
- data/app/views/message_train/conversations/show.html.haml +11 -0
- data/app/views/message_train/conversations/show.json.jbuilder +2 -0
- data/app/views/message_train/messages/_deleted_toggle.html.haml +1 -0
- data/app/views/message_train/messages/_form.html.haml +8 -0
- data/app/views/message_train/messages/_message.html.haml +35 -0
- data/app/views/message_train/messages/_read_toggle.html.haml +4 -0
- data/app/views/message_train/messages/_toggle.html.haml +1 -0
- data/app/views/message_train/messages/_trashed_toggle.html.haml +4 -0
- data/app/views/message_train/messages/edit.html.haml +2 -0
- data/app/views/message_train/messages/new.html.haml +2 -0
- data/app/views/message_train/messages/show.json.jbuilder +2 -0
- data/app/views/message_train/participants/_field.html.haml +4 -0
- data/app/views/message_train/participants/_participant.json.jbuilder +5 -0
- data/app/views/message_train/participants/index.json.jbuilder +3 -0
- data/app/views/message_train/participants/show.json.jbuilder +1 -0
- data/bin/rails +12 -0
- data/config/initializers/bootstrap_pager_config.rb +10 -0
- data/config/initializers/date_time.rb +5 -0
- data/config/locales/en.yml +50 -0
- data/config/routes.rb +11 -0
- data/db/migrate/20150721145319_create_message_train_conversations.rb +9 -0
- data/db/migrate/20150721160322_create_message_train_messages.rb +14 -0
- data/db/migrate/20150721161144_create_message_train_attachments.rb +10 -0
- data/db/migrate/20150721161940_create_message_train_receipts.rb +16 -0
- data/db/migrate/20150721163838_create_message_train_ignores.rb +11 -0
- data/lib/generators/message_train/install/install_generator.rb +30 -0
- data/lib/generators/message_train/install/templates/initializer.rb +10 -0
- data/lib/generators/message_train/utils.rb +16 -0
- data/lib/message_train/configuration.rb +35 -0
- data/lib/message_train/engine.rb +19 -0
- data/lib/message_train/localization.rb +31 -0
- data/lib/message_train/mixin.rb +83 -0
- data/lib/message_train/version.rb +7 -0
- data/lib/message_train.rb +20 -0
- data/lib/tasks/message_train_tasks.rake +0 -0
- data/message_train.gemspec +325 -0
- data/night_train.gemspec +274 -0
- data/spec/controllers/message_train/boxes_controller_spec.rb +82 -0
- data/spec/controllers/message_train/conversations_controller_spec.rb +86 -0
- data/spec/controllers/message_train/messages_controller_spec.rb +210 -0
- data/spec/controllers/message_train/participants_controller_spec.rb +35 -0
- data/spec/dummy/.rspec +2 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/files/message_train/attachments/1917-Boys_Race_Above-Wiki.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/ACD_Silverbarn's_Mayumi.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/ACD_obedience.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/A_Man_and_His_Dog.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Alaskan_Malamute_agility_a-frame.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/American_water_spaniel_02.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Aport_konkurs_rybnik.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Askerhytta.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Bambisj.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Cattle_dog_skating.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Dog's_Olympics_training_ground_-_geograph.org.uk_-_660324.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/DogShowHierarchy.png +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Dog_weight_pull.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Draghuntpostcard.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Esham_51.JPG +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/FastCourseExample.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Fotos_joel_141.JPG +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Galgo_Spanish_male_brindle.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Golden-retriever-carlos-bei-der-dummyarbeit.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Habavk.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Haie_rci.svg +1714 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Hanging_18.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/Hundewa.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/K9ProSports_AttackOnHandler.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/K9ProSports_heel.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/K9Pro_Civil_agitation.JPG +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/TrainingSchutzhundRetrieveOverWall.jpg +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/example.pdf +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/letterlegal5.doc +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/pdf-sample.pdf +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/sample.pdf +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/tips.doc +0 -0
- data/spec/dummy/app/assets/files/message_train/attachments/wd-spectools-word-sample-04.doc +0 -0
- data/spec/dummy/app/assets/images/logo.svg +140 -0
- data/spec/dummy/app/assets/javascripts/application.js +17 -0
- data/spec/dummy/app/assets/stylesheets/application.css.scss +35 -0
- data/spec/dummy/app/controllers/application_controller.rb +14 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/group.rb +19 -0
- data/spec/dummy/app/models/role.rb +10 -0
- data/spec/dummy/app/models/user.rb +23 -0
- data/spec/dummy/app/views/layouts/_top_navigation.html.haml +5 -0
- data/spec/dummy/app/views/layouts/application.html.haml +29 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config/application.rb +40 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/bootstrap_leather.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/devise.rb +265 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/message_train.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/paperclip.rb +2 -0
- data/spec/dummy/config/initializers/rolify.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/devise.en.yml +60 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config/unused/temporary_i18n_debugging.rb +12 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20150721140013_devise_create_users.rb +42 -0
- data/spec/dummy/db/migrate/20150721141009_rolify_create_roles.rb +19 -0
- data/spec/dummy/db/migrate/20150721141128_create_groups.rb +11 -0
- data/spec/dummy/db/migrate/20150721150307_add_display_name_column_to_users.rb +6 -0
- data/spec/dummy/db/migrate/20150724142846_create_message_train_conversations.night_train.rb +10 -0
- data/spec/dummy/db/migrate/20150724142847_create_message_train_messages.night_train.rb +15 -0
- data/spec/dummy/db/migrate/20150724142848_create_message_train_attachments.night_train.rb +11 -0
- data/spec/dummy/db/migrate/20150724142849_create_message_train_receipts.night_train.rb +17 -0
- data/spec/dummy/db/migrate/20150724142850_create_message_train_ignores.night_train.rb +12 -0
- data/spec/dummy/db/schema.rb +121 -0
- data/spec/dummy/db/seeds/conversations.seeds.rb +86 -0
- data/spec/dummy/db/seeds/development/conversations.seeds.rb +9 -0
- data/spec/dummy/db/seeds/groups.seeds.rb +9 -0
- data/spec/dummy/db/seeds/test/conversations.seeds.rb +9 -0
- data/spec/dummy/db/seeds/users.seeds.rb +15 -0
- data/spec/dummy/db/seeds.rb +0 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/capybara.html +193 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/attachment.rb +6 -0
- data/spec/factories/group.rb +20 -0
- data/spec/factories/message.rb +68 -0
- data/spec/factories/user.rb +8 -0
- data/spec/features/boxes_spec.rb +50 -0
- data/spec/features/conversations_spec.rb +36 -0
- data/spec/features/messages_spec.rb +53 -0
- data/spec/helpers/message_train/boxes_helper_spec.rb +44 -0
- data/spec/message_train_spec.rb +7 -0
- data/spec/models/group_spec.rb +23 -0
- data/spec/models/message_train/attachment_spec.rb +12 -0
- data/spec/models/message_train/box_spec.rb +195 -0
- data/spec/models/message_train/conversation_spec.rb +98 -0
- data/spec/models/message_train/ignore_spec.rb +27 -0
- data/spec/models/message_train/message_spec.rb +83 -0
- data/spec/models/message_train/receipt_spec.rb +73 -0
- data/spec/models/user_spec.rb +68 -0
- data/spec/rails_helper.rb +83 -0
- data/spec/spec_helper.rb +92 -0
- data/spec/support/controller_behaviors.rb +88 -0
- data/spec/support/controller_macros.rb +13 -0
- data/spec/support/conversations.rb +10 -0
- data/spec/support/factory_girl.rb +3 -0
- data/spec/support/feature_behaviors.rb +62 -0
- data/spec/support/groups.rb +3 -0
- data/spec/support/loaded_site.rb +5 -0
- data/spec/support/shared_connection.rb +13 -0
- data/spec/support/users.rb +6 -0
- data/spec/support/utilities.rb +8 -0
- data/vendor/assets/javascripts/bootstrap-tags.js +623 -0
- data/vendor/assets/stylesheets/bootstrap-tags.css +78 -0
- 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
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
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
|