rails_cacheable_flash 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Andrey
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ rails_cacheable_flash
2
+ ===============
3
+
4
+ Кэшируемый флеш. Позволяет отрабатывать флеш-нотисы на кэшируемых страницах.
5
+
6
+ Может использоваться совместно со Spree.
7
+
8
+ Подключение:
9
+
10
+ 1. В нужном контроллере подключаете джем (фактически там, где потенциально могут появляться флеш-нотисы)
11
+
12
+ include RailsCacheableFlash
13
+
14
+ 2. В йаваскрипте подключаете js-библиотеку джема и даете указания выводить флеш нотисы перед определенным контейнером
15
+
16
+ //= require cacheable_flah
17
+
18
+ ...
19
+
20
+ $(document).ready(function() {
21
+
22
+ ...
23
+
24
+ Flash.transferFromCookies();
25
+
26
+ Flash.writeDataFrom('notice', '#container980');
27
+
28
+ Flash.writeDataFrom('error', '#container980');
29
+
30
+ });
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/rails_cacheable_flash/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Andrey"]
6
+ gem.email = ["railscode@gmail.com"]
7
+ gem.description = "Кэшируемый флеш"
8
+ gem.summary = "Суммари"
9
+ gem.homepage = ""
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "rails_cacheable_flash"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = RailsCacheableFlash::VERSION
17
+ end
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+ module RailsCacheableFlash
3
+ class Engine < ::Rails::Engine
4
+ if ::Rails::VERSION::MAJOR == 3 && ::Rails::VERSION::MAJOR >= 1
5
+ isolate_namespace RailsCacheableFlash
6
+ end
7
+ end
8
+
9
+ def self.included(base)
10
+ base.after_filter :write_flash_to_cookie
11
+ end
12
+
13
+ def write_flash_to_cookie
14
+ cookie_flash = JSON.parse(cookies['flash']) rescue {}
15
+ flash.each do |key, value|
16
+ cookie_flash[key.to_s] = value
17
+ end
18
+ cookies['flash'] = cookie_flash.to_json
19
+ flash.clear
20
+
21
+ if defined?(Spree::Core)
22
+ set_customizer_cookies
23
+ # save_referrer_to_order
24
+ end
25
+ end
26
+
27
+ # TODO: реализовать и проверить save_referrer_to_order на кэшируемых страницах
28
+ # def save_referrer_to_order
29
+ # session[:referrer] = nil # request.env['HTTP_REFERER'] if !session[:referrer]
30
+ # puts "===================="
31
+ # puts "current_order: #{current_order}"
32
+ # puts "request.env['HTTP_REFERER']: #{request.env['HTTP_REFERER']}"
33
+ # puts "session[:referrer]: #{session[:referrer]}"
34
+ # puts "===================="
35
+ # end
36
+
37
+ def set_customizer_cookies
38
+ cookies[:authenticity_token] = session[:_csrf_token] ||= SecureRandom.base64(32)
39
+ cookies[:current_user_id] = current_user.try(:id)
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ module RailsCacheableFlash
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,2 @@
1
+ require "cacheable_flash/version"
2
+ require "cacheable_flash/engine"
@@ -0,0 +1,4 @@
1
+ //= require flash/cookie
2
+ //= require flash/json
3
+ //= require flash/flash
4
+ //= require flash/notice
@@ -0,0 +1,49 @@
1
+ // From http://wiki.script.aculo.us/scriptaculous/show/Cookie
2
+ var Cookie = {
3
+ set: function(name, value, daysToExpire) {
4
+ var expire = '';
5
+ if(!daysToExpire) daysToExpire = 365;
6
+ var d = new Date();
7
+ d.setTime(d.getTime() + (86400000 * parseFloat(daysToExpire)));
8
+ expire = 'expires=' + d.toGMTString();
9
+ var path = "path=/"
10
+ var cookieValue = escape(name) + '=' + escape(value || '') + '; ' + path + '; ' + expire + ';';
11
+ return document.cookie = cookieValue;
12
+ },
13
+ get: function(name) {
14
+ var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]+)'));
15
+ return (cookie ? unescape(cookie[2]) : null);
16
+ },
17
+ erase: function(name) {
18
+ var cookie = Cookie.get(name) || true;
19
+ Cookie.set(name, '', -1);
20
+ return cookie;
21
+ },
22
+ eraseAll: function() {
23
+ // Get cookie string and separate into individual cookie phrases:
24
+ var cookieString = "" + document.cookie;
25
+ var cookieArray = cookieString.split("; ");
26
+
27
+ // Try to delete each cookie:
28
+ for(var i = 0; i < cookieArray.length; ++ i)
29
+ {
30
+ var singleCookie = cookieArray[i].split("=");
31
+ if(singleCookie.length != 2)
32
+ continue;
33
+ var name = unescape(singleCookie[0]);
34
+ Cookie.erase(name);
35
+ }
36
+ },
37
+ accept: function() {
38
+ if (typeof navigator.cookieEnabled == 'boolean') {
39
+ return navigator.cookieEnabled;
40
+ }
41
+ Cookie.set('_test', '1');
42
+ return (Cookie.erase('_test') === '1');
43
+ },
44
+ exists: function(cookieName) {
45
+ var cookieValue = Cookie.get(cookieName);
46
+ if(!cookieValue) return false;
47
+ return cookieValue.toString() != "";
48
+ }
49
+ };
@@ -0,0 +1,29 @@
1
+ var Flash = new Object();
2
+
3
+ Flash.data = {};
4
+
5
+ Flash.transferFromCookies = function() {
6
+ var data = JSON.parse(unescape(Cookie.get("flash")));
7
+ if(!data) data = {};
8
+ Flash.data = data;
9
+ Cookie.erase("flash");
10
+ };
11
+
12
+ Flash.writeDataTo = function(name, element) {
13
+ element = $(element);
14
+ var content = "";
15
+ if(Flash.data[name]) {
16
+ content = Flash.data[name].toString().replace(/\+/g, ' ');
17
+ }
18
+ element.html(unescape(content));
19
+ };
20
+
21
+ Flash.writeDataFrom = function(name, before_selector) {
22
+ var content = "";
23
+ if(Flash.data[name]) {
24
+ content = Flash.data[name].toString().replace(/\+/g, ' ');
25
+ }
26
+ if (content != ""){
27
+ $('<div id="flash" class="flash flash-'+name+'"><div class="closer" id="closer">x</div><div class="message">'+unescape(content)+'</div></div>').insertBefore(before_selector);
28
+ }
29
+ };
@@ -0,0 +1,139 @@
1
+ /*
2
+ Copyright (c) 2005 JSON.org
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The Software shall be used for Good, not Evil.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
20
+ */
21
+
22
+ /*
23
+ The global object JSON contains two methods.
24
+
25
+ JSON.stringify(value) takes a JavaScript value and produces a JSON text.
26
+ The value must not be cyclical.
27
+
28
+ JSON.parse(text) takes a JSON text and produces a JavaScript value. It will
29
+ return false if there is an error.
30
+ */
31
+ var JSON = function () {
32
+ var m = {
33
+ '\b': '\\b',
34
+ '\t': '\\t',
35
+ '\n': '\\n',
36
+ '\f': '\\f',
37
+ '\r': '\\r',
38
+ '"' : '\\"',
39
+ '\\': '\\\\'
40
+ },
41
+ s = {
42
+ 'boolean': function (x) {
43
+ return String(x);
44
+ },
45
+ number: function (x) {
46
+ return isFinite(x) ? String(x) : 'null';
47
+ },
48
+ string: function (x) {
49
+ if (/["\\\x00-\x1f]/.test(x)) {
50
+ x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
51
+ var c = m[b];
52
+ if (c) {
53
+ return c;
54
+ }
55
+ c = b.charCodeAt();
56
+ return '\\u00' +
57
+ Math.floor(c / 16).toString(16) +
58
+ (c % 16).toString(16);
59
+ });
60
+ }
61
+ return '"' + x + '"';
62
+ },
63
+ object: function (x) {
64
+ if (x) {
65
+ var a = [], b, f, i, l, v;
66
+ if (x instanceof Array) {
67
+ a[0] = '[';
68
+ l = x.length;
69
+ for (i = 0; i < l; i += 1) {
70
+ v = x[i];
71
+ f = s[typeof v];
72
+ if (f) {
73
+ v = f(v);
74
+ if (typeof v == 'string') {
75
+ if (b) {
76
+ a[a.length] = ',';
77
+ }
78
+ a[a.length] = v;
79
+ b = true;
80
+ }
81
+ }
82
+ }
83
+ a[a.length] = ']';
84
+ } else if (x instanceof Object) {
85
+ a[0] = '{';
86
+ for (i in x) {
87
+ v = x[i];
88
+ f = s[typeof v];
89
+ if (f) {
90
+ v = f(v);
91
+ if (typeof v == 'string') {
92
+ if (b) {
93
+ a[a.length] = ',';
94
+ }
95
+ a.push(s.string(i), ':', v);
96
+ b = true;
97
+ }
98
+ }
99
+ }
100
+ a[a.length] = '}';
101
+ } else {
102
+ return;
103
+ }
104
+ return a.join('');
105
+ }
106
+ return 'null';
107
+ }
108
+ };
109
+ return {
110
+ copyright: '(c)2005 JSON.org',
111
+ license: 'http://www.JSON.org/license.html',
112
+ /*
113
+ Stringify a JavaScript value, producing a JSON text.
114
+ */
115
+ stringify: function (v) {
116
+ var f = s[typeof v];
117
+ if (f) {
118
+ v = f(v);
119
+ if (typeof v == 'string') {
120
+ return v;
121
+ }
122
+ }
123
+ return null;
124
+ },
125
+ /*
126
+ Parse a JSON text, producing a JavaScript value.
127
+ It returns false if there is a syntax error.
128
+ */
129
+ parse: function (text) {
130
+ try {
131
+ return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
132
+ text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
133
+ eval('(' + text + ')');
134
+ } catch (e) {
135
+ return false;
136
+ }
137
+ }
138
+ };
139
+ }();
@@ -0,0 +1,14 @@
1
+ function close_flash() {
2
+ $("#closer").live('click', function(){
3
+ var flash = $(this).parents('div:first');
4
+ flash.animate({opacity: 1.0, top: '+=20'});
5
+ flash.animate({opacity: 0.75, top: '-=500'}, 300, function() {
6
+ flash.remove();
7
+ });
8
+ return false;
9
+ });
10
+ };
11
+
12
+ $(document).ready(function() {
13
+ close_flash();
14
+ });
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_cacheable_flash
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Andrey
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-05 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Кэшируемый флеш
15
+ email:
16
+ - railscode@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - Gemfile
23
+ - LICENSE
24
+ - README.md
25
+ - Rakefile
26
+ - cacheable_flash.gemspec
27
+ - lib/rails_cacheable_flash.rb
28
+ - lib/rails_cacheable_flash/engine.rb
29
+ - lib/rails_cacheable_flash/version.rb
30
+ - vendor/assets/javascripts/cacheable_flash.js
31
+ - vendor/assets/javascripts/flash/cookie.js
32
+ - vendor/assets/javascripts/flash/flash.js
33
+ - vendor/assets/javascripts/flash/json.js
34
+ - vendor/assets/javascripts/flash/notice.js
35
+ homepage: ''
36
+ licenses: []
37
+ post_install_message:
38
+ rdoc_options: []
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 1.8.23
56
+ signing_key:
57
+ specification_version: 3
58
+ summary: Суммари
59
+ test_files: []