radiant-dashboard-extension 1.2.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 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