redmine_refresh 0.3.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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +40 -0
- data/Rakefile +1 -0
- data/app/overrides/issues/index.rb +5 -0
- data/app/overrides/my/page.rb +5 -0
- data/app/views/redmine_refresh/_refresher.html.erb +51 -0
- data/config/locales/en.yml +3 -0
- data/config/locales/fr.yml +3 -0
- data/config/locales/zh.yml +9 -0
- data/init.rb +19 -0
- data/lib/redmine_refresh/version.rb +3 -0
- data/lib/redmine_refresh.rb +48 -0
- data/redmine_refresh.gemspec +25 -0
- data/test/test_helper.rb +2 -0
- data/test/unit/redmine_refresh_test.rb +103 -0
- metadata +119 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 jbbarth
|
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,40 @@
|
|
1
|
+
Redmine Refresh plugin
|
2
|
+
======================
|
3
|
+
|
4
|
+
This plugins adds an automatic refresh on "Issues" lists and "My Page".
|
5
|
+
|
6
|
+
Screenshot
|
7
|
+
----------
|
8
|
+
|
9
|
+
With this plugin you'll have a clickable link on these pages for enabling/disabling automatic refresh. Here's an example on an Issues list:
|
10
|
+
|
11
|
+

|
12
|
+
|
13
|
+
Installation
|
14
|
+
------------
|
15
|
+
|
16
|
+
This plugin is compatible with Redmine 2.1.x and 2.2.x, and should be compatible with future versions.
|
17
|
+
|
18
|
+
Add this line to your redmine's Gemfile.local:
|
19
|
+
|
20
|
+
gem 'redmine_refresh'
|
21
|
+
|
22
|
+
And then execute:
|
23
|
+
|
24
|
+
$ bundle install
|
25
|
+
|
26
|
+
And restart your Redmine instance.
|
27
|
+
|
28
|
+
This gem aims at working inside a Redmine instance. Any other usage is discouraged.
|
29
|
+
|
30
|
+
Note that general instructions for plugins [here](http://www.redmine.org/wiki/redmine/Plugins) don't apply here.
|
31
|
+
|
32
|
+
|
33
|
+
Contributing
|
34
|
+
------------
|
35
|
+
|
36
|
+
1. Fork it
|
37
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
38
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
39
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
40
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,51 @@
|
|
1
|
+
<%
|
2
|
+
interval = RedmineRefresh.refresh_interval_for(User.current, params[:refresh])
|
3
|
+
should_be_refreshed = RedmineRefresh.refresh_status_for_controller(User.current, controller.controller_name)
|
4
|
+
should_be_refreshed ||= params[:refresh].present?
|
5
|
+
should_be_refreshed = false if params[:norefresh]
|
6
|
+
RedmineRefresh.save_refresh_status_for_controller(User.current, controller.controller_name, should_be_refreshed)
|
7
|
+
%>
|
8
|
+
<script type="text/javascript">
|
9
|
+
//<![CDATA[
|
10
|
+
//ADAPTED FROM:
|
11
|
+
//http://www.dynamicdrive.com/dynamicindex6/refresh.htm
|
12
|
+
|
13
|
+
//configure refresh interval (in seconds)
|
14
|
+
var countDownTime = <%= interval + 1 %>;
|
15
|
+
var counter;
|
16
|
+
|
17
|
+
function countDown() {
|
18
|
+
countDownTime--;
|
19
|
+
$('#refresher_seconds').html(countDownTime);
|
20
|
+
//refresh
|
21
|
+
if (countDownTime <= 0) {
|
22
|
+
countDownTime = <%= interval %>
|
23
|
+
clearTimeout(counter);
|
24
|
+
window.location.reload();
|
25
|
+
} else {
|
26
|
+
counter = setTimeout("countDown()", 1000);
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
function stopCountDown(url) {
|
31
|
+
clearTimeout(counter);
|
32
|
+
window.location.href = url
|
33
|
+
}
|
34
|
+
|
35
|
+
function startCountDown(url) {
|
36
|
+
window.location.href = url
|
37
|
+
}
|
38
|
+
|
39
|
+
<% if should_be_refreshed %>
|
40
|
+
$(function() { countDown(); })
|
41
|
+
<% end %>
|
42
|
+
//]]>
|
43
|
+
</script>
|
44
|
+
|
45
|
+
<% opts = {:class => 'icon icon-reload', :id => 'refresher'} %>
|
46
|
+
<% if should_be_refreshed %>
|
47
|
+
<%= link_to_function l(:refresh_in, content_tag(:span, interval, :id => 'refresher_seconds')).html_safe,
|
48
|
+
"startCountDown('#{url_for(params.merge(:norefresh => 1).except(:refresh))}')", opts %>
|
49
|
+
<% else %>
|
50
|
+
<%= link_to_function l(:automatic_refresh), "stopCountDown('#{url_for(params.merge(:refresh => interval).except(:norefresh))}')", opts %>
|
51
|
+
<% end %>
|
data/init.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Little hack for using the 'deface' gem in redmine:
|
2
|
+
# - redmine plugins are not railties nor engines, so deface overrides in app/overrides/ are not detected automatically
|
3
|
+
# - deface doesn't support direct loading anymore ; it unloads everything at boot so that reload in dev works
|
4
|
+
# - hack consists in adding "app/overrides" path of the plugin in Redmine's main #paths
|
5
|
+
# TODO: see if it's complicated to turn a plugin into a Railtie or find something a bit cleaner
|
6
|
+
Rails.application.paths["app/overrides"] ||= []
|
7
|
+
Rails.application.paths["app/overrides"] << File.expand_path("../app/overrides", __FILE__)
|
8
|
+
|
9
|
+
Redmine::Plugin.register :redmine_refresh do
|
10
|
+
name 'Redmine Refresh plugin'
|
11
|
+
description 'This is a plugin for Redmine'
|
12
|
+
url 'https://github.com/jbbarth/redmine_refresh'
|
13
|
+
author 'Jean-Baptiste BARTH'
|
14
|
+
author_url 'mailto:jeanbaptiste.barth@gmail.com'
|
15
|
+
#TODO: make it depend on redmine_refresh/version
|
16
|
+
version '0.3.0'
|
17
|
+
requires_redmine :version_or_higher => '2.1.0'
|
18
|
+
#settings :default => { }, :partial => 'settings/sudo_settings'
|
19
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require "redmine_refresh/version"
|
2
|
+
|
3
|
+
module RedmineRefresh
|
4
|
+
# Run the classic redmine plugin initializer after rails boot
|
5
|
+
class Plugin < ::Rails::Engine
|
6
|
+
config.after_initialize do
|
7
|
+
require File.expand_path("../../init", __FILE__)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
extend self #... so we can call RedmineRefresh.<method> directly
|
12
|
+
|
13
|
+
DEFAULT_INTERVAL = 120
|
14
|
+
|
15
|
+
def refresh_interval_for(user, refresh_param = nil)
|
16
|
+
interval = DEFAULT_INTERVAL
|
17
|
+
user_interval = user.pref[:refresh_interval].to_i
|
18
|
+
#if parameter is provided
|
19
|
+
if refresh_param.to_i >= 10
|
20
|
+
interval = refresh_param.to_i
|
21
|
+
#save it if modified
|
22
|
+
if interval != user_interval
|
23
|
+
user.pref[:refresh_interval] = interval
|
24
|
+
user.pref.save
|
25
|
+
end
|
26
|
+
#if not, get the user's
|
27
|
+
elsif user_interval >= 10
|
28
|
+
interval = user_interval
|
29
|
+
end
|
30
|
+
interval
|
31
|
+
end
|
32
|
+
|
33
|
+
#if should_be_refreshed != RedmineRefresh.refresh_status_for_controller(controller.controller_name)
|
34
|
+
def refresh_status_for_controller(user, controller = nil)
|
35
|
+
controller = controller.to_s
|
36
|
+
controller.present? && user.pref[:refresh_status].is_a?(Hash) && user.pref[:refresh_status][controller]
|
37
|
+
end
|
38
|
+
|
39
|
+
def save_refresh_status_for_controller(user, controller, current_refresh_status)
|
40
|
+
user_refresh_status = refresh_status_for_controller(user, controller)
|
41
|
+
controller = controller.to_s
|
42
|
+
if controller.present? && user_refresh_status != current_refresh_status
|
43
|
+
user.pref[:refresh_status] ||= Hash.new
|
44
|
+
user.pref[:refresh_status][controller] = current_refresh_status
|
45
|
+
user.pref.save
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'redmine_refresh/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "redmine_refresh"
|
8
|
+
spec.version = RedmineRefresh::VERSION
|
9
|
+
spec.authors = ["jbbarth"]
|
10
|
+
spec.email = ["jeanbaptiste.barth@gmail.com"]
|
11
|
+
spec.description = %q{Adds an automatic refresh option to Redmine's issues list}
|
12
|
+
spec.summary = %q{Adds an automatic refresh option to Redmine's issues list}
|
13
|
+
spec.homepage = "https://github.com/jbbarth/redmine_refresh"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "deface"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class RedmineRefreshTest < ActiveSupport::TestCase
|
4
|
+
fixtures :users, :user_preferences
|
5
|
+
|
6
|
+
setup do
|
7
|
+
@user = User.find(1) #permissions don't matter
|
8
|
+
end
|
9
|
+
|
10
|
+
context "#refresh_interval_for" do
|
11
|
+
should "return 120 by default " do
|
12
|
+
assert_equal 120, RedmineRefresh.refresh_interval_for(@user)
|
13
|
+
end
|
14
|
+
|
15
|
+
should "return second params if >= 10" do
|
16
|
+
assert_equal 10, RedmineRefresh.refresh_interval_for(@user, "10")
|
17
|
+
assert_equal 12, RedmineRefresh.refresh_interval_for(@user, 12)
|
18
|
+
end
|
19
|
+
|
20
|
+
should "not return second param if not >= 10" do
|
21
|
+
assert_equal 120, RedmineRefresh.refresh_interval_for(@user, 9)
|
22
|
+
assert_equal 120, RedmineRefresh.refresh_interval_for(@user, "abcd")
|
23
|
+
assert_equal 120, RedmineRefresh.refresh_interval_for(@user, -20)
|
24
|
+
end
|
25
|
+
|
26
|
+
should "save parameter in user preferences if modified and valid" do
|
27
|
+
assert_equal nil, @user.reload.pref[:refresh_interval]
|
28
|
+
RedmineRefresh.refresh_interval_for(@user, "10")
|
29
|
+
assert_equal 10, @user.reload.pref[:refresh_interval]
|
30
|
+
RedmineRefresh.refresh_interval_for(@user, "30")
|
31
|
+
assert_equal 30, @user.reload.pref[:refresh_interval]
|
32
|
+
RedmineRefresh.refresh_interval_for(@user, "abc")
|
33
|
+
assert_equal 30, @user.reload.pref[:refresh_interval]
|
34
|
+
end
|
35
|
+
|
36
|
+
should "not save user preferences if parameter is untouched" do
|
37
|
+
RedmineRefresh.refresh_interval_for(@user, "10")
|
38
|
+
assert_equal 10, @user.reload.pref[:refresh_interval]
|
39
|
+
@user.pref.stubs(:save).raises(Exception, "This shouldn't be called !")
|
40
|
+
assert_nothing_raised do
|
41
|
+
RedmineRefresh.refresh_interval_for(@user, "10")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
should "get the user preference if no valid parameter provided" do
|
46
|
+
@user.pref[:refresh_interval] = 30
|
47
|
+
@user.pref.save
|
48
|
+
assert_equal 30, RedmineRefresh.refresh_interval_for(@user)
|
49
|
+
end
|
50
|
+
|
51
|
+
should "not get the user preference if a valid parameter is provided" do
|
52
|
+
@user.pref[:refresh_interval] = 30
|
53
|
+
@user.pref.save
|
54
|
+
assert_equal 30, @user.reload.pref[:refresh_interval]
|
55
|
+
assert_equal 50, RedmineRefresh.refresh_interval_for(@user, "50")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "#refresh_status_for_controller" do
|
60
|
+
should "return false if no controller provided" do
|
61
|
+
assert !RedmineRefresh.refresh_status_for_controller(@user)
|
62
|
+
end
|
63
|
+
|
64
|
+
should "return false by default" do
|
65
|
+
assert !RedmineRefresh.refresh_status_for_controller(@user, "my")
|
66
|
+
end
|
67
|
+
|
68
|
+
should "proxy to user preferences for refresh_status" do
|
69
|
+
@user.pref[:refresh_status] = {"my" => true}
|
70
|
+
@user.pref.save
|
71
|
+
@user.reload
|
72
|
+
assert RedmineRefresh.refresh_status_for_controller(@user, "my")
|
73
|
+
assert !RedmineRefresh.refresh_status_for_controller(@user, "other")
|
74
|
+
end
|
75
|
+
|
76
|
+
should "be falsy for not-logged user" do
|
77
|
+
@user = User.anonymous
|
78
|
+
@user.pref[:refresh_status] = {"my" => true}
|
79
|
+
assert !RedmineRefresh.refresh_status_for_controller(@user, "my")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "#save_refresh_status_for_controller" do
|
84
|
+
setup do
|
85
|
+
@user.pref[:refresh_status] = {"my" => true}
|
86
|
+
@user.pref.save
|
87
|
+
@user.reload
|
88
|
+
end
|
89
|
+
|
90
|
+
should "save refresh_status for this controller if needed" do
|
91
|
+
RedmineRefresh.save_refresh_status_for_controller(@user, "my", false)
|
92
|
+
@user.reload
|
93
|
+
assert !RedmineRefresh.refresh_status_for_controller(@user, "my")
|
94
|
+
end
|
95
|
+
|
96
|
+
should "not save refresh_status for this controller if not changed" do
|
97
|
+
@user.pref.stubs(:save).raises(Exception, "This shouldn't be called !")
|
98
|
+
assert_nothing_raised do
|
99
|
+
RedmineRefresh.save_refresh_status_for_controller(@user, "my", true)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: redmine_refresh
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- jbbarth
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-05-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: deface
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.3'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.3'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: Adds an automatic refresh option to Redmine's issues list
|
63
|
+
email:
|
64
|
+
- jeanbaptiste.barth@gmail.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- .gitignore
|
70
|
+
- Gemfile
|
71
|
+
- LICENSE.txt
|
72
|
+
- README.md
|
73
|
+
- Rakefile
|
74
|
+
- app/overrides/issues/index.rb
|
75
|
+
- app/overrides/my/page.rb
|
76
|
+
- app/views/redmine_refresh/_refresher.html.erb
|
77
|
+
- config/locales/en.yml
|
78
|
+
- config/locales/fr.yml
|
79
|
+
- config/locales/zh.yml
|
80
|
+
- init.rb
|
81
|
+
- lib/redmine_refresh.rb
|
82
|
+
- lib/redmine_refresh/version.rb
|
83
|
+
- redmine_refresh.gemspec
|
84
|
+
- test/test_helper.rb
|
85
|
+
- test/unit/redmine_refresh_test.rb
|
86
|
+
homepage: https://github.com/jbbarth/redmine_refresh
|
87
|
+
licenses:
|
88
|
+
- MIT
|
89
|
+
post_install_message:
|
90
|
+
rdoc_options: []
|
91
|
+
require_paths:
|
92
|
+
- lib
|
93
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
segments:
|
100
|
+
- 0
|
101
|
+
hash: 3202885522513128351
|
102
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
|
+
none: false
|
104
|
+
requirements:
|
105
|
+
- - ! '>='
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
segments:
|
109
|
+
- 0
|
110
|
+
hash: 3202885522513128351
|
111
|
+
requirements: []
|
112
|
+
rubyforge_project:
|
113
|
+
rubygems_version: 1.8.24
|
114
|
+
signing_key:
|
115
|
+
specification_version: 3
|
116
|
+
summary: Adds an automatic refresh option to Redmine's issues list
|
117
|
+
test_files:
|
118
|
+
- test/test_helper.rb
|
119
|
+
- test/unit/redmine_refresh_test.rb
|