newsly 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,10 +5,10 @@ module Newsly
5
5
  respond_to :text, :only => :preview
6
6
 
7
7
 
8
- before_filter :get_newsletter, :except => [:index]
8
+ before_filter :get_newsletter, :except => [:new, :index]
9
9
 
10
10
  def index
11
- @newsletters = Newsletter.all
11
+ @newsletters = Newsletter.order('created_at desc').all
12
12
  end
13
13
 
14
14
  def show
@@ -18,7 +18,8 @@ module Newsly
18
18
  end
19
19
 
20
20
  def new
21
- render :show
21
+ @newsletter = Newsly::Newsletter.create(:title => "Nyhetsbrevs rubrik", :body => "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.", :sent => false)
22
+ redirect_to newsletter_url(@newsletter)
22
23
  end
23
24
 
24
25
  def update
@@ -64,7 +65,7 @@ module Newsly
64
65
 
65
66
  protected
66
67
  def get_newsletter
67
- @newsletter = params[:id] ? Newsly::Newsletter.find(params[:id]) : Newsly::Newsletter.create(:title => "Nyhetsbrevs rubrik", :body => "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.", :sent => false)
68
+ @newsletter = Newsly::Newsletter.find(params[:id])
68
69
  end
69
70
  end
70
71
  end
@@ -3,7 +3,8 @@ module Newsly
3
3
  class TemplatesController < ApplicationController
4
4
 
5
5
  def index
6
- @templates = Newsly::Template.where(:draft => false)
6
+ @templates = Newsly::Template.where(:draft => false).order('friendly_name')
7
+ @template_types = Newsly::Template.all.map(&:template_type).uniq
7
8
  end
8
9
 
9
10
  def show
@@ -36,10 +37,7 @@ module Newsly
36
37
 
37
38
  def publish
38
39
  @draft = Newsly::Template.find(params[:id])
39
- @original = Newsly::Template.find(@draft.parent_id)
40
- @original.subject = @draft.subject
41
- @original.body = @draft.body
42
- @original.save
40
+ @draft.publish
43
41
  render :text => "Published"
44
42
  end
45
43
 
@@ -12,7 +12,7 @@ module Newsly
12
12
  self.build_mail(@template.id, to, @template_data, @extra_headers)
13
13
  end
14
14
 
15
- def build_mail(template_id, to, template_data = {}, extra_headers = {})
15
+ def build_mail(template_id, to, template_data = {}, extra_headers = {}, layout = "newsly/mailer")
16
16
  headers = {}
17
17
  tmpl = Newsly::Template.find(template_id)
18
18
  headers[:to] = to
@@ -20,7 +20,7 @@ module Newsly
20
20
  body = tmpl.render(template_data)
21
21
  headers = headers.merge(extra_headers)
22
22
  mail(headers) do |format|
23
- format.html { render :inline => body, :layout => "newsly/mailer" }
23
+ format.html { render :inline => body, :layout => layout }
24
24
  end
25
25
  end
26
26
 
@@ -3,9 +3,10 @@ module Newsly
3
3
  class Newsletter < ActiveRecord::Base
4
4
  liquid_methods :title, :body
5
5
 
6
- def render(options={})
7
- Liquid::Template.parse(self.body).render options
8
- end
6
+
7
+ def render(options={})
8
+ Liquid::Template.parse(self.body).render options
9
+ end
9
10
 
10
11
  def draft?
11
12
  self.sent? || self.batch_sent? ? false : true
@@ -1,11 +1,24 @@
1
1
  # encoding: UTF-8
2
2
  module Newsly
3
3
  class Template < ActiveRecord::Base
4
- liquid_methods :body
4
+
5
+ liquid_methods :subject, :body
6
+
7
+ validates_presence_of :subject
8
+ validates_presence_of :body
9
+ #validates_presence_of :parent_id, :if => :original
10
+ #validates original is never draft and
5
11
 
6
12
  def render(options={})
7
- Liquid::Template.parse(self.body).render options
13
+ Liquid::Template.parse(self.body).render options
14
+ end
15
+
16
+ def publish
17
+ original = Newsly::Template.find(self.parent_id)
18
+ original.subject = self.subject
19
+ original.body = self.body
20
+ original.save
8
21
  end
9
-
10
- end
22
+
23
+ end
11
24
  end
@@ -1,15 +1,34 @@
1
1
  <%= render :partial => "/newsly/navigation" %>
2
2
  <div id="content">
3
3
  <h2><%= t("Templates")%></h2>
