back_mark 0.0.1
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.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/README +13 -0
- data/Rakefile +2 -0
- data/back_mark.gemspec +21 -0
- data/lib/back_mark/core_extensions.rb +2 -0
- data/lib/back_mark/version.rb +3 -0
- data/lib/back_mark.rb +132 -0
- data/test/back_mark_test.rb +11 -0
- metadata +71 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README
ADDED
data/Rakefile
ADDED
data/back_mark.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "back_mark/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "back_mark"
|
7
|
+
s.version = BackMark::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Satyaram B V"]
|
10
|
+
s.email = ["bvsatyaram AT gmail DOT com"]
|
11
|
+
s.homepage = "http://bvsatyaram.com"
|
12
|
+
s.summary = %q{Mark pages with labels that can be linked back from future pages as back links}
|
13
|
+
s.description = %q{Mark pages with labels that can be linked back from future pages as back links}
|
14
|
+
|
15
|
+
s.rubyforge_project = "back_mark"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
data/lib/back_mark.rb
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
# = Back mark gem
|
2
|
+
#
|
3
|
+
# Mark pages with labels that can be linked back from future pages as back
|
4
|
+
# links
|
5
|
+
#
|
6
|
+
# Also remembers the last accessed non Create/Update/Delete page (as in CRUD).
|
7
|
+
# For instance, a user is viewing items index, and navigates to 'new item'
|
8
|
+
# page. Once he is done with the creation of the item (i.e., POST to items/create),
|
9
|
+
# it would be nice if the user is taken to the index page rather than the 'new'
|
10
|
+
# page, which was the LAST VISITED page. Hence, such CUD actions are
|
11
|
+
# *_not_remembered_*.
|
12
|
+
#
|
13
|
+
# Author: Satyaram B V
|
14
|
+
#
|
15
|
+
# Inspired by back mark plugin authored by Vikram Venkatesan
|
16
|
+
|
17
|
+
require "back_mark/core_extensions"
|
18
|
+
|
19
|
+
module BackMark
|
20
|
+
module ControllerMethods
|
21
|
+
# Pages/Actions which we don't want to remember. We wouldnt ideally want to
|
22
|
+
# link back to new, edit, etc.,. We would only want to provide a link to the
|
23
|
+
# page that led to those pages
|
24
|
+
#
|
25
|
+
IGNORE_ACTIONS = %w(new edit create update destroy)
|
26
|
+
|
27
|
+
def self.included(controller)
|
28
|
+
controller.send :include, InstanceMethods
|
29
|
+
controller.before_filter :back_mark_pages
|
30
|
+
end
|
31
|
+
|
32
|
+
module InstanceMethods
|
33
|
+
# Marks the current url with the given label. Invoke from an action with
|
34
|
+
# a meaningful label, if you want that page to be linked back from future
|
35
|
+
# pages
|
36
|
+
#
|
37
|
+
# ==== Params
|
38
|
+
# label :: label for the back mark
|
39
|
+
# url_to_mark :: the url to remember instead of the current request
|
40
|
+
# url
|
41
|
+
# mark_now :: Mark the location so that the back link can be rendered
|
42
|
+
# in the current action
|
43
|
+
#
|
44
|
+
# ===== Examples
|
45
|
+
# back_mark("Inbox")
|
46
|
+
# back_mark("Home")
|
47
|
+
# back_mark("Login", '/login', true)
|
48
|
+
#
|
49
|
+
def back_mark(label, url_to_mark = request.url, mark_now = false)
|
50
|
+
# Ignore AJAX requests since they cannot be linked back.
|
51
|
+
return if request.xhr?
|
52
|
+
|
53
|
+
# Mark directly into back_url directly so that we can render in the
|
54
|
+
# current action itself.
|
55
|
+
if mark_now
|
56
|
+
session[:back_label] = session[:prev_label] = label
|
57
|
+
session[:back_url] = session[:prev_label] = url_to_mark
|
58
|
+
@back_marked = true
|
59
|
+
return
|
60
|
+
end
|
61
|
+
|
62
|
+
# Set back url and label from previously back marked page
|
63
|
+
session[:back_url] = session[:prev_url]
|
64
|
+
session[:back_label] = session[:prev_label]
|
65
|
+
|
66
|
+
# Mark the current page
|
67
|
+
session[:prev_url] = url_to_mark
|
68
|
+
session[:prev_label] = label
|
69
|
+
@back_marked = true
|
70
|
+
end
|
71
|
+
|
72
|
+
# Redirect to the back link stored in the session or redirect to the
|
73
|
+
# default url passed.
|
74
|
+
#
|
75
|
+
# NOTE: We redirect back to the url stored by the filter. Not the last
|
76
|
+
# back_marked url.
|
77
|
+
#
|
78
|
+
def redirect_to_back_mark_or_default(default_url)
|
79
|
+
redirect_to((@marked_in_filter ? session[:filter_back_url] :
|
80
|
+
session[:filter_prev_url]) || default_url)
|
81
|
+
|
82
|
+
session[:filter_back_url] = nil
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Add this as a before filter for marking the current request url
|
87
|
+
def back_mark_pages(options = {})
|
88
|
+
options_to_use = {:force_mark => false}.merge(options)
|
89
|
+
|
90
|
+
# Ignore AJAX requests since they cannot be linked back.
|
91
|
+
# Also ignore actions in IGNORE_ACTIONS
|
92
|
+
return if request.xhr? || (!options_to_use[:force_mark] && IGNORE_ACTIONS.include?(params[:action]))
|
93
|
+
|
94
|
+
session[:filter_back_url] = session[:filter_prev_url]
|
95
|
+
session[:filter_prev_url] = options_to_use[:url] || request.url
|
96
|
+
@marked_in_filter = true
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
module ViewMethods
|
101
|
+
# Returns the stored back url or the given default_url if the former is
|
102
|
+
# empty
|
103
|
+
#
|
104
|
+
def back_url_or_default(default_url)
|
105
|
+
(@marked_in_filter ? session[:filter_back_url] :
|
106
|
+
session[:filter_prev_url]) || default_url
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns the last back_marked page url
|
110
|
+
def back_url
|
111
|
+
@back_marked ? session[:back_url] : session[:prev_url]
|
112
|
+
end
|
113
|
+
|
114
|
+
# Returns the last back_marked label
|
115
|
+
def back_label
|
116
|
+
@back_marked ? session[:back_label] : session[:prev_label]
|
117
|
+
end
|
118
|
+
|
119
|
+
# Renders a link back to the previous page stored in the session with the
|
120
|
+
# stored label if both of them are available
|
121
|
+
#
|
122
|
+
def render_back_link
|
123
|
+
# Dont render back link if the back url is the same as the current page
|
124
|
+
return if back_url == request.url
|
125
|
+
|
126
|
+
if back_url && back_label
|
127
|
+
link_to "« Back to '#{back_label}'", back_url, :id => 'back_link'
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: back_mark
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Satyaram B V
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-03-27 00:00:00 +05:30
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: Mark pages with labels that can be linked back from future pages as back links
|
22
|
+
email:
|
23
|
+
- bvsatyaram AT gmail DOT com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- .gitignore
|
32
|
+
- Gemfile
|
33
|
+
- README
|
34
|
+
- Rakefile
|
35
|
+
- back_mark.gemspec
|
36
|
+
- lib/back_mark.rb
|
37
|
+
- lib/back_mark/core_extensions.rb
|
38
|
+
- lib/back_mark/version.rb
|
39
|
+
- test/back_mark_test.rb
|
40
|
+
has_rdoc: true
|
41
|
+
homepage: http://bvsatyaram.com
|
42
|
+
licenses: []
|
43
|
+
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
segments:
|
54
|
+
- 0
|
55
|
+
version: "0"
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
requirements: []
|
64
|
+
|
65
|
+
rubyforge_project: back_mark
|
66
|
+
rubygems_version: 1.3.6
|
67
|
+
signing_key:
|
68
|
+
specification_version: 3
|
69
|
+
summary: Mark pages with labels that can be linked back from future pages as back links
|
70
|
+
test_files: []
|
71
|
+
|