letter_opener_web 1.2.1 → 1.2.2

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 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