newsly 0.3.1 → 0.4.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.
@@ -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