letter_opener_web 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3e948d6b3a8faf888e0f105028bf9b4051b7fa67
4
- data.tar.gz: 9f62ee471d1d30ecf94e8f23b487059d40ed821f
3
+ metadata.gz: c6a68770b043595bf19b9615ae05ed7ebd136c29
4
+ data.tar.gz: 35cc68611bee3af314dec5272832a425576f3af9
5
5
  SHA512:
6
- metadata.gz: 9e1dd49900294cad2345ac17344a715954ad769f0d9fd24a6f60f0b712c55c3b321320d65689eb56c044c91eec1ba3180c17de486fce420d2f8587bd0288d0de
7
- data.tar.gz: fedad057c7efe7e5f8b1c7679f975cf1ad0494e789cbf072fddead0277112b4145a3e2fdec3c65dc36faedc77efab38d36d4972305d6827de46d06c8d38c3454
6
+ metadata.gz: 5ecc4124d756e3ce10db48afe67600d3ea7cea179f15acbb4b60033da481d43142c8edd5a21fec7faef1ea722bea198e80ff15361669fe6276be9a57ae8b38db
7
+ data.tar.gz: 4d0f62dc1159ec23afcb9803f965d363d0a310087df622d1b29e3863f0be2024869a4ff2d6b3b746698bc2f8ee01a66c5af418ab4a59f7e643eaa97d94f71a9b
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [1.2.2](https://github.com/fgrehm/letter_opener_web/compare/v1.2.1...v1.2.2) (Jul 17, 2014)
2
+
3
+ - Precompile glyphicons [#30](https://github.com/fgrehm/letter_opener_web/pull/30)
4
+ - Display letters count on the favicon [#29](https://github.com/fgrehm/letter_opener_web/pull/29)
5
+ - Validate params passed in to the LettersController and return a 404 in case an email can't be found [#28](https://github.com/fgrehm/letter_opener_web/pull/28)
6
+
1
7
  ## [1.2.1](https://github.com/fgrehm/letter_opener_web/compare/v1.2.0...v1.2.1) (Apr 07, 2014)
2
8
 
3
9
  - Improve Rails 3 compatibility [#26](https://github.com/fgrehm/letter_opener_web/pull/26) / [#27](https://github.com/fgrehm/letter_opener_web/pull/27)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- letter_opener_web (1.2.1)
4
+ letter_opener_web (1.2.2)
5
5
  letter_opener (~> 1.0)
6
6
  rails (>= 3.2)
7
7
 
@@ -1,7 +1,15 @@
1
1
  //= require letter_opener_web/jquery-1.8.3.min
2
2
  //= require letter_opener_web/jquery_ujs
3
+ //= require letter_opener_web/favcount
4
+
5
+ function update_favicon(favicon) {
6
+ favicon.set($('.letter-opener tbody tr').length);
7
+ }
3
8
 
4
9
  jQuery(function($) {
10
+ var favicon = new Favcount($('link[rel="icon"]').attr('href'));
11
+ update_favicon(favicon);
12
+
5
13
  $('.letter-opener').on('click', 'tr', function() {
6
14
  var $this = $(this);
7
15
  $('iframe').attr('src', $this.find('a').attr('href'));
@@ -16,6 +24,7 @@ jQuery(function($) {
16
24
  table.find('tbody').empty().append('<tr><td colspan="2">Loading...</td></tr>');
17
25
  table.load(table.data('letters-path') + ' .letter-opener', function() {
18
26
  $('iframe').attr('src', $('.letter-opener tbody a:first-child()').attr('href'));
27
+ update_favicon(favicon);
19
28
  });
20
29
  });
21
30
  });
@@ -2,23 +2,25 @@ require_dependency "letter_opener_web/application_controller"
2
2
 
3
3
  module LetterOpenerWeb
4
4
  class LettersController < ApplicationController
5
+ before_filter :check_style, :only => [:show]
6
+ before_filter :load_letter, :only => [:show, :attachment, :destroy]
7
+
5
8
  def index
6
9
  @letters = Letter.search
7
10
  end
8
11
 
9
12
  def show
10
- letter = Letter.find(params[:id])
11
- text = letter.send("#{params[:style]}_text").
12
- gsub(/"plain\.html"/, "\"#{LetterOpenerWeb.railtie_routes_url_helpers.letter_path(:id => letter.id, :style => 'plain')}\"").
13
- gsub(/"rich\.html"/, "\"#{LetterOpenerWeb.railtie_routes_url_helpers.letter_path(:id => letter.id, :style => 'rich')}\"")
13
+ text = @letter.send("#{params[:style]}_text").
14
+ gsub(/"plain\.html"/, "\"#{LetterOpenerWeb.railtie_routes_url_helpers.letter_path(:id => @letter.id, :style => 'plain')}\"").
15
+ gsub(/"rich\.html"/, "\"#{LetterOpenerWeb.railtie_routes_url_helpers.letter_path(:id => @letter.id, :style => 'rich')}\"")
14
16
  render :text => text
15
17
  end
16
18
 
17
19
  def attachment
18
- letter = Letter.find(params[:id])
20
+ @letter = Letter.find(params[:id])
19
21
  filename = "#{params[:file]}.#{params[:format]}"
20
22
 
21
- if file = letter.attachments[filename]
23
+ if file = @letter.attachments[filename]
22
24
  send_file(file, :filename => filename, :disposition => 'inline')
23
25
  else
24
26
  render :text => 'Attachment not found!', :status => 404
@@ -31,9 +33,22 @@ module LetterOpenerWeb
31
33
  end
32
34
 
33
35
  def destroy
34
- letter = Letter.find(params[:id])
35
- letter.delete
36
+ @letter = Letter.find(params[:id])
37
+ @letter.delete
36
38
  redirect_to LetterOpenerWeb.railtie_routes_url_helpers.letters_path
37
39
  end
40
+
41
+ private
42
+
43
+ def check_style
44
+ params[:style] = 'rich' unless ['plain', 'rich'].include? params[:style]
45
+ end
46
+
47
+ def load_letter
48
+ if params[:id]
49
+ @letter = Letter.find(params[:id])
50
+ render :nothing => true, :status => 404 unless @letter.exists?
51
+ end
52
+ end
38
53
  end
39
54
  end
@@ -54,6 +54,10 @@ module LetterOpenerWeb
54
54
  FileUtils.rm_rf("#{letters_location}/#{self.id}")
55
55
  end
56
56
 
57
+ def exists?
58
+ File.exists?(base_dir)
59
+ end
60
+
57
61
  private
58
62
 
59
63
  def base_dir
@@ -4,6 +4,7 @@
4
4
  <title>LetterOpenerWeb</title>
5
5
  <%= stylesheet_link_tag "letter_opener_web/application", :media => "all" %>
6
6
  <%= javascript_include_tag "letter_opener_web/application" %>
7
+ <%= favicon_link_tag asset_path("letter_opener_web/blue-dot.ico"), :rel => "icon" %>
7
8
  <%= csrf_meta_tags %>
8
9
  </head>
9
10
  <body>
@@ -13,7 +13,13 @@ module LetterOpenerWeb
13
13
  end
14
14
 
15
15
  initializer "assets" do |app|
16
- Rails.application.config.assets.precompile += %w( letter_opener_web/application.js letter_opener_web/application.css )
16
+ Rails.application.config.assets.precompile += %w(
17
+ letter_opener_web/application.js
18
+ letter_opener_web/application.css
19
+ letter_opener_web/glyphicons-halflings.png
20
+ letter_opener_web/glyphicons-halflings-white.png
21
+ letter_opener_web/blue-dot.ico
22
+ )
17
23
  end
18
24
  end
19
25
  end
@@ -1,3 +1,3 @@
1
1
  module LetterOpenerWeb
2
- VERSION = "1.2.1"
2
+ VERSION = "1.2.2"
3
3
  end
@@ -18,12 +18,12 @@ describe LetterOpenerWeb::LettersController do
18
18
  let(:plain_text) { "plain text href=\"rich.html\"" }
19
19
  let(:letter) { double(:letter, :rich_text => rich_text, :plain_text => plain_text, :id => id) }
20
20
 
21
- before do
22
- allow(LetterOpenerWeb::Letter).to receive_messages(:find => letter)
23
- end
24
-
25
21
  context 'rich text version' do
26
- before { get :show, :id => id, :style => 'rich' }
22
+ before do
23
+ allow(LetterOpenerWeb::Letter).to receive_messages(:find => letter)
24
+ allow(letter).to receive_messages(:exists? => true)
25
+ get :show, :id => id, :style => 'rich'
26
+ end
27
27
 
28
28
  it "returns letter's rich text contents" do
29
29
  expect(response.body).to match(/^rich text/)
@@ -36,7 +36,11 @@ describe LetterOpenerWeb::LettersController do
36
36
  end
37
37
 
38
38
  context 'plain text version' do
39
- before { get :show, :id => id, :style => 'plain' }
39
+ before do
40
+ allow(LetterOpenerWeb::Letter).to receive_messages(:find => letter)
41
+ allow(letter).to receive_messages(:exists? => true)
42
+ get :show, :id => id, :style => 'plain'
43
+ end
40
44
 
41
45
  it "returns letter's plain text contents" do
42
46
  expect(response.body).to match(/^plain text/)
@@ -47,6 +51,13 @@ describe LetterOpenerWeb::LettersController do
47
51
  expect(response.body).to match(/href="#{Regexp.escape letter_path(:id => letter.id, :style => 'rich')}"/)
48
52
  end
49
53
  end
54
+
55
+ context 'with wrong parameters' do
56
+ it 'should return 404 when invalid id given' do
57
+ get :show, :id => id, :style => 'rich'
58
+ expect(response.status).to eq(404)
59
+ end
60
+ end
50
61
  end
51
62
 
52
63
  describe 'GET attachment' do
@@ -58,6 +69,7 @@ describe LetterOpenerWeb::LettersController do
58
69
  before do
59
70
  allow(LetterOpenerWeb::Letter).to receive_messages(:find => letter)
60
71
  allow(controller).to receive(:send_file) { controller.render :nothing => true }
72
+ allow(letter).to receive_messages(:exists? => true)
61
73
  end
62
74
 
63
75
  it 'sends the file as an inline attachment' do
@@ -87,6 +99,7 @@ describe LetterOpenerWeb::LettersController do
87
99
  describe 'DELETE destroy' do
88
100
  let(:id) { 'an-id' }
89
101
  it 'removes the selected letter' do
102
+ allow_any_instance_of(LetterOpenerWeb::Letter).to receive(:exists?).and_return(true)
90
103
  expect_any_instance_of(LetterOpenerWeb::Letter).to receive(:delete)
91
104
  delete :destroy, :id => id, :use_route => :letter_opener_web
92
105
  end
@@ -0,0 +1,102 @@
1
+ /*
2
+ * favcount.js v1.5.0
3
+ * http://chrishunt.co/favcount
4
+ * Dynamically updates the favicon with a number.
5
+ *
6
+ * Copyright 2013, Chris Hunt
7
+ * Released under the MIT license
8
+ */
9
+
10
+ (function(){
11
+ function Favcount(icon) {
12
+ this.icon = icon;
13
+ this.opacity = 0.4;
14
+ this.canvas = document.createElement('canvas');
15
+ this.font = "Helvetica, Arial, sans-serif";
16
+ }
17
+
18
+ Favcount.prototype.set = function(count) {
19
+ var self = this,
20
+ img = document.createElement('img');
21
+
22
+ if (self.canvas.getContext) {
23
+ img.crossOrigin = "anonymous";
24
+
25
+ img.onload = function() {
26
+ drawCanvas(self.canvas, self.opacity, self.font, img, normalize(count));
27
+ };
28
+
29
+ img.src = this.icon;
30
+ }
31
+ };
32
+
33
+ function normalize(count) {
34
+ count = Math.round(count);
35
+
36
+ if (isNaN(count) || count < 1) {
37
+ return '';
38
+ } else if (count < 10) {
39
+ return ' ' + count;
40
+ } else if (count > 99) {
41
+ return '99';
42
+ } else {
43
+ return count;
44
+ }
45
+ }
46
+
47
+ function drawCanvas(canvas, opacity, font, img, count) {
48
+ var head = document.getElementsByTagName('head')[0],
49
+ favicon = document.createElement('link'),
50
+ multiplier, fontSize, context, xOffset, yOffset, border, shadow;
51
+
52
+ favicon.rel = 'icon';
53
+
54
+ // Scale canvas elements based on favicon size
55
+ multiplier = img.width / 16;
56
+ fontSize = multiplier * 11;
57
+ xOffset = multiplier;
58
+ yOffset = multiplier * 11;
59
+ border = multiplier;
60
+ shadow = multiplier * 2;
61
+
62
+ canvas.height = canvas.width = img.width;
63
+ context = canvas.getContext('2d');
64
+ context.font = 'bold ' + fontSize + 'px ' + font;
65
+
66
+ // Draw faded favicon background
67
+ if (count) { context.globalAlpha = opacity; }
68
+ context.drawImage(img, 0, 0);
69
+ context.globalAlpha = 1.0;
70
+
71
+ // Draw white drop shadow
72
+ context.shadowColor = '#FFF';
73
+ context.shadowBlur = shadow;
74
+ context.shadowOffsetX = 0;
75
+ context.shadowOffsetY = 0;
76
+
77
+ // Draw white border
78
+ context.fillStyle = '#FFF';
79
+ context.fillText(count, xOffset, yOffset);
80
+ context.fillText(count, xOffset + border, yOffset);
81
+ context.fillText(count, xOffset, yOffset + border);
82
+ context.fillText(count, xOffset + border, yOffset + border);
83
+
84
+ // Draw black count
85
+ context.fillStyle = '#000';
86
+ context.fillText(count,
87
+ xOffset + (border / 2.0),
88
+ yOffset + (border / 2.0)
89
+ );
90
+
91
+ // Replace favicon with new favicon
92
+ favicon.href = canvas.toDataURL('image/png');
93
+ head.removeChild(document.querySelector('link[rel=icon]'));
94
+ head.appendChild(favicon);
95
+ }
96
+
97
+ this.Favcount = Favcount;
98
+ }).call(this);
99
+
100
+ (function(){
101
+ Favcount.VERSION = '1.5.0';
102
+ }).call(this);
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: letter_opener_web
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Rehm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-13 00:00:00.000000000 Z
11
+ date: 2014-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -120,9 +120,11 @@ files:
120
120
  - spec/internal/public/favicon.ico
121
121
  - spec/models/letter_opener_web/letter_spec.rb
122
122
  - spec/spec_helper.rb
123
+ - vendor/assets/images/letter_opener_web/blue-dot.ico
123
124
  - vendor/assets/images/letter_opener_web/glyphicons-halflings-white.png
124
125
  - vendor/assets/images/letter_opener_web/glyphicons-halflings.png
125
126
  - vendor/assets/javascripts/letter_opener_web/bootstrap.min.js
127
+ - vendor/assets/javascripts/letter_opener_web/favcount.js
126
128
  - vendor/assets/javascripts/letter_opener_web/jquery-1.8.3.min.js
127
129
  - vendor/assets/javascripts/letter_opener_web/jquery_ujs.js
128
130
  - vendor/assets/stylesheets/letter_opener_web/bootstrap.min.css