jakewendt-pages 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,39 @@
1
+ var initial_page_order;
2
+ jQuery(function(){
3
+ jQuery('#pages').sortable({
4
+ axis:'y',
5
+ dropOnEmpty:false,
6
+ handle:'img.handle',
7
+ update:function(event,ui){compare_page_order()},
8
+ items:'tr.page.row'
9
+ });
10
+
11
+ jQuery('#save_order').disable();
12
+
13
+ initial_page_order = page_order();
14
+
15
+ jQuery('form#order_pages').submit(function(){
16
+ if( initial_page_order == page_order() ) {
17
+ /*
18
+ Shouldn't get here as button should
19
+ be disabled if not different!
20
+ */
21
+ alert("Page order hasn't changed. Nothing to save.");
22
+ return false
23
+ }
24
+ })
25
+
26
+ });
27
+
28
+ function page_order() {
29
+ return jQuery('#pages').sortable('serialize',{key:'pages[]'});
30
+ }
31
+
32
+ function compare_page_order(){
33
+ if( initial_page_order == page_order() ) {
34
+ jQuery('#save_order').disable();
35
+ } else {
36
+ jQuery('#save_order').highlight(4000);
37
+ jQuery('#save_order').enable();
38
+ }
39
+ }
@@ -0,0 +1,26 @@
1
+ class CreatePages < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :pages do |t|
4
+ t.integer :position
5
+ t.integer :parent_id
6
+ t.boolean :hide_menu, :default => false
7
+ t.string :path
8
+ t.string :title_en
9
+ t.string :title_es
10
+ t.string :menu_en
11
+ t.string :menu_es
12
+ t.text :body_en
13
+ t.text :body_es
14
+ t.timestamps
15
+ end
16
+ add_index :pages, :path, :unique => true
17
+ add_index :pages, :parent_id
18
+ # acts_as_list doesn't like the uniqueness
19
+ # when it reorders, positions are temporarily not unique
20
+ # add_index :pages, :position, :unique => true, :name => 'by_position'
21
+ end
22
+
23
+ def self.down
24
+ drop_table :pages
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ input[type='text'],
2
+ textarea {
3
+ width: 99%;
4
+ }
5
+
6
+ div.parent {
7
+ float:left;
8
+ }
9
+ div.locale {
10
+ float:left;
11
+ }
12
+ div.hide_menu {
13
+ float:right;
14
+ }
15
+ div.fields {
16
+ clear:left;
17
+ }
@@ -0,0 +1,22 @@
1
+ .page img.handle {
2
+ }
3
+ .page .position {
4
+ font-weight:bold;
5
+ text-align:center;
6
+ }
7
+ .page .path {
8
+ width: 140px;
9
+ }
10
+ .page .menu {
11
+ width: 140px;
12
+ }
13
+ .page .title {
14
+ width: 140px;
15
+ }
16
+ .page .manage {
17
+ text-align:right;
18
+ }
19
+
20
+ .page.row.ui-sortable-helper {
21
+ border: 1px dashed #E7C254;
22
+ }
@@ -0,0 +1,185 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+
3
+ class Pages::PageTest < ActiveSupport::TestCase
4
+
5
+ assert_should_require(:path,:menu_en,:title_en,:body_en,
6
+ :model => 'Page')
7
+ assert_should_require_unique(:path,:menu_en,
8
+ :model => 'Page')
9
+
10
+ test "should create page" do
11
+ assert_difference 'Page.count' do
12
+ page = create_page
13
+ assert !page.new_record?,
14
+ "#{page.errors.full_messages.to_sentence}"
15
+ end
16
+ end
17
+
18
+ test "should require path begin with slash" do
19
+ assert_no_difference 'Page.count' do
20
+ page = create_page(:path => 'Hey')
21
+ assert page.errors.on(:path)
22
+ end
23
+ end
24
+
25
+ test "should require 1 char path" do
26
+ assert_no_difference 'Page.count' do
27
+ page = create_page(:path => '')
28
+ assert page.errors.on(:path)
29
+ end
30
+ end
31
+
32
+ test "should require 4 char menu_en" do
33
+ assert_no_difference 'Page.count' do
34
+ page = create_page(:menu_en => 'Hey')
35
+ assert page.errors.on(:menu_en)
36
+ end
37
+ end
38
+
39
+ test "should require 4 char title_en" do
40
+ assert_no_difference 'Page.count' do
41
+ page = create_page(:title_en => 'Hey')
42
+ assert page.errors.on(:title_en)
43
+ end
44
+ end
45
+
46
+ test "should require 4 char body_en" do
47
+ assert_no_difference 'Page.count' do
48
+ page = create_page(:body_en => 'Hey')
49
+ assert page.errors.on(:body_en)
50
+ end
51
+ end
52
+
53
+ test "should filter out multiple continguous slashes" do
54
+ page = create_page(:path => "///a//b///c" )
55
+ assert_equal "/a/b/c", page.path
56
+ end
57
+
58
+ test "should downcase path" do
59
+ page = create_page(:path => "/A/B/C")
60
+ assert_equal "/a/b/c", page.path
61
+ end
62
+
63
+ test "can have a parent" do
64
+ parent = create_page
65
+ page = create_page( :parent_id => parent.id )
66
+ assert_equal page.reload.parent, parent
67
+ end
68
+
69
+ test "should return self as root with no parent" do
70
+ page = create_page
71
+ assert_equal page, page.root
72
+ end
73
+
74
+ test "should return parent as root with parent" do
75
+ parent = create_page
76
+ page = create_page( :parent_id => parent.id )
77
+ assert_equal parent, page.reload.root
78
+ end
79
+
80
+ test "should nullify parent_id of children when parent destroyed" do
81
+ parent = create_page
82
+ child = create_page( :parent_id => parent.id )
83
+ assert_equal child.reload.parent_id, parent.id
84
+ parent.destroy
85
+ assert_nil child.reload.parent_id
86
+ end
87
+
88
+ test "should return false if page is not home" do
89
+ page = create_page
90
+ assert !page.is_home?
91
+ end
92
+
93
+ test "should return true if page is home" do
94
+ page = create_page(:path => '/')
95
+ assert page.is_home?
96
+ end
97
+
98
+ test "should create page with hide_menu true" do
99
+ assert_difference('Page.count',1){
100
+ assert_difference('Page.roots.count',0){
101
+ page = create_page(:hide_menu => true)
102
+ # assert_equal 1, Page.count
103
+ # assert_equal 0, Page.roots.count
104
+ assert_not_nil Page.find(page)
105
+ assert_not_nil Page.find(page.id)
106
+ assert_not_nil Page.find_by_path(page.path)
107
+ } }
108
+ end
109
+
110
+ test "should find page by path" do
111
+ p = create_page
112
+ page = Page.by_path(p.path)
113
+ assert_equal p, page
114
+ end
115
+
116
+ test "should return english menu without locale" do
117
+ p = create_page
118
+ assert_equal p.menu, p.menu_en
119
+ end
120
+
121
+ test "should return english title without locale" do
122
+ p = create_page
123
+ assert_equal p.title, p.title_en
124
+ end
125
+
126
+ test "should return english body without locale" do
127
+ p = create_page
128
+ assert_equal p.body, p.body_en
129
+ end
130
+
131
+ test "should return english menu with locale" do
132
+ p = create_page
133
+ assert_equal p.menu('en'), p.menu_en
134
+ end
135
+
136
+ test "should return english title with locale" do
137
+ p = create_page
138
+ assert_equal p.title('en'), p.title_en
139
+ end
140
+
141
+ test "should return english body with locale" do
142
+ p = create_page
143
+ assert_equal p.body('en'), p.body_en
144
+ end
145
+
146
+ test "should return spanish menu with locale" do
147
+ p = create_page(:menu_es => 'spanish menu')
148
+ assert_equal p.menu('es'), p.menu_es
149
+ end
150
+
151
+ test "should return spanish title with locale" do
152
+ p = create_page(:title_es => 'spanish title')
153
+ assert_equal p.title('es'), p.title_es
154
+ end
155
+
156
+ test "should return spanish body with locale" do
157
+ p = create_page(:body_es => 'spanish body')
158
+ assert_equal p.body('es'), p.body_es
159
+ end
160
+
161
+ test "should return english menu with missing spanish locale" do
162
+ p = create_page(:menu_es => '')
163
+ assert_equal p.menu('es'), p.menu_en
164
+ end
165
+
166
+ test "should return english title with missing spanish locale" do
167
+ p = create_page(:title_es => '')
168
+ assert_equal p.title('es'), p.title_en
169
+ end
170
+
171
+ test "should return english body with missing spanish locale" do
172
+ p = create_page(:body_es => '')
173
+ assert_equal p.body('es'), p.body_en
174
+ end
175
+
176
+ protected
177
+
178
+ def create_page(options = {})
179
+ record = Factory.build(:page,options)
180
+ record.save
181
+ record
182
+ end
183
+ alias_method :create_object, :create_page
184
+
185
+ end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+
3
+ class Pages::RedClothExtensionTest < ActiveSupport::TestCase
4
+
5
+ teardown :destroy_relative_url_root
6
+
7
+ test "should NOT add relative url root to link when blank" do
8
+ html = textilize('"Link Text":/link/path')
9
+ #=> "<p><a href=\"/link/path\">Link Text</a></p>"
10
+ assert_match(/a href="\/link\/path"/,html)
11
+ end
12
+
13
+ test "should add relative url root to link when not blank" do
14
+ ActionController::Base.relative_url_root = "/prefix"
15
+ html = textilize('"Link Text":/link/path')
16
+ #=> "<p><a href=\"/prefix/link/path\">Link Text</a></p>"
17
+ assert_match(/a href="\/prefix\/link\/path"/,html)
18
+ end
19
+
20
+ test "should NOT add relative url root to image href when blank" do
21
+ html = textilize('!/path/to/image.jpg!:/link/path')
22
+ #=> "<p><a href=\"/link/path\">
23
+ # <img src=\"/path/to/image.jpg\" alt=\"\" /></a></p>"
24
+ assert_match(/a href="\/link\/path"/,html)
25
+ end
26
+
27
+ test "should add relative url root to image href when not blank" do
28
+ ActionController::Base.relative_url_root = "/prefix"
29
+ html = textilize('!/path/to/image.jpg!:/link/path')
30
+ #=> "<p><a href=\"/link/path\">
31
+ # <img src=\"/path/to/image.jpg\" alt=\"\" /></a></p>"
32
+ assert_match(/a href="\/prefix\/link\/path"/,html)
33
+ end
34
+
35
+ test "should NOT add relative url root to image src when blank" do
36
+ html = textilize('!/path/to/image.jpg!:/link/path')
37
+ #=> "<p><a href=\"/link/path\">
38
+ # <img src=\"/path/to/image.jpg\" alt=\"\" /></a></p>"
39
+ assert_match(/img src="\/path\/to\/image\.jpg"/,html)
40
+ end
41
+
42
+ test "should add relative url root to image src when not blank" do
43
+ ActionController::Base.relative_url_root = "/prefix"
44
+ html = textilize('!/path/to/image.jpg!:/link/path')
45
+ #=> "<p><a href=\"/link/path\">
46
+ # <img src=\"/path/to/image.jpg\" alt=\"\" /></a></p>"
47
+ assert_match(/img src="\/prefix\/path\/to\/image\.jpg"/,html)
48
+ end
49
+
50
+
51
+ # Add tests for when
52
+ # relative_url_root is nil
53
+ # paths are absolute
54
+ # paths are relative to current location ('../......')
55
+ # there is no path, just the file
56
+
57
+
58
+ protected
59
+
60
+ def destroy_relative_url_root
61
+ ActionController::Base.relative_url_root = nil #''
62
+ end
63
+
64
+ end
data/lib/pages.rb ADDED
@@ -0,0 +1,42 @@
1
+ require 'ruby_extension'
2
+ require 'rails_helpers'
3
+ require 'authorized'
4
+ require 'gravatar'
5
+ require 'calnet_authenticated'
6
+ require 'acts_as_list'
7
+ module Pages
8
+ # predefine namespace
9
+ end
10
+
11
+ # This doesn't seem necessary
12
+ %w{models controllers}.each do |dir|
13
+ path = File.expand_path(File.join(File.dirname(__FILE__), '../app', dir))
14
+ ActiveSupport::Dependencies.autoload_paths << path
15
+ ActiveSupport::Dependencies.autoload_once_paths << path
16
+ end
17
+
18
+ HTML::WhiteListSanitizer.allowed_attributes.merge(%w(
19
+ id class style
20
+ ))
21
+
22
+ require 'pages/redcloth/formatters/html'
23
+
24
+ if !defined?(RAILS_ENV) || RAILS_ENV == 'test'
25
+ require 'active_support'
26
+ require 'active_support/test_case'
27
+ require 'factory_girl'
28
+ require 'assert_this_and_that'
29
+ require 'pages/factories'
30
+ require 'pages/pending'
31
+ end
32
+
33
+ ActionController::Routing::Routes.add_configuration_file(
34
+ File.expand_path(
35
+ File.join(
36
+ File.dirname(__FILE__), '../config/routes.rb')))
37
+
38
+ ActionController::Base.view_paths <<
39
+ File.expand_path(
40
+ File.join(
41
+ File.dirname(__FILE__), '../app/views'))
42
+
@@ -0,0 +1,6 @@
1
+ Factory.define :page do |f|
2
+ f.sequence(:path) { |n| "/path#{n}" }
3
+ f.sequence(:menu_en) { |n| "Menu #{n}" }
4
+ f.sequence(:title_en){ |n| "Title #{n}" }
5
+ f.body_en "Page Body"
6
+ end
@@ -0,0 +1,72 @@
1
+ # Some code from jeremymcanally's "pending"
2
+ # http://github.com/jeremymcanally/pending/tree/master
3
+
4
+ module ActiveSupport
5
+ module Testing
6
+ module Pending
7
+
8
+ unless defined?(Spec)
9
+
10
+ @@pending_cases = []
11
+ @@at_exit = false
12
+
13
+ def pending(description = "", &block)
14
+ if description.is_a?(Symbol)
15
+ is_pending = $tags[description]
16
+ return block.call unless is_pending
17
+ end
18
+
19
+ if block_given?
20
+ failed = false
21
+
22
+ begin
23
+ block.call
24
+ rescue Exception
25
+ failed = true
26
+ end
27
+
28
+ flunk("<#{description}> did not fail.") unless failed
29
+ end
30
+
31
+ caller[0] =~ (/(.*):(.*):in `(.*)'/)
32
+ #puts caller.inspect
33
+
34
+ # looks like we lose the name of the 'method' in 1.9.1
35
+ #"/Users/jakewendt/github_repo/jakewendt/ucb_ccls_homex/test/unit/subject_test.rb:145:in `block in <class:SubjectTest>'",
36
+
37
+ # @@pending_cases << "#{$3} at #{$1}, line #{$2}"
38
+ # Gotta remember these as the next Regex will overwrite them.
39
+ filename = $1
40
+ linenumber = $2
41
+ # ruby 1.8.7
42
+ # Hx/Addresses Controller should NOT create new address with employee login and invalid address:
43
+ # ruby 1.9.1
44
+ #Hx/Addresses Controller block (2 levels) in <class:AddressesControllerTest>:
45
+ testmethod = $3
46
+
47
+ model = self.class.to_s.gsub(/Test$/,'').titleize
48
+ method = testmethod.gsub(/_/,' ').gsub(/^test /,'')
49
+ @@pending_cases << "#{model} #{method}:\n.\t#{filename} line #{linenumber}"
50
+ # @@pending_cases << "#{testmethod} at #{filename}, line #{linenumber}"
51
+ print "P"
52
+
53
+ @@at_exit ||= begin
54
+ at_exit do
55
+ # For some reason, special characters don't always
56
+ # print the way you would expect. Leading white space (tabs)
57
+ # and some carriage returns just weren't happening?
58
+ # Is this at_exit doing some parsing??
59
+ puts "\nPending Cases:"
60
+ @@pending_cases.each do |test_case|
61
+ puts test_case
62
+ end
63
+ puts " \n"
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ end
70
+ end
71
+ end
72
+ ActiveSupport::TestCase.send(:include, ActiveSupport::Testing::Pending)