radiant-dashboard-extension 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ .svn
data/HELP.md ADDED
@@ -0,0 +1,5 @@
1
+ Your Dashboard shows you the latest activity in your system. It is not a place
2
+ to find everything, but a place to see what's been happening recently.
3
+
4
+ Other installed extensions may also provide information in addition to the recent
5
+ activity with your site's pages.
data/HELP_developer.md ADDED
@@ -0,0 +1,83 @@
1
+ You can provide details about recent activity for other areas of your site,
2
+ or for other extensions in your system.
3
+
4
+ Dashboard comes with regions that you may edit just like any other area of
5
+ the Radiant interface.
6
+
7
+ ## For Extension Developers
8
+
9
+ First, be sure to load Dashboard first if you are adding regions to the view.
10
+ Set up your `config/environment.rb` like
11
+
12
+ config.extensions = [:dashboard, :all]
13
+
14
+ Because extensions are loaded alphabetically (the order of their names in `vendor/extensions`)
15
+ An extension such as the [Blog](http://ext.radiantcms.org/extensions/30-blog) extension may
16
+ add a region but due to the alphabetical loading (blog comes before dashboard) the Dashboard
17
+ regions have not yet been initialized, and the Blog regions will not appear. To avoid this,
18
+ setup your extensions to load in the proper order.
19
+
20
+ ### Dashboard Regions
21
+
22
+ If you would like to provide some information about your extension to users
23
+ but the information doesn't present the need for another tab in the main
24
+ navigation of the admin area, you can easily add your information to the
25
+ Dashboard instead.
26
+
27
+ Here's an example used by [Site Watcher](http://ext.radiantcms.org/extensions/41-site-watcher)
28
+
29
+
30
+ def activate
31
+ if admin.respond_to?(:dashboard)
32
+ admin.dashboard.index.add :extensions, 'popular_pages'
33
+ end
34
+ end
35
+
36
+ Site Watcher adds Radius tags to the system to list popular pages on your
37
+ public website. It's not necessary for the extension to list these pages
38
+ for site editors, but it would be convenient. So Dashboard fills the gap of
39
+ providing a small area to display information for Site Watcher when a main
40
+ navigation tab would be unnecessary.
41
+
42
+ For another example of its use, see [Featured Pages](http://ext.radiantcms.org/extensions/42-featured-pages)
43
+
44
+ ### Dashboard Helper
45
+
46
+ Dashboard comes with a simple helper to display the name of the user who
47
+ most recently update a particular object. You may use `updater_name_for(your_object)`
48
+
49
+ By default the `updater_name_for` helper will find the name of the user
50
+ listed as the `updated_by_id`. If that field is empty, it will find the user
51
+ listed as the `created_by_id`. If that field is empty, it will display
52
+ "Radiant System" as the updaters name.
53
+
54
+ If you need a more complex result, or if you would like to provide some
55
+ other default result, you may user the `associations`, `attribute`, and
56
+ `not_found` arguments:
57
+
58
+ updater_name_for(page, :associations => [:reviewed_by_id, :approved_by_id], :attribute => :login, :not_found => 'Nobody')
59
+
60
+ The `updater_name_for` method will loop through the `:associations` in the
61
+ order that they are provided, if the association exists it will ask for the
62
+ provided `:attribute` and if none of these are found it will display the
63
+ `:not_found` argument.
64
+
65
+ The above example assumes a theoretical extension that adds the fields
66
+ `reviewed_by_id` and `approved_by_id` to the pages table. If those fields
67
+ are empty (or NULL) in the database, the result would be "Nobody"
68
+
69
+ If none of these are provided the default values will be `[:updated_by, :created_by]`,
70
+ `:name` and `Radiant System`.
71
+
72
+ ### CSS
73
+
74
+ Each default Dashboard module is defined in HTML as:
75
+
76
+ <div id="..." class="dashboard_module">
77
+ <h2>...Title...</h2>
78
+ <p>...optional message...</p>
79
+ ... your details...
80
+ </div>
81
+
82
+ If you would like to keep your modules up to date with the default CSS, be sure
83
+ to use this structure and to include the class `dashboard_module`.
data/README ADDED
@@ -0,0 +1,6 @@
1
+ = Dashboard
2
+
3
+ Dashboard provides a way to see recent activity in Radiant, and allows extension
4
+ developers to add to the interface with Radiant regions.
5
+
6
+ Built by Saturn Flyer http://www.saturnflyer.com
data/Rakefile ADDED
@@ -0,0 +1,136 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gem|
4
+ gem.name = "radiant-dashboard-extension"
5
+ gem.summary = %Q{Dashboard Extension for Radiant CMS}
6
+ gem.description = %Q{Describe your extension here}
7
+ gem.email = "jim@saturnflyer.com"
8
+ gem.homepage = "http://github.com/saturnflyer/radiant-dashboard-extension"
9
+ gem.authors = ["Jim Gay"]
10
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
11
+ end
12
+ rescue LoadError
13
+ puts "Jeweler (or a dependency) not available. This is only required if you plan to package dashboard as a gem."
14
+ end
15
+
16
+ # In rails 1.2, plugins aren't available in the path until they're loaded.
17
+ # Check to see if the rspec plugin is installed first and require
18
+ # it if it is. If not, use the gem version.
19
+
20
+ # Determine where the RSpec plugin is by loading the boot
21
+ unless defined? RADIANT_ROOT
22
+ ENV["RAILS_ENV"] = "test"
23
+ case
24
+ when ENV["RADIANT_ENV_FILE"]
25
+ require File.dirname(ENV["RADIANT_ENV_FILE"]) + "/boot"
26
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
27
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot"
28
+ else
29
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot"
30
+ end
31
+ end
32
+
33
+ require 'rake'
34
+ require 'rake/rdoctask'
35
+ require 'rake/testtask'
36
+
37
+ rspec_base = File.expand_path(RADIANT_ROOT + '/vendor/plugins/rspec/lib')
38
+ $LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
39
+ require 'spec/rake/spectask'
40
+ require 'cucumber'
41
+ require 'cucumber/rake/task'
42
+
43
+ # Cleanup the RADIANT_ROOT constant so specs will load the environment
44
+ Object.send(:remove_const, :RADIANT_ROOT)
45
+
46
+ extension_root = File.expand_path(File.dirname(__FILE__))
47
+
48
+ task :default => :spec
49
+ task :stats => "spec:statsetup"
50
+
51
+ desc "Run all specs in spec directory"
52
+ Spec::Rake::SpecTask.new(:spec) do |t|
53
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
54
+ t.spec_files = FileList['spec/**/*_spec.rb']
55
+ end
56
+
57
+ task :features => 'spec:integration'
58
+
59
+ namespace :spec do
60
+ desc "Run all specs in spec directory with RCov"
61
+ Spec::Rake::SpecTask.new(:rcov) do |t|
62
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
63
+ t.spec_files = FileList['spec/**/*_spec.rb']
64
+ t.rcov = true
65
+ t.rcov_opts = ['--exclude', 'spec', '--rails']
66
+ end
67
+
68
+ desc "Print Specdoc for all specs"
69
+ Spec::Rake::SpecTask.new(:doc) do |t|
70
+ t.spec_opts = ["--format", "specdoc", "--dry-run"]
71
+ t.spec_files = FileList['spec/**/*_spec.rb']
72
+ end
73
+
74
+ [:models, :controllers, :views, :helpers].each do |sub|
75
+ desc "Run the specs under spec/#{sub}"
76
+ Spec::Rake::SpecTask.new(sub) do |t|
77
+ t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
78
+ t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
79
+ end
80
+ end
81
+
82
+ desc "Run the Cucumber features"
83
+ Cucumber::Rake::Task.new(:integration) do |t|
84
+ t.fork = true
85
+ t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'pretty')]
86
+ # t.feature_pattern = "#{extension_root}/features/**/*.feature"
87
+ t.profile = "default"
88
+ end
89
+
90
+ # Setup specs for stats
91
+ task :statsetup do
92
+ require 'code_statistics'
93
+ ::STATS_DIRECTORIES << %w(Model\ specs spec/models)
94
+ ::STATS_DIRECTORIES << %w(View\ specs spec/views)
95
+ ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers)
96
+ ::STATS_DIRECTORIES << %w(Helper\ specs spec/views)
97
+ ::CodeStatistics::TEST_TYPES << "Model specs"
98
+ ::CodeStatistics::TEST_TYPES << "View specs"
99
+ ::CodeStatistics::TEST_TYPES << "Controller specs"
100
+ ::CodeStatistics::TEST_TYPES << "Helper specs"
101
+ ::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/}
102
+ end
103
+
104
+ namespace :db do
105
+ namespace :fixtures do
106
+ desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y"
107
+ task :load => :environment do
108
+ require 'active_record/fixtures'
109
+ ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
110
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
111
+ Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*'))
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ desc 'Generate documentation for the dashboard extension.'
119
+ Rake::RDocTask.new(:rdoc) do |rdoc|
120
+ rdoc.rdoc_dir = 'rdoc'
121
+ rdoc.title = 'DashboardExtension'
122
+ rdoc.options << '--line-numbers' << '--inline-source'
123
+ rdoc.rdoc_files.include('README')
124
+ rdoc.rdoc_files.include('lib/**/*.rb')
125
+ end
126
+
127
+ # For extensions that are in transition
128
+ desc 'Test the dashboard extension.'
129
+ Rake::TestTask.new(:test) do |t|
130
+ t.libs << 'lib'
131
+ t.pattern = 'test/**/*_test.rb'
132
+ t.verbose = true
133
+ end
134
+
135
+ # Load any custom rakefiles for extension
136
+ Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.2.0
@@ -0,0 +1,14 @@
1
+ class Admin::DashboardController < ApplicationController
2
+ def index
3
+ @template_name = 'index'
4
+ @current_user_published_pages = current_user.pages.published.recently_updated.find(:all, :limit => 10)
5
+ @current_user_draft_pages = current_user.pages.drafts.by_updated.find(:all, :limit => 10)
6
+
7
+ @updated_pages = Page.recently_updated.find(:all, :limit => 10)
8
+ @draft_pages = Page.drafts.by_updated.find(:all, :limit => 10)
9
+ @reviewed_pages = Page.reviewed.by_updated.find(:all, :limit => 10)
10
+
11
+ @updated_snippets = Snippet.recently_updated.find(:all, :limit => 10, :order => 'updated_at DESC') # default_order override
12
+ @updated_layouts = Layout.recently_updated.find(:all, :limit => 10, :order => 'updated_at DESC') # default_order override
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ module Admin::DashboardHelper
2
+ def updater_name_for(obj, options={})
3
+ associations = *options[:associations] || [:updated_by, :created_by]
4
+ attribute = options[:attribute] || :name
5
+ not_found = options[:not_found] || 'Radiant System'
6
+ answer = ""
7
+ for association in associations
8
+ if obj.respond_to?(association.to_sym)
9
+ if obj.send(association.to_sym).nil?
10
+ answer = not_found
11
+ else
12
+ answer = obj.send(association.to_sym).send(attribute.to_sym)
13
+ break
14
+ end
15
+ end
16
+ end
17
+ answer
18
+ end
19
+ end
@@ -0,0 +1,92 @@
1
+ - render_region :main do |main|
2
+ - main.header
3
+ - main.current_user_draft_pages do
4
+ - unless @current_user_draft_pages.blank?
5
+ #current_user_draft_pages.dashboard_module
6
+ %h2 Your Draft Pages
7
+ = render_region :current_user_draft_pages_top
8
+ %ul
9
+ - @current_user_draft_pages.each do |page|
10
+ %li
11
+ %span.title= page.title
12
+ %span.details
13
+ = "Updated by #{updater_name_for(page)} #{time_ago_in_words page.updated_at.to_time} ago."
14
+ = link_to "Edit", edit_admin_page_path(page)
15
+ = render_region :current_user_draft_pages_bottom
16
+ - main.current_user_published_pages do
17
+ - unless @current_user_published_pages.blank?
18
+ #current_user_published_pages_top.dashboard_module
19
+ %h2 Your Recently Published Pages
20
+ = render_region :current_user_published_pages_top
21
+ %ul
22
+ - @current_user_published_pages.each do |page|
23
+ %li
24
+ - if page.virtual? or !page.published?
25
+ %span.virtual.title= page.title
26
+ - else
27
+ %span.title= link_to page.title, page.url
28
+ %span.details
29
+ = "Updated by #{updater_name_for(page)} #{time_ago_in_words page.updated_at.to_time} ago."
30
+ = link_to "Edit", edit_admin_page_path(page)
31
+ = render_region :current_user_published_pages_bottom
32
+ - main.draft_pages do
33
+ - unless @draft_pages.blank?
34
+ #draft_pages.dashboard_module
35
+ %h2 Draft Pages
36
+ %ul
37
+ - @draft_pages.each do |page|
38
+ %li
39
+ %span.title= page.title
40
+ %span.details
41
+ = "Updated by #{updater_name_for(page)} #{time_ago_in_words page.updated_at.to_time} ago."
42
+ = link_to "Edit", edit_admin_page_path(page)
43
+ - main.reviewed_pages do
44
+ - unless @reviewed_pages.blank?
45
+ #reviewed_pages.dashboard_module
46
+ %h2 Recently Reviewed Pages
47
+ %ul
48
+ - @reviewed_pages.each do |page|
49
+ %li
50
+ %span.title= page.title
51
+ %span.details
52
+ = "Updated by #{updater_name_for(page)} #{time_ago_in_words page.updated_at.to_time} ago."
53
+ = link_to "Edit", page_edit_path(page)
54
+ - main.updated_pages do
55
+ - unless @updated_pages.blank?
56
+ #updated_pages.dashboard_module
57
+ %h2 Recently Updated Pages
58
+ %ul
59
+ - @updated_pages.each do |page|
60
+ %li
61
+ - if page.virtual? or !page.published?
62
+ %span.virtual.title= page.title
63
+ - else
64
+ %span.title= link_to page.title, page.url
65
+ %span.details
66
+ = "Updated by #{updater_name_for(page)} #{time_ago_in_words page.updated_at.to_time} ago."
67
+ = link_to "Edit", edit_admin_page_path(page)
68
+ - main.updated_snippets do
69
+ - unless @updated_snippets.blank?
70
+ #updated_snippets.dashboard_module
71
+ %h2 Recently Updated Snippets
72
+ %ul
73
+ - @updated_snippets.each do |snippet|
74
+ %li
75
+ %span.title= snippet.name
76
+ %span.details
77
+ = "Updated by #{updater_name_for(snippet)} #{time_ago_in_words snippet.updated_at.to_time} ago."
78
+ = link_to "Edit", edit_admin_snippet_path(snippet)
79
+ - main.updated_layouts do
80
+ - if (designer? or admin?) and !@updated_layouts.blank?
81
+ #updated_layouts.dashboard_module
82
+ %h2 Recently Updated Layouts
83
+ %ul
84
+ - @updated_layouts.each do |layout|
85
+ %li
86
+ %span.title= layout.name
87
+ %span.details
88
+ = "Updated by #{updater_name_for(layout)} #{time_ago_in_words layout.updated_at.to_time} ago."
89
+ = link_to "Edit", edit_admin_layout_path(layout)
90
+ = render_region :extensions
91
+
92
+ - include_stylesheet 'admin/dashboard'
data/cucumber.yml ADDED
@@ -0,0 +1 @@
1
+ default: --format progress features --tags ~@proposed,~@in_progress
@@ -0,0 +1,57 @@
1
+ # Uncomment this if you reference any of your controllers in activate
2
+ # require_dependency 'application'
3
+
4
+ class DashboardExtension < Radiant::Extension
5
+ version "#{File.read(File.expand_path(File.dirname(__FILE__)) + '/VERSION')}"
6
+ description "Dashboard provides a way to view recent activity in Radiant and gives small extensions a place to grow."
7
+ url "http://saturnflyer.com/"
8
+
9
+ define_routes do |map|
10
+ map.dashboard 'admin/dashboard/:action', :controller => 'admin/dashboard'
11
+ end
12
+
13
+ def activate
14
+ tab "Content" do
15
+ add_item 'Dashboard', "/admin/dashboard", :before => 'Pages'
16
+ end
17
+ Radiant::AdminUI.class_eval do
18
+ attr_accessor :dashboard
19
+ end
20
+ admin.dashboard = load_default_dashboard_regions
21
+ User.class_eval {
22
+ has_many :pages, :foreign_key => :created_by_id unless self.respond_to?(:pages)
23
+ }
24
+ Page.class_eval {
25
+ named_scope :drafts, :conditions => ['status_id = ?',Status['Draft'].id]
26
+ named_scope :reviewed, :conditions => ["status_id = ?", Status['Reviewed'].id ]
27
+ named_scope :published, :conditions => ["status_id = ?", Status['Published'].id ]
28
+ named_scope :recently_updated, lambda{{:conditions => ['updated_at > ?', 1.week.ago ], :order => 'updated_at DESC'}}
29
+ named_scope :by_updated, :order => 'updated_at DESC'
30
+ }
31
+ Snippet.class_eval {
32
+ named_scope :recently_updated, lambda{{:conditions => ['updated_at > ?', 1.week.ago ], :order => 'updated_at DESC, name'}}
33
+ }
34
+ Layout.class_eval {
35
+ named_scope :recently_updated, lambda{{:conditions => ['updated_at > ?', 1.week.ago ], :order => 'updated_at DESC'}}
36
+ }
37
+ end
38
+
39
+ def deactivate
40
+ end
41
+
42
+ private
43
+
44
+ def load_default_dashboard_regions
45
+ returning OpenStruct.new do |dashboard|
46
+ dashboard.index = Radiant::AdminUI::RegionSet.new do |index|
47
+ index.main.concat %w{current_user_draft_pages current_user_published_pages draft_pages reviewed_pages updated_pages updated_snippets updated_layouts}
48
+ index.current_user_draft_pages_top.concat %w{}
49
+ index.current_user_draft_pages_bottom.concat %w{}
50
+ index.current_user_published_pages_top.concat %w{}
51
+ index.current_user_published_pages_bottom.concat %w{}
52
+ index.extensions.concat %w{}
53
+ end
54
+ end
55
+ end
56
+
57
+ end
@@ -0,0 +1,16 @@
1
+ # Sets up the Rails environment for Cucumber
2
+ ENV["RAILS_ENV"] = "test"
3
+ # Extension root
4
+ extension_env = File.expand_path(File.dirname(__FILE__) + '/../../../../../config/environment')
5
+ require extension_env+'.rb'
6
+
7
+ Dir.glob(File.join(RADIANT_ROOT, "features", "**", "*.rb")).each {|step| require step}
8
+
9
+ Cucumber::Rails::World.class_eval do
10
+ include Dataset
11
+ datasets_directory "#{RADIANT_ROOT}/spec/datasets"
12
+ Dataset::Resolver.default = Dataset::DirectoryResolver.new("#{RADIANT_ROOT}/spec/datasets", File.dirname(__FILE__) + '/../../spec/datasets', File.dirname(__FILE__) + '/../datasets')
13
+ self.datasets_database_dump_path = "#{Rails.root}/tmp/dataset"
14
+
15
+ # dataset :dashboardx
16
+ end
@@ -0,0 +1,14 @@
1
+ def path_to(page_name)
2
+ case page_name
3
+
4
+ when /the homepage/i
5
+ root_path
6
+
7
+ when /login/i
8
+ login_path
9
+ # Add more page name => path mappings here
10
+
11
+ else
12
+ raise "Can't find mapping from \"#{page_name}\" to a path."
13
+ end
14
+ end
@@ -0,0 +1,39 @@
1
+ namespace :radiant do
2
+ namespace :extensions do
3
+ namespace :dashboard do
4
+
5
+ desc "Runs the migration and update tasks of the Dashboard extension"
6
+ task :install => [:environment, :migrate, :update]
7
+
8
+ desc "Runs the migration of the Dashboard extension"
9
+ task :migrate => :environment do
10
+ require 'radiant/extension_migrator'
11
+ if ENV["VERSION"]
12
+ DashboardExtension.migrator.migrate(ENV["VERSION"].to_i)
13
+ else
14
+ DashboardExtension.migrator.migrate
15
+ end
16
+ end
17
+
18
+ desc "Copies public assets of the Dashboard to the instance public/ directory."
19
+ task :update => :environment do
20
+ is_svn_or_dir = proc {|path| path =~ /\.svn/ || File.directory?(path) }
21
+ puts "Copying assets from DashboardExtension"
22
+ Dir[DashboardExtension.root + "/public/**/*"].reject(&is_svn_or_dir).each do |file|
23
+ path = file.sub(DashboardExtension.root, '')
24
+ directory = File.dirname(path)
25
+ mkdir_p RAILS_ROOT + directory, :verbose => false
26
+ cp file, RAILS_ROOT + path, :verbose => false
27
+ end
28
+ unless DashboardExtension.root.starts_with? RAILS_ROOT # don't need to copy vendored tasks
29
+ puts "Copying rake tasks from DashboardExtension"
30
+ local_tasks_path = File.join(RAILS_ROOT, %w(lib tasks))
31
+ mkdir_p local_tasks_path, :verbose => false
32
+ Dir[File.join DashboardExtension.root, %w(lib tasks *.rake)].each do |file|
33
+ cp file, local_tasks_path, :verbose => false
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,46 @@
1
+ .dashboard_module {
2
+ background: #efefef;
3
+ float: left;
4
+ margin: 0 20px 20px 0;
5
+ width: 450px;
6
+ }
7
+ .dashboard_module h2 {
8
+ background: #fff;
9
+ border-bottom: 3px solid #666;
10
+ color: #000;
11
+ font-size: 1.2em;
12
+ font-weight: normal;
13
+ margin: 0;
14
+ padding: 5px 5px 0 0;
15
+ }
16
+ .dashboard_module p {
17
+ margin: 5px;
18
+ }
19
+ .dashboard_module ul, .dashboard_module ul li {
20
+ padding: 0;
21
+ margin: 0;
22
+ list-style: none;
23
+ }
24
+ .dashboard_module ul li {
25
+ padding: 5px;
26
+ border-bottom: 1px solid #ddd;
27
+ }
28
+ .dashboard_module li:hover { background: #ffc; }
29
+ .dashboard_module ul li.alternate {
30
+ color: #666;
31
+ }
32
+ .dashboard_module ul li.alternate a {
33
+ color: #555;
34
+ }
35
+ .dashboard_module ul li span {
36
+ display: block;
37
+ }
38
+ .dashboard_module ul li span.virtual {
39
+ font-style: italic;
40
+ }
41
+ .dashboard_module ul li span.details {
42
+ color: #999;
43
+ font-size: 0.8em;
44
+ }
45
+ .dashboard_module a.addition { color: #393; }
46
+ .dashboard_module a.subtraction { color: #933; }
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Admin::DashboardController do
4
+ dataset :users, :dashboard, :snippets
5
+
6
+ before(:each) do
7
+ @date_time = DateTime.strptime("12 October 2008", "%d %B %Y")
8
+ Time.stub!(:now).and_return(@date_time.to_time)
9
+ assigns[:updated_pages] = Page.recently_updated
10
+ login_as :admin
11
+ end
12
+
13
+ describe "/index with GET" do
14
+ before(:each) do
15
+ get 'index'
16
+ end
17
+ it "should collect updated_pages" do
18
+ assigns[:updated_pages].should == Page.recently_updated.find(:all, :limit => 10)
19
+ end
20
+ it "should find pages no earlier than 7 days ago" do
21
+ assigns[:updated_pages].each do |page|
22
+ page.updated_at.should >= @date_time.to_time - 7.days
23
+ end
24
+ end
25
+ it "should limit the collected pages to 10" do
26
+ assigns[:updated_pages].size.should <= 10
27
+ end
28
+ it "should collect updated_snippets" do
29
+ assigns[:updated_snippets].should == Snippet.recently_updated
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ class DashboardDataset < Dataset::Base
2
+ uses :home_page, :users
3
+
4
+ def load
5
+ create_page "Recent" do
6
+ create_page "Taylor", :created_by_id => users(:admin), :created_at => DateTime.parse('1849-03-04 12:12:12'), :updated_at => DateTime.parse('2008-10-07 12:12:23')
7
+ create_page "Polk", :created_by_id => users(:admin), :created_at => DateTime.parse('1845-03-04 12:12:12'), :updated_at => DateTime.parse('2008-10-07 12:12:22')
8
+ create_page "Tyler", :created_by_id => users(:admin), :created_at => DateTime.parse('1841-04-04 12:12:12'), :updated_at => DateTime.parse('2008-10-07 12:12:21')
9
+ create_page "Harrison", :created_by_id => users(:admin), :created_at => DateTime.parse('1841-03-04 12:12:12'), :updated_at => DateTime.parse('2008-10-06 12:12:20')
10
+ create_page "Van Buren", :created_by_id => users(:admin), :created_at => DateTime.parse('1837-03-04 12:12:12'), :updated_at => DateTime.parse('2008-10-06 12:12:19')
11
+ create_page "Jackson", :created_by_id => users(:admin), :created_at => DateTime.parse('1829-03-04 12:12:12'), :updated_at => DateTime.parse('2008-10-06 12:12:18')
12
+ create_page "Quincy Adams", :created_by_id => users(:admin), :created_at => DateTime.parse('1825-03-04 12:12:12'), :updated_at => DateTime.parse('2008-10-05 12:12:17')
13
+ create_page "Monroe", :created_by_id => users(:admin), :created_at => DateTime.parse('1817-03-04 12:12:12'), :updated_at => DateTime.parse('2008-10-05 12:12:16')
14
+ create_page "Madison", :created_by_id => users(:admin), :created_at => DateTime.parse('1809-03-04 12:12:12'), :updated_at => DateTime.parse('2008-10-05 12:12:15')
15
+ create_page "Jefferson", :created_by_id => users(:admin), :created_at => DateTime.parse('1801-03-04 12:12:12'), :updated_at => DateTime.parse('2008-10-04 12:12:14')
16
+ create_page "Adams", :created_by_id => users(:admin), :created_at => DateTime.parse('1797-03-04 12:12:12'), :updated_at => DateTime.parse('2008-10-01 12:12:13')
17
+ create_page "Washington", :created_by_id => users(:admin), :created_at => DateTime.parse('1789-04-30 12:12:12'), :updated_at => DateTime.parse('2008-10-01 12:12:12')
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Admin::DashboardHelper do
4
+
5
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Page do
4
+ before do
5
+ @date_time = DateTime.strptime("12 October 2008", "%d %B %Y")
6
+ Time.stub!(:now).and_return(@date_time.to_time)
7
+ end
8
+ describe "recently_updated" do
9
+ it 'should return pages updated less than one week ago' do
10
+ Page.recently_updated.each do |page|
11
+ page.updated_at.should > @date_time - 1.week
12
+ end
13
+ end
14
+ end
15
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,6 @@
1
+ --colour
2
+ --format
3
+ progress
4
+ --loadby
5
+ mtime
6
+ --reverse
@@ -0,0 +1,36 @@
1
+ unless defined? RADIANT_ROOT
2
+ ENV["RAILS_ENV"] = "test"
3
+ case
4
+ when ENV["RADIANT_ENV_FILE"]
5
+ require ENV["RADIANT_ENV_FILE"]
6
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
7
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../../")}/config/environment"
8
+ else
9
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../")}/config/environment"
10
+ end
11
+ end
12
+ require "#{RADIANT_ROOT}/spec/spec_helper"
13
+
14
+ Dataset::Resolver.default << (File.dirname(__FILE__) + "/datasets")
15
+
16
+ if File.directory?(File.dirname(__FILE__) + "/matchers")
17
+ Dir[File.dirname(__FILE__) + "/matchers/*.rb"].each {|file| require file }
18
+ end
19
+
20
+ Spec::Runner.configure do |config|
21
+ # config.use_transactional_fixtures = true
22
+ # config.use_instantiated_fixtures = false
23
+ # config.fixture_path = RAILS_ROOT + '/spec/fixtures'
24
+
25
+ # You can declare fixtures for each behaviour like this:
26
+ # describe "...." do
27
+ # fixtures :table_a, :table_b
28
+ #
29
+ # Alternatively, if you prefer to declare them only once, you can
30
+ # do so here, like so ...
31
+ #
32
+ # config.global_fixtures = :table_a, :table_b
33
+ #
34
+ # If you declare global fixtures, be aware that they will be declared
35
+ # for all of your examples, even those that don't use them.
36
+ end
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+
3
+ describe "/admin/dashboard/index" do
4
+ dataset :dashboard
5
+ before do
6
+ template.stub!(:include_stylesheet).and_return(true)
7
+ @updated_pages = pages(:recent).children
8
+ assigns[:updated_pages] = @updated_pages
9
+ render '/admin/dashboard/index'
10
+ end
11
+
12
+ it "should have a list of recent pages" do
13
+ response.should have_tag('ul') do
14
+ with_tag('li',/Taylor/)
15
+ with_tag('li',/Polk/)
16
+ with_tag('li',/Tyler/)
17
+ with_tag('li',/Harrison/)
18
+ with_tag('li',/Van Buren/)
19
+ with_tag('li',/Jackson/)
20
+ with_tag('li',/Quincy Adams/)
21
+ with_tag('li',/Monroe/)
22
+ with_tag('li',/Madison/)
23
+ with_tag('li',/Jefferson/)
24
+ end
25
+ end
26
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: radiant-dashboard-extension
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 2
8
+ - 0
9
+ version: 1.2.0
10
+ platform: ruby
11
+ authors:
12
+ - Jim Gay
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-03-05 00:00:00 -05:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: Describe your extension here
22
+ email: jim@saturnflyer.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files:
28
+ - README
29
+ files:
30
+ - .gitignore
31
+ - HELP.md
32
+ - HELP_developer.md
33
+ - README
34
+ - Rakefile
35
+ - VERSION
36
+ - app/controllers/admin/dashboard_controller.rb
37
+ - app/helpers/admin/dashboard_helper.rb
38
+ - app/views/admin/dashboard/index.html.haml
39
+ - cucumber.yml
40
+ - dashboard_extension.rb
41
+ - features/support/env.rb
42
+ - features/support/paths.rb
43
+ - lib/tasks/dashboard_extension_tasks.rake
44
+ - public/stylesheets/admin/dashboard.css
45
+ - spec/controllers/dashboard_controller_spec.rb
46
+ - spec/datasets/dashboard_dataset.rb
47
+ - spec/helpers/dashboard_helper_spec.rb
48
+ - spec/models/page_spec.rb
49
+ - spec/spec.opts
50
+ - spec/spec_helper.rb
51
+ - spec/views/admin/dashboard/index_view_spec.rb
52
+ has_rdoc: true
53
+ homepage: http://github.com/saturnflyer/radiant-dashboard-extension
54
+ licenses: []
55
+
56
+ post_install_message:
57
+ rdoc_options:
58
+ - --charset=UTF-8
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ requirements: []
76
+
77
+ rubyforge_project:
78
+ rubygems_version: 1.3.6
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: Dashboard Extension for Radiant CMS
82
+ test_files:
83
+ - spec/controllers/dashboard_controller_spec.rb
84
+ - spec/datasets/dashboard_dataset.rb
85
+ - spec/helpers/dashboard_helper_spec.rb
86
+ - spec/models/page_spec.rb
87
+ - spec/spec_helper.rb
88
+ - spec/views/admin/dashboard/index_view_spec.rb