message_train 0.4.6 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +7 -1
- data/README.rdoc +1 -1
- data/VERSION +1 -1
- data/app/assets/javascripts/ckeditor/config.js.coffee +48 -0
- data/app/assets/javascripts/message_train.js +25 -50
- data/app/assets/stylesheets/message_train.scss +6 -5
- data/app/controllers/message_train/messages_controller.rb +1 -1
- data/app/controllers/message_train/participants_controller.rb +4 -0
- data/app/views/message_train/messages/_form.html.haml +25 -4
- data/message_train.gemspec +20 -11
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/features/messages_spec.rb +9 -17
- data/spec/support/shared_connection.rb +0 -1
- data/spec/support/utilities.rb +51 -0
- metadata +62 -9
- data/app/views/message_train/participants/_field.html.haml +0 -4
- data/spec/support/wysihtml5_helper.rb +0 -8
- data/vendor/assets/javascripts/bootstrap-tags.js +0 -623
- data/vendor/assets/stylesheets/bootstrap-tags.css +0 -78
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc19fc2e0a39e267e10c61fb9090fa72fd8bf7ae
|
4
|
+
data.tar.gz: b7f16af91e7cc61d8b050e1cf5c6bdfc8194c267
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63d3fb74b09bc2b5dee0bf57153fc1f35c82994541b4c2b2ba07ee09b85729f6c87b470cd6f81b7577ada84d9534d5c24a8b3c22adcf8792daca7cc7fee17c9e
|
7
|
+
data.tar.gz: 0438d2ca2ecd8f450626642ac0dfb9fa848c6cd3d3f4a7c16ba39fca5c5112fad0b650e547dddc8e46f8a8609c3d96b2641b3bff80117128d1969fc0b18a4318
|
data/Gemfile
CHANGED
@@ -9,6 +9,9 @@ gem 'haml-rails', '~> 0.9'
|
|
9
9
|
gem 'jquery-rails', '~> 4'
|
10
10
|
gem 'uglifier', '~> 2.7'
|
11
11
|
|
12
|
+
# Use CoffeeScript for .coffee assets and views
|
13
|
+
gem 'coffee-rails', '~> 4.1.0'
|
14
|
+
|
12
15
|
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
|
13
16
|
gem 'jbuilder', '~> 2.0'
|
14
17
|
|
@@ -17,8 +20,11 @@ gem 'bootstrap-sass', '~> 3.3'
|
|
17
20
|
gem 'bootstrap_leather', '~> 0.8'
|
18
21
|
gem 'bootstrap_pager', '~> 0.10'
|
19
22
|
gem 'bootstrap_form', '~> 2.3'
|
20
|
-
gem '
|
23
|
+
gem 'ckeditor'
|
24
|
+
gem 'bootstrap_tokenfield_rails', '~> 0.12'
|
21
25
|
gem 'cocoon', '~> 1.2'
|
26
|
+
gem 'jquery-ui-bootstrap-rails-asset'
|
27
|
+
gem 'twitter-typeahead-rails'
|
22
28
|
|
23
29
|
# Add dependencies to develop your gem here.
|
24
30
|
# Include everything needed to run rake, tests, features, etc.
|
data/README.rdoc
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
@@ -0,0 +1,48 @@
|
|
1
|
+
CKEDITOR.editorConfig = (config) ->
|
2
|
+
config.allowedContent = true
|
3
|
+
config.width = '100%'
|
4
|
+
config.toolbar_full = [
|
5
|
+
{
|
6
|
+
name: 'links',
|
7
|
+
items: [
|
8
|
+
'Link',
|
9
|
+
'Unlink'
|
10
|
+
]
|
11
|
+
},
|
12
|
+
{
|
13
|
+
name: 'paragraph',
|
14
|
+
groups: [
|
15
|
+
'list',
|
16
|
+
'indent',
|
17
|
+
'blocks',
|
18
|
+
'align',
|
19
|
+
'bidi'
|
20
|
+
],
|
21
|
+
items: [
|
22
|
+
'NumberedList',
|
23
|
+
'BulletedList',
|
24
|
+
'-',
|
25
|
+
'Outdent',
|
26
|
+
'Indent',
|
27
|
+
'-',
|
28
|
+
'Blockquote'
|
29
|
+
]
|
30
|
+
},
|
31
|
+
{
|
32
|
+
name: 'basicstyles',
|
33
|
+
groups: [
|
34
|
+
'basicstyles',
|
35
|
+
'cleanup'
|
36
|
+
],
|
37
|
+
items: [
|
38
|
+
'Format',
|
39
|
+
'Bold',
|
40
|
+
'Italic',
|
41
|
+
'Strike',
|
42
|
+
'-',
|
43
|
+
'RemoveFormat'
|
44
|
+
]
|
45
|
+
}
|
46
|
+
]
|
47
|
+
config.toolbar = 'full'
|
48
|
+
true
|
@@ -1,6 +1,7 @@
|
|
1
|
-
//= require
|
1
|
+
//= require twitter/typeahead.min
|
2
|
+
//= require bootstrap-tokenfield
|
2
3
|
//= require cocoon
|
3
|
-
//= require
|
4
|
+
//= require ckeditor/init
|
4
5
|
|
5
6
|
function create_alert(level, message) {
|
6
7
|
$('#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>');
|
@@ -61,31 +62,17 @@ function process_results(data) {
|
|
61
62
|
}
|
62
63
|
|
63
64
|
function add_tag_magic(selector) {
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
$.each(data.participants, function (i, participant) {
|
76
|
-
suggestions.push(participant.slug);
|
77
|
-
});
|
78
|
-
var tags = div.tags({
|
79
|
-
readOnly: readOnly,
|
80
|
-
suggestions: suggestions,
|
81
|
-
tagSize: 'lg',
|
82
|
-
promptText: 'Comma separated list'
|
83
|
-
});
|
84
|
-
form.submit(function(e) {
|
85
|
-
field_template = '<input name="' + div.data('field-name') + '" value="' + tags.getTags() + '" type="hidden">';
|
86
|
-
form.append(field_template);
|
87
|
-
return true;
|
88
|
-
});
|
65
|
+
$(selector).tokenfield({
|
66
|
+
typeahead: [
|
67
|
+
{
|
68
|
+
hint: true,
|
69
|
+
highlight: true
|
70
|
+
},
|
71
|
+
{
|
72
|
+
source: suggestions.ttAdapter()
|
73
|
+
}
|
74
|
+
],
|
75
|
+
showAutocompleteOnFocus: true
|
89
76
|
});
|
90
77
|
}
|
91
78
|
|
@@ -100,6 +87,7 @@ $(document).ready(function(){
|
|
100
87
|
$(this).parents('.message_train_conversation').removeClass('selected');
|
101
88
|
}
|
102
89
|
});
|
90
|
+
|
103
91
|
$('#check_all').change(function(event) {
|
104
92
|
if (event.target.checked) {
|
105
93
|
set_and_change( '.message_train_conversation input[type="checkbox"]', true);
|
@@ -107,6 +95,7 @@ $(document).ready(function(){
|
|
107
95
|
set_and_change( '.message_train_conversation input[type="checkbox"]', false);
|
108
96
|
}
|
109
97
|
});
|
98
|
+
|
110
99
|
$('#box-actions .check').click(function(event) {
|
111
100
|
event.preventDefault();
|
112
101
|
selector = $(this).data('selector');
|
@@ -120,6 +109,7 @@ $(document).ready(function(){
|
|
120
109
|
set_and_change( selector + ' input[type="checkbox"]', true);
|
121
110
|
}
|
122
111
|
});
|
112
|
+
|
123
113
|
$('#box-actions .mark').click(function(event) {
|
124
114
|
event.preventDefault();
|
125
115
|
$('#spinner').removeClass('hide');
|
@@ -132,13 +122,14 @@ $(document).ready(function(){
|
|
132
122
|
$('input[name="mark_to_set"]').val(mark_to_set);
|
133
123
|
$('#box').submit();
|
134
124
|
});
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
125
|
+
|
126
|
+
$('#box').on('ajax:success', function (e, data, status, xhr) {
|
127
|
+
$('#spinner').addClass('hide');
|
128
|
+
process_results(data);
|
129
|
+
}).on('ajax:error', function (e, data, status, xhr) {
|
130
|
+
create_alert('danger', data.responseJSON.message);
|
131
|
+
});
|
132
|
+
|
142
133
|
$('#box #message_train_messages .read').each(function(e){
|
143
134
|
$(this).find('.collapse').collapse('hide');
|
144
135
|
});
|
@@ -154,21 +145,5 @@ $(document).ready(function(){
|
|
154
145
|
var text = button.data('text');
|
155
146
|
var modal = $(this);
|
156
147
|
modal.find('#image_placeholder').html('<a href="' + original + '" title="' + text + '"><img src="' + src + '" /></a>')
|
157
|
-
})
|
158
|
-
|
159
|
-
$('.wysiwyg').wysihtml5({
|
160
|
-
toolbar: {
|
161
|
-
'font-styles': true,
|
162
|
-
'color': false,
|
163
|
-
'emphasis': {
|
164
|
-
'small': true
|
165
|
-
},
|
166
|
-
'blockquote': true,
|
167
|
-
'lists': true,
|
168
|
-
'html': false,
|
169
|
-
'link': true,
|
170
|
-
'image': false,
|
171
|
-
'smallmodals': true
|
172
|
-
}
|
173
148
|
});
|
174
149
|
});
|
@@ -1,5 +1,5 @@
|
|
1
|
-
@import '
|
2
|
-
@import
|
1
|
+
@import 'tokenfield-typeahead';
|
2
|
+
@import 'bootstrap-tokenfield';
|
3
3
|
|
4
4
|
img {
|
5
5
|
max-width: 100%;
|
@@ -123,9 +123,10 @@ tr:hover .conversation-actions a {
|
|
123
123
|
white-space: inherit;
|
124
124
|
}
|
125
125
|
|
126
|
-
.
|
127
|
-
|
128
|
-
|
126
|
+
.tt-menu {
|
127
|
+
@extend .tt-dropdown-menu;
|
128
|
+
border-top-left-radius: 0;
|
129
|
+
border-top-right-radius: 0;
|
129
130
|
}
|
130
131
|
|
131
132
|
.dropdown-menu {
|
@@ -35,6 +35,10 @@ module MessageTrain
|
|
35
35
|
else
|
36
36
|
@participants = model.all
|
37
37
|
end
|
38
|
+
if params[:query].present?
|
39
|
+
field_name = MessageTrain.configuration.slug_columns[model_sym]
|
40
|
+
@participants = @participants.where("#{field_name} LIKE ?", "#{params[:query]}%")
|
41
|
+
end
|
38
42
|
end
|
39
43
|
|
40
44
|
def load_participant
|
@@ -4,11 +4,32 @@
|
|
4
4
|
- resource = message.new_record? ? message_train.collective_box_messages_path(@collective.path_part, @box) : message_train.collective_box_message_path(@collective.path_part, @box, message)
|
5
5
|
= bootstrap_form_for message, url: resource do |f|
|
6
6
|
- if @collective.nil?
|
7
|
-
=
|
7
|
+
= f.fields_for :recipients_to_save do |g|
|
8
|
+
= g.text_field :users, label: :recipients.l, class: 'recipient-input'
|
9
|
+
- add_footer_javascript do
|
10
|
+
:javascript
|
11
|
+
url = "/box/in/participants/users.json"
|
12
|
+
var suggestions = new Bloodhound({
|
13
|
+
prefetch: url,
|
14
|
+
remote: {
|
15
|
+
wildcard: '%QUERY',
|
16
|
+
url: url + '?query=%QUERY',
|
17
|
+
transform: function(response) {
|
18
|
+
return $.map(response.participants, function(val, i) {
|
19
|
+
return val.slug
|
20
|
+
});
|
21
|
+
}
|
22
|
+
},
|
23
|
+
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
24
|
+
datumTokenizer: function(item) {
|
25
|
+
return Bloodhound.tokenizers.whitespace(item.slug);
|
26
|
+
}
|
27
|
+
});
|
8
28
|
- else
|
9
29
|
= render partial: 'message_train/participants/prefilled_field', locals: { message: message, recipient: @collective }
|
10
30
|
= f.text_field :subject
|
11
|
-
= f.
|
31
|
+
= f.form_group :body, label: { text: MessageTrain::Message.human_attribute_name(:body) } do
|
32
|
+
= f.cktext_area :body
|
12
33
|
.links
|
13
34
|
%h3
|
14
35
|
= link_to_add_association(icon('plus'), f, :attachments, title: :add_attachment.l, class: 'btn btn-info', id: 'add-attachment', data: { association_insertion_method: 'append', association_insertion_node: '#attachments'})
|
@@ -16,5 +37,5 @@
|
|
16
37
|
#attachments
|
17
38
|
= f.fields_for :attachments do |attachment|
|
18
39
|
= render 'attachment_fields', f: attachment
|
19
|
-
= f.submit :save_as_draft.l, name: 'message[draft]'
|
20
|
-
= f.submit :send.l, class: 'btn btn-primary', name: 'message[draft]'
|
40
|
+
= f.submit :save_as_draft.l, name: 'message[draft]', id: 'save-as-draft'
|
41
|
+
= f.submit :send.l, class: 'btn btn-primary', name: 'message[draft]', id: 'send'
|
data/message_train.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: message_train 0.
|
5
|
+
# stub: message_train 0.5.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "message_train"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.5.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Karen Lundgren"]
|
14
|
-
s.date = "2016-02-
|
14
|
+
s.date = "2016-02-20"
|
15
15
|
s.description = "Rails 4 Engine providing private/public messaging for any object, such as Users or Groups"
|
16
16
|
s.email = "karen.e.lundgren@gmail.com"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
"README.rdoc",
|
31
31
|
"Rakefile",
|
32
32
|
"VERSION",
|
33
|
+
"app/assets/javascripts/ckeditor/config.js.coffee",
|
33
34
|
"app/assets/javascripts/message_train.js",
|
34
35
|
"app/assets/stylesheets/message_train.scss",
|
35
36
|
"app/controllers/concerns/message_train_support.rb",
|
@@ -86,7 +87,6 @@ Gem::Specification.new do |s|
|
|
86
87
|
"app/views/message_train/messages/edit.html.haml",
|
87
88
|
"app/views/message_train/messages/new.html.haml",
|
88
89
|
"app/views/message_train/messages/show.json.jbuilder",
|
89
|
-
"app/views/message_train/participants/_field.html.haml",
|
90
90
|
"app/views/message_train/participants/_participant.json.jbuilder",
|
91
91
|
"app/views/message_train/participants/_prefilled_field.html.haml",
|
92
92
|
"app/views/message_train/participants/index.json.jbuilder",
|
@@ -270,10 +270,7 @@ Gem::Specification.new do |s|
|
|
270
270
|
"spec/support/roles.rb",
|
271
271
|
"spec/support/shared_connection.rb",
|
272
272
|
"spec/support/users.rb",
|
273
|
-
"spec/support/utilities.rb"
|
274
|
-
"spec/support/wysihtml5_helper.rb",
|
275
|
-
"vendor/assets/javascripts/bootstrap-tags.js",
|
276
|
-
"vendor/assets/stylesheets/bootstrap-tags.css"
|
273
|
+
"spec/support/utilities.rb"
|
277
274
|
]
|
278
275
|
s.homepage = "http://www.gemvein.com/museum/cases/message_train"
|
279
276
|
s.licenses = ["MIT"]
|
@@ -290,14 +287,18 @@ Gem::Specification.new do |s|
|
|
290
287
|
s.add_runtime_dependency(%q<haml-rails>, ["~> 0.9"])
|
291
288
|
s.add_runtime_dependency(%q<jquery-rails>, ["~> 4"])
|
292
289
|
s.add_runtime_dependency(%q<uglifier>, ["~> 2.7"])
|
290
|
+
s.add_runtime_dependency(%q<coffee-rails>, ["~> 4.1.0"])
|
293
291
|
s.add_runtime_dependency(%q<jbuilder>, ["~> 2.0"])
|
294
292
|
s.add_runtime_dependency(%q<sass-rails>, ["~> 5"])
|
295
293
|
s.add_runtime_dependency(%q<bootstrap-sass>, ["~> 3.3"])
|
296
294
|
s.add_runtime_dependency(%q<bootstrap_leather>, ["~> 0.8"])
|
297
295
|
s.add_runtime_dependency(%q<bootstrap_pager>, ["~> 0.10"])
|
298
296
|
s.add_runtime_dependency(%q<bootstrap_form>, ["~> 2.3"])
|
299
|
-
s.add_runtime_dependency(%q<
|
297
|
+
s.add_runtime_dependency(%q<ckeditor>, [">= 0"])
|
298
|
+
s.add_runtime_dependency(%q<bootstrap_tokenfield_rails>, ["~> 0.12"])
|
300
299
|
s.add_runtime_dependency(%q<cocoon>, ["~> 1.2"])
|
300
|
+
s.add_runtime_dependency(%q<jquery-ui-bootstrap-rails-asset>, [">= 0"])
|
301
|
+
s.add_runtime_dependency(%q<twitter-typeahead-rails>, [">= 0"])
|
301
302
|
s.add_development_dependency(%q<sdoc>, ["~> 0.4.1"])
|
302
303
|
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
303
304
|
s.add_development_dependency(%q<jeweler>, ["~> 2.0"])
|
@@ -319,14 +320,18 @@ Gem::Specification.new do |s|
|
|
319
320
|
s.add_dependency(%q<haml-rails>, ["~> 0.9"])
|
320
321
|
s.add_dependency(%q<jquery-rails>, ["~> 4"])
|
321
322
|
s.add_dependency(%q<uglifier>, ["~> 2.7"])
|
323
|
+
s.add_dependency(%q<coffee-rails>, ["~> 4.1.0"])
|
322
324
|
s.add_dependency(%q<jbuilder>, ["~> 2.0"])
|
323
325
|
s.add_dependency(%q<sass-rails>, ["~> 5"])
|
324
326
|
s.add_dependency(%q<bootstrap-sass>, ["~> 3.3"])
|
325
327
|
s.add_dependency(%q<bootstrap_leather>, ["~> 0.8"])
|
326
328
|
s.add_dependency(%q<bootstrap_pager>, ["~> 0.10"])
|
327
329
|
s.add_dependency(%q<bootstrap_form>, ["~> 2.3"])
|
328
|
-
s.add_dependency(%q<
|
330
|
+
s.add_dependency(%q<ckeditor>, [">= 0"])
|
331
|
+
s.add_dependency(%q<bootstrap_tokenfield_rails>, ["~> 0.12"])
|
329
332
|
s.add_dependency(%q<cocoon>, ["~> 1.2"])
|
333
|
+
s.add_dependency(%q<jquery-ui-bootstrap-rails-asset>, [">= 0"])
|
334
|
+
s.add_dependency(%q<twitter-typeahead-rails>, [">= 0"])
|
330
335
|
s.add_dependency(%q<sdoc>, ["~> 0.4.1"])
|
331
336
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
332
337
|
s.add_dependency(%q<jeweler>, ["~> 2.0"])
|
@@ -349,14 +354,18 @@ Gem::Specification.new do |s|
|
|
349
354
|
s.add_dependency(%q<haml-rails>, ["~> 0.9"])
|
350
355
|
s.add_dependency(%q<jquery-rails>, ["~> 4"])
|
351
356
|
s.add_dependency(%q<uglifier>, ["~> 2.7"])
|
357
|
+
s.add_dependency(%q<coffee-rails>, ["~> 4.1.0"])
|
352
358
|
s.add_dependency(%q<jbuilder>, ["~> 2.0"])
|
353
359
|
s.add_dependency(%q<sass-rails>, ["~> 5"])
|
354
360
|
s.add_dependency(%q<bootstrap-sass>, ["~> 3.3"])
|
355
361
|
s.add_dependency(%q<bootstrap_leather>, ["~> 0.8"])
|
356
362
|
s.add_dependency(%q<bootstrap_pager>, ["~> 0.10"])
|
357
363
|
s.add_dependency(%q<bootstrap_form>, ["~> 2.3"])
|
358
|
-
s.add_dependency(%q<
|
364
|
+
s.add_dependency(%q<ckeditor>, [">= 0"])
|
365
|
+
s.add_dependency(%q<bootstrap_tokenfield_rails>, ["~> 0.12"])
|
359
366
|
s.add_dependency(%q<cocoon>, ["~> 1.2"])
|
367
|
+
s.add_dependency(%q<jquery-ui-bootstrap-rails-asset>, [">= 0"])
|
368
|
+
s.add_dependency(%q<twitter-typeahead-rails>, [">= 0"])
|
360
369
|
s.add_dependency(%q<sdoc>, ["~> 0.4.1"])
|
361
370
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
362
371
|
s.add_dependency(%q<jeweler>, ["~> 2.0"])
|
data/spec/dummy/db/test.sqlite3
CHANGED
Binary file
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
RSpec.feature 'Messages' do
|
3
3
|
include_context 'loaded site'
|
4
|
-
include Wysihtml5Helper
|
5
4
|
|
6
5
|
it_behaves_like 'an authenticated section', '/box/in/messages/new'
|
7
6
|
|
@@ -13,11 +12,10 @@ RSpec.feature 'Messages' do
|
|
13
12
|
describe 'at /box/in/messages' do
|
14
13
|
before do
|
15
14
|
visit '/box/in/messages/new/'
|
16
|
-
|
17
|
-
recipient_input.set("")
|
15
|
+
fill_in_autocomplete 'Recipients', with: 'x'
|
18
16
|
fill_in 'Subject', with: 'This is a draft.'
|
19
|
-
|
20
|
-
|
17
|
+
fill_in_ckeditor 'Body', with: 'This is the body.'
|
18
|
+
submit_via_button 'Send'
|
21
19
|
end
|
22
20
|
it_behaves_like 'a bootstrap page with an alert', 'warning', 'Message saved as draft.'
|
23
21
|
end
|
@@ -26,12 +24,9 @@ RSpec.feature 'Messages' do
|
|
26
24
|
describe 'at /box/in/messages' do
|
27
25
|
before do
|
28
26
|
visit '/box/in/messages/new/'
|
29
|
-
|
30
|
-
recipient_input.set("sec") # Should auto-complete to second-user with the following two key-presses
|
31
|
-
recipient_input.native.send_keys :arrow_down
|
32
|
-
recipient_input.native.send_keys :return
|
27
|
+
fill_in_autocomplete 'Recipients', with: 'sec'
|
33
28
|
fill_in 'Subject', with: 'This is the subject.'
|
34
|
-
|
29
|
+
fill_in_ckeditor 'Body', with: 'This is the body.'
|
35
30
|
click_link 'add-attachment'
|
36
31
|
click_link 'add-attachment'
|
37
32
|
click_link 'add-attachment'
|
@@ -46,7 +41,7 @@ RSpec.feature 'Messages' do
|
|
46
41
|
find('.remove_fields').click
|
47
42
|
end
|
48
43
|
end
|
49
|
-
|
44
|
+
submit_via_button 'Send'
|
50
45
|
end
|
51
46
|
it_behaves_like 'a bootstrap page with an alert', 'info', 'Message sent.'
|
52
47
|
end
|
@@ -55,13 +50,10 @@ RSpec.feature 'Messages' do
|
|
55
50
|
describe 'at /box/in/messages' do
|
56
51
|
before do
|
57
52
|
visit "/box/in/conversations/#{draft_conversation.id}"
|
58
|
-
|
59
|
-
recipient_input.set("sec") # Should auto-complete to second-user with the following two key-presses
|
60
|
-
recipient_input.native.send_keys :arrow_down
|
61
|
-
recipient_input.native.send_keys :return
|
53
|
+
fill_in_autocomplete 'Recipients', with: 'sec'
|
62
54
|
fill_in 'Subject', with: 'This is the subject.'
|
63
|
-
|
64
|
-
|
55
|
+
fill_in_ckeditor 'Body', with: 'This is the body.'
|
56
|
+
submit_via_button 'Send'
|
65
57
|
end
|
66
58
|
it_behaves_like 'a bootstrap page with an alert', 'info', 'Message sent.'
|
67
59
|
it_behaves_like 'a bootstrap page without an alert', 'warning'
|
data/spec/support/utilities.rb
CHANGED
@@ -5,4 +5,55 @@ end
|
|
5
5
|
def show_page
|
6
6
|
save_page Rails.root.join( 'public', 'capybara.html' )
|
7
7
|
%x(launchy http://localhost:3000/capybara.html)
|
8
|
+
end
|
9
|
+
|
10
|
+
def submit_via_button(button_name)
|
11
|
+
button_id = find("input[type=submit][value='#{button_name}']")[:id]
|
12
|
+
page.execute_script("$('##{button_id}').click();")
|
13
|
+
end
|
14
|
+
|
15
|
+
# Used to fill ckeditor fields
|
16
|
+
# @param [String] locator label text for the textarea or textarea id
|
17
|
+
def fill_in_ckeditor(locator, options)
|
18
|
+
locator = find_field_by_label(locator)
|
19
|
+
# Fill the editor content
|
20
|
+
page.execute_script <<-SCRIPT
|
21
|
+
var ckeditor = CKEDITOR.instances.#{locator}
|
22
|
+
ckeditor.setData('#{ActionController::Base.helpers.j options[:with]}')
|
23
|
+
ckeditor.focus()
|
24
|
+
ckeditor.updateElement()
|
25
|
+
SCRIPT
|
26
|
+
end
|
27
|
+
|
28
|
+
def fill_in_autocomplete(field, options = {})
|
29
|
+
field = find_field_by_label(field)
|
30
|
+
fill_in field, with: options[:with]
|
31
|
+
|
32
|
+
page.execute_script %Q{ $('##{field}').trigger('focus') }
|
33
|
+
page.execute_script %Q{ $('##{field}').trigger('keydown') }
|
34
|
+
selector = %Q{.tt-menu .tt-suggestion:contains("#{options[:with]}")}
|
35
|
+
|
36
|
+
if page.has_selector?('.tt-menu .tt-suggestion')
|
37
|
+
page.execute_script %Q{ $('#{selector}').trigger('mouseenter').click() }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def find_field_by_label(locator)
|
42
|
+
if page.has_css?('label', text: locator)
|
43
|
+
find('label', text: locator)[:for]
|
44
|
+
else
|
45
|
+
locator
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def wait_until(delay = 1)
|
50
|
+
seconds_waited = 0
|
51
|
+
while !yield && seconds_waited < Capybara.default_max_wait_time
|
52
|
+
sleep delay
|
53
|
+
seconds_waited += 1
|
54
|
+
end
|
55
|
+
unless yield
|
56
|
+
puts "Waited for #{Capybara.default_max_wait_time} seconds."
|
57
|
+
puts "{#{yield}} did not become true, continuing."
|
58
|
+
end
|
8
59
|
end
|