4
- <table cellspacing="0" cellpadding="0">
4
+ <ul class="type_tabs">
5
+ <li class="title">Show type:</li>
6
+ <li class="active"><%= link_to "All", templates_url %></li>
7
+ <% @template_types.each do |type| %>
8
+ <li class="<%=type.nil? ? "notype" : type %>">
9
+ <% if type.nil? %>
10
+ <%= link_to "No Type", "#", :data => {:type => "notype"} %>
11
+ <% else %>
12
+ <%= link_to type, "#", :data => {:type => type}%>
13
+ <% end %>
14
+ </li>
15
+ <% end %>
16
+ </ul>
17
+ <table cellspacing="0" cellpadding="0" id="templates">
5
18
  <tbody>
6
19
  <% @templates.each do |template| %>
7
- <tr>
8
- <td class="title"><%= link_to template.name, template %> (<%=t(template.template_type)%>)</td>
20
+ <tr class="<%= template.template_type.nil? ? "notype" : template.template_type%>">
21
+ <td class="title">
22
+ <%= link_to template.friendly_name || template.name, template, :class => "friendly_name" %>
23
+ <span class="type"><%=t(template.template_type)%></span>
24
+ <span class="desc">Lorem ipsum dolor sit amet conseqteur dolor amet.</span>
25
+ </td>
9
26
  </tr>
10
27
  <% end %>
11
28
  </tbody>
12
29
  </table>
13
30
  </div>
14
31
  <div id="sidebar">
15
- </div>
32
+ </div>
33
+
34
+ <%= javascript_include_tag "templates" %>
@@ -0,0 +1,6 @@
1
+ class AddFriendlyFieldsToTemplates < ActiveRecord::Migration
2
+ def change
3
+ add_column :newsly_templates, :friendly_name, :string
4
+ add_column :newsly_templates, :description, :string
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module Newsly
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -14,7 +14,6 @@ jQuery(document).ready(function($) {
14
14
  }
15
15
  });
16
16
  }
17
-
18
17
 
19
18
  $('a#deliver_batch').click(function(e){
20
19
  e.preventDefault();
@@ -30,7 +29,7 @@ jQuery(document).ready(function($) {
30
29
  var batch_size = parseInt($('#batch_size').val());
31
30
  if(answer == "BATCH"){
32
31
  $.ajax({
33
- url: url,
32
+ url: url,
34
33
  type: 'POST',
35
34
  data: {'_method': 'PUT', 'answer': answer, 'recipient_group': recipient_groups[0], 'batch_size': batch_size},
36
35
  success: function(data){
@@ -39,23 +38,23 @@ jQuery(document).ready(function($) {
39
38
  $('.groups').remove();
40
39
  }
41
40
  });
42
- }
41
+ }
43
42
  } else{
44
43
  alert('You have to select 1 (one) group to send to!');
45
44
  }
46
45
  });
47
46
 
48
47
  $('a#deliver').click(function(e){
49
- e.preventDefault();
48
+ e.preventDefault();
50
49
  top.Mercury.trigger('action', {action: 'save'});
51
- var url = $(this).attr('href');
50
+ var url = $(this).attr('href');
52
51
  var recipient_groups = get_recipient_groups();
53
52
  if(recipient_groups.length > 0){
54
53
  var newsletter_id = $("#newsletter").attr('data-id');
55
54
  var answer = prompt('Are you sure? Type "DELIVER"');
56
55
  if(answer == "DELIVER"){
57
56
  $.ajax({
58
- url: url,
57
+ url: url,
59
58
  type: 'POST',
60
59
  data: {'_method': 'PUT', 'answer': answer, 'recipient_groups[]': recipient_groups},
61
60
  success: function(data){
@@ -64,26 +63,26 @@ jQuery(document).ready(function($) {
64
63
  $('.groups').remove();
65
64
  }
66
65
  });
67
- }
66
+ }
68
67
  } else{
69
68
  alert('You have to select atleast one group to send to!');
70
69
  }
71
70
  });
72
71
 
73
72
  $('a#send_test').click(function(e){
74
- e.preventDefault();
75
- top.Mercury.trigger('action', {action: 'save'});
76
- var newsletter_id = $("#newsletter").attr('data-id');
77
- var url = $(this).attr('href');
73
+ e.preventDefault();
74
+ top.Mercury.trigger('action', {action: 'save'});
75
+ var newsletter_id = $("#newsletter").attr('data-id');
76
+ var url = $(this).attr('href');
78
77
  var to = prompt('to what email?');
79
- $.ajax({
78
+ $.ajax({
80
79
  url: url,
81
- type: 'POST',
82
- data: {'_method': "PUT", 'to': to},
83
- success: function(data){
84
- $("#flash").html(data).show().hide("fade", {}, 1000);
85
- }
86
- });
80
+ type: 'POST',
81
+ data: {'_method': "PUT", 'to': to},
82
+ success: function(data){
83
+ $("#flash").html(data).show().hide("fade", {}, 1000);
84
+ }
85
+ });
87
86
  });
88
87
 
89
88
  $('#groupform input[type=checkbox]').change(function(){
@@ -95,10 +94,10 @@ jQuery(document).ready(function($) {
95
94
  }
96
95
  set_batch_size();
97
96
  } else {
98
- $('.deliverbutton').hide();
97
+ $('.deliverbutton').hide();
99
98
  }
100
99
  });
101
- };
100
+ };
102
101
 
103
102
  });
104
103
 
@@ -127,6 +126,6 @@ var get_maximum_batch_size = function(){
127
126
  max_size = max_size + parseInt($(this).attr('data-max'));
128
127
  }
129
128
  });
130
- console.log('MAXIMUM SIZE '+ max_size);
131
- return max_size;
129
+ console.log('MAXIMUM SIZE '+ max_size);
130
+ return max_size;
132
131
  }
@@ -38,4 +38,17 @@ jQuery(document).ready(function($) {
38
38
  });
39
39
  });
40
40
 
41
+ $('.type_tabs a').click(function(e){
42
+ e.preventDefault();
43
+ template_type = ''+$(this).attr('data-type')+'';
44
+ $('.type_tabs li').removeClass('active');
45
+ $('table#templates tr').hide();
46
+ $(this).parent('li').addClass('active');
47
+ if(template_type != "undefined"){
48
+ $('table#templates tr.'+template_type+'').show();
49
+ } else {
50
+ $('table#templates tr').show();
51
+ }
52
+ });
53
+
41
54
  });
@@ -146,7 +146,7 @@ window.MercurySetup = {
146
146
  primary: {
147
147
  save: ['Save', 'Save this page'],
148
148
  //send_test: ['Send Test', 'Send Test Email'],
149
- //publish: ['Publish', 'Publish'],
149
+ //publish: ['Publish', 'Publish'],
150
150
  sep1: ' ',
151
151
  undoredo: {
152
152
  undo: ['Undo', 'Undo your last action'],
@@ -8761,6 +8761,7 @@ function defaultDisplay( nodeName ) {
8761
8761
  iframe.frameBorder = iframe.width = iframe.height = 0;
8762
8762
  }
8763
8763
 
8764
+
8764
8765
  document.body.appendChild( iframe );
8765
8766
 
8766
8767
  // Create a cacheable copy of the iframe document on first call.
@@ -69,17 +69,17 @@ a:hover {
69
69
  }
70
70
 
71
71
 
72
- table{
73
- width: 100%;
74
- }
75
- td.draft, td.sent, td.batch{
76
- width: 20px;
77
- }
78
- td.action{
79
- width: 20px;
80
- padding: 5px;
81
- font-size: 11px;
82
- }
72
+ table{
73
+ width: 100%;
74
+ }
75
+ td.draft, td.sent, td.batch{
76
+ width: 20px;
77
+ }
78
+ td.action{
79
+ width: 20px;
80
+ padding: 5px;
81
+ font-size: 11px;
82
+ }
83
83
  td {
84
84
  padding: 5px 10px;
85
85
  text-align: left;
@@ -103,6 +103,22 @@ td.batch{
103
103
  table tr:nth-child(2n+2){
104
104
  background: #eee;
105
105
  }
106
+ td.title span.desc{
107
+ float: left;
108
+ width: 100%;
109
+ font-size: 0.8em;
110
+ color: #555;
111
+ text-indent: 100px;
112
+ }
113
+ td.title span.type{
114
+ float: left;
115
+ font-size: 0.8em;
116
+ width: 100px;
117
+ }
118
+ td a.friendly_name{
119
+ font-weight: bold;
120
+ text-transform: capitalize;
121
+ }
106
122
  #sidebar ul {
107
123
  margin: 0;
108
124
  padding: 0;
@@ -270,4 +286,33 @@ form{
270
286
  }
271
287
  li.deliverbutton{
272
288
  display: none;
289
+ }
290
+
291
+ .type_tabs{
292
+ float: right;
293
+ margin-top: -40px;
294
+ font-size: 0.8em;
295
+ list-style: none;
296
+ }
297
+ .type_tabs li{
298
+ float: left;
299
+ }
300
+ .type_tabs li.title{
301
+ padding: 3px 5px;
302
+ }
303
+ .type_tabs li a {
304
+ padding: 3px 10px;
305
+ color: #000;
306
+ border-left: 1px solid #ccc;
307
+ float: left;
308
+ text-decoration: none;
309
+ }
310
+ .type_tabs li a:hover{
311
+ text-indent: 0px;
312
+ background: #eee;
313
+ color: #000;
314
+ }
315
+ .type_tabs li.active a{
316
+ font-weight: bold;
317
+ background: #ccc;
273
318
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: newsly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-10-06 00:00:00.000000000Z
13
+ date: 2011-10-25 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
17
- requirement: &2165539980 !ruby/object:Gem::Requirement
17
+ requirement: &2158529960 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 3.1.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2165539980
25
+ version_requirements: *2158529960
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: resque
28
- requirement: &2165539440 !ruby/object:Gem::Requirement
28
+ requirement: &2158529540 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2165539440
36
+ version_requirements: *2158529540
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: liquid
39
- requirement: &2165538860 !ruby/object:Gem::Requirement
39
+ requirement: &2158529080 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *2165538860
47
+ version_requirements: *2158529080
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: jquery-rails
50
- requirement: &2165538360 !ruby/object:Gem::Requirement
50
+ requirement: &2158528660 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :runtime
57
57
  prerelease: false
58
- version_requirements: *2165538360
58
+ version_requirements: *2158528660
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: resque-async_deliver
61
- requirement: &2165537860 !ruby/object:Gem::Requirement
61
+ requirement: &2158528240 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :runtime
68
68
  prerelease: false
69
- version_requirements: *2165537860
69
+ version_requirements: *2158528240
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: sqlite3
72
- requirement: &2165537320 !ruby/object:Gem::Requirement
72
+ requirement: &2158527820 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ! '>='
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: '0'
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *2165537320
80
+ version_requirements: *2158527820
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: letter_opener
83
- requirement: &2165536780 !ruby/object:Gem::Requirement
83
+ requirement: &2158527400 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - ! '>='
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: '0'
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *2165536780
91
+ version_requirements: *2158527400
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: unicorn
94
- requirement: &2165536280 !ruby/object:Gem::Requirement
94
+ requirement: &2158526980 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ! '>='
@@ -99,7 +99,51 @@ dependencies:
99
99
  version: '0'
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *2165536280
102
+ version_requirements: *2158526980
103
+ - !ruby/object:Gem::Dependency
104
+ name: rspec-rails
105
+ requirement: &2158553180 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *2158553180
114
+ - !ruby/object:Gem::Dependency
115
+ name: capybara
116
+ requirement: &2158552760 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *2158552760
125
+ - !ruby/object:Gem::Dependency
126
+ name: capybara-webkit
127
+ requirement: &2158552340 !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: *2158552340
136
+ - !ruby/object:Gem::Dependency
137
+ name: database_cleaner
138
+ requirement: &2158551920 !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: *2158551920
103
147
  description: Manage mailer templates via wysiwyg and liquid. Uses mercury editor for
104
148
  now. And send out newsletters.
105
149
  email:
@@ -115,7 +159,6 @@ files:
115
159
  - app/helpers/newsly/application_helper.rb
116
160
  - app/mailers/newsly/mailer.rb
117
161
  - app/models/newsly/newsletter.rb
118
- - app/models/newsly/recipient.rb
119
162
  - app/models/newsly/template.rb
120
163
  - app/views/layouts/newsly/application.html.erb
121
164
  - app/views/layouts/newsly/mailer.html.erb
@@ -136,7 +179,7 @@ files:
136
179
  - db/migrate/20110927120903_add_text_body_fields.rb
137
180
  - db/migrate/20110929142039_remove_text_body_fields.rb
138
181
  - db/migrate/20111004085523_add_fields_to_newsletter.rb
139
- - db/migrate/20111006122345_create_newsly_recipients.rb
182
+ - db/migrate/20111025072740_add_friendly_fields_to_templates.rb
140
183
  - lib/newsly/engine.rb
141
184
  - lib/newsly/version.rb
142
185
  - lib/newsly.rb
@@ -1,4 +0,0 @@
1
- module Newsly
2
- class Recipient < ActiveRecord::Base
3
- end
4
- end
@@ -1,9 +0,0 @@
1
- class CreateNewslyRecipients < ActiveRecord::Migration
2
- def change
3
- create_table :newsly_recipients do |t|
4
- t.newsletter_id :integer
5
- t.email :string
6
- t.timestamps
7
- end
8
- end
9
- end