thesis 0.1.1 → 0.1.3

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.
Files changed (123) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +103 -68
  3. data/app/assets/javascripts/thesis.js +1 -0
  4. data/app/assets/javascripts/thesis/thesis.coffee +250 -0
  5. data/app/assets/javascripts/thesis/utilities.coffee +13 -0
  6. data/app/assets/stylesheets/thesis.sass +4 -0
  7. data/app/assets/stylesheets/thesis/_mixins/_barber-pole.sass +5 -0
  8. data/app/assets/stylesheets/thesis/_mixins/editor.sass +15 -0
  9. data/app/assets/stylesheets/thesis/_thesis.sass +207 -0
  10. data/app/assets/stylesheets/thesis/base/_base.sass +5 -0
  11. data/app/assets/stylesheets/thesis/base/_colors.sass +6 -0
  12. data/app/assets/stylesheets/thesis/base/_fonts.sass +6 -0
  13. data/app/assets/stylesheets/thesis/base/_forms.scss +165 -0
  14. data/app/assets/stylesheets/thesis/base/_keyframes.sass +205 -0
  15. data/app/assets/stylesheets/thesis/base/bourbon/_bourbon-deprecated-upcoming.scss +8 -0
  16. data/app/assets/stylesheets/thesis/base/bourbon/_bourbon.scss +79 -0
  17. data/app/assets/stylesheets/thesis/base/bourbon/addons/_button.scss +374 -0
  18. data/app/assets/stylesheets/thesis/base/bourbon/addons/_clearfix.scss +23 -0
  19. data/app/assets/stylesheets/thesis/base/bourbon/addons/_directional-values.scss +111 -0
  20. data/app/assets/stylesheets/thesis/base/bourbon/addons/_ellipsis.scss +7 -0
  21. data/app/assets/stylesheets/thesis/base/bourbon/addons/_font-family.scss +5 -0
  22. data/app/assets/stylesheets/thesis/base/bourbon/addons/_hide-text.scss +10 -0
  23. data/app/assets/stylesheets/thesis/base/bourbon/addons/_html5-input-types.scss +86 -0
  24. data/app/assets/stylesheets/thesis/base/bourbon/addons/_position.scss +32 -0
  25. data/app/assets/stylesheets/thesis/base/bourbon/addons/_prefixer.scss +45 -0
  26. data/app/assets/stylesheets/thesis/base/bourbon/addons/_retina-image.scss +31 -0
  27. data/app/assets/stylesheets/thesis/base/bourbon/addons/_size.scss +16 -0
  28. data/app/assets/stylesheets/thesis/base/bourbon/addons/_timing-functions.scss +32 -0
  29. data/app/assets/stylesheets/thesis/base/bourbon/addons/_triangle.scss +83 -0
  30. data/app/assets/stylesheets/thesis/base/bourbon/addons/_word-wrap.scss +8 -0
  31. data/app/assets/stylesheets/thesis/base/bourbon/css3/_animation.scss +52 -0
  32. data/app/assets/stylesheets/thesis/base/bourbon/css3/_appearance.scss +3 -0
  33. data/app/assets/stylesheets/thesis/base/bourbon/css3/_backface-visibility.scss +6 -0
  34. data/app/assets/stylesheets/thesis/base/bourbon/css3/_background-image.scss +42 -0
  35. data/app/assets/stylesheets/thesis/base/bourbon/css3/_background.scss +55 -0
  36. data/app/assets/stylesheets/thesis/base/bourbon/css3/_border-image.scss +59 -0
  37. data/app/assets/stylesheets/thesis/base/bourbon/css3/_border-radius.scss +22 -0
  38. data/app/assets/stylesheets/thesis/base/bourbon/css3/_box-sizing.scss +4 -0
  39. data/app/assets/stylesheets/thesis/base/bourbon/css3/_calc.scss +4 -0
  40. data/app/assets/stylesheets/thesis/base/bourbon/css3/_columns.scss +47 -0
  41. data/app/assets/stylesheets/thesis/base/bourbon/css3/_filter.scss +5 -0
  42. data/app/assets/stylesheets/thesis/base/bourbon/css3/_flex-box.scss +321 -0
  43. data/app/assets/stylesheets/thesis/base/bourbon/css3/_font-face.scss +23 -0
  44. data/app/assets/stylesheets/thesis/base/bourbon/css3/_font-feature-settings.scss +10 -0
  45. data/app/assets/stylesheets/thesis/base/bourbon/css3/_hidpi-media-query.scss +10 -0
  46. data/app/assets/stylesheets/thesis/base/bourbon/css3/_hyphens.scss +4 -0
  47. data/app/assets/stylesheets/thesis/base/bourbon/css3/_image-rendering.scss +14 -0
  48. data/app/assets/stylesheets/thesis/base/bourbon/css3/_keyframes.scss +35 -0
  49. data/app/assets/stylesheets/thesis/base/bourbon/css3/_linear-gradient.scss +38 -0
  50. data/app/assets/stylesheets/thesis/base/bourbon/css3/_perspective.scss +8 -0
  51. data/app/assets/stylesheets/thesis/base/bourbon/css3/_placeholder.scss +8 -0
  52. data/app/assets/stylesheets/thesis/base/bourbon/css3/_radial-gradient.scss +39 -0
  53. data/app/assets/stylesheets/thesis/base/bourbon/css3/_transform.scss +15 -0
  54. data/app/assets/stylesheets/thesis/base/bourbon/css3/_transition.scss +77 -0
  55. data/app/assets/stylesheets/thesis/base/bourbon/css3/_user-select.scss +3 -0
  56. data/app/assets/stylesheets/thesis/base/bourbon/functions/_assign.scss +11 -0
  57. data/app/assets/stylesheets/thesis/base/bourbon/functions/_color-lightness.scss +13 -0
  58. data/app/assets/stylesheets/thesis/base/bourbon/functions/_flex-grid.scss +39 -0
  59. data/app/assets/stylesheets/thesis/base/bourbon/functions/_golden-ratio.scss +3 -0
  60. data/app/assets/stylesheets/thesis/base/bourbon/functions/_grid-width.scss +13 -0
  61. data/app/assets/stylesheets/thesis/base/bourbon/functions/_modular-scale.scss +66 -0
  62. data/app/assets/stylesheets/thesis/base/bourbon/functions/_px-to-em.scss +13 -0
  63. data/app/assets/stylesheets/thesis/base/bourbon/functions/_px-to-rem.scss +15 -0
  64. data/app/assets/stylesheets/thesis/base/bourbon/functions/_strip-units.scss +5 -0
  65. data/app/assets/stylesheets/thesis/base/bourbon/functions/_tint-shade.scss +9 -0
  66. data/app/assets/stylesheets/thesis/base/bourbon/functions/_transition-property-name.scss +22 -0
  67. data/app/assets/stylesheets/thesis/base/bourbon/functions/_unpack.scss +17 -0
  68. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_convert-units.scss +15 -0
  69. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_gradient-positions-parser.scss +13 -0
  70. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_is-num.scss +8 -0
  71. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_linear-angle-parser.scss +25 -0
  72. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_linear-gradient-parser.scss +41 -0
  73. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_linear-positions-parser.scss +61 -0
  74. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_linear-side-corner-parser.scss +31 -0
  75. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_radial-arg-parser.scss +69 -0
  76. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_radial-gradient-parser.scss +50 -0
  77. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_radial-positions-parser.scss +18 -0
  78. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_render-gradients.scss +26 -0
  79. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_shape-size-stripper.scss +10 -0
  80. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_str-to-num.scss +50 -0
  81. data/app/assets/stylesheets/thesis/base/bourbon/settings/_asset-pipeline.scss +1 -0
  82. data/app/assets/stylesheets/thesis/base/bourbon/settings/_prefixer.scss +6 -0
  83. data/app/assets/stylesheets/thesis/base/bourbon/settings/_px-to-em.scss +1 -0
  84. data/lib/generators/thesis/install/install_generator.rb +21 -13
  85. data/lib/thesis/controllers/controller_helpers.rb +11 -5
  86. data/lib/thesis/controllers/thesis_controller.rb +16 -13
  87. data/lib/thesis/models/page.rb +29 -22
  88. data/lib/thesis/models/page_content.rb +44 -29
  89. data/lib/thesis/routing/route_constraint.rb +8 -2
  90. data/lib/thesis/routing/routes.rb +2 -3
  91. data/lib/thesis/version.rb +1 -1
  92. data/spec/factories/pages.rb +1 -1
  93. data/spec/spec_helper.rb +2 -2
  94. data/spec/{lib/thesis → thesis}/controllers/thesis_controller_spec.rb +15 -13
  95. data/spec/{lib/thesis → thesis}/models/page_content_spec.rb +4 -4
  96. data/spec/{lib/thesis → thesis}/models/page_spec.rb +0 -0
  97. data/spec/thesis/routing/thesis_routing_spec.rb +23 -0
  98. metadata +137 -56
  99. data/app/assets/javascripts/thesis/thesis.js.coffee +0 -157
  100. data/app/assets/stylesheets/thesis.css +0 -4
  101. data/app/assets/stylesheets/thesis/font-awesome/font-awesome.scss +0 -534
  102. data/app/assets/stylesheets/thesis/font/FontAwesome.otf +0 -0
  103. data/app/assets/stylesheets/thesis/font/fontawesome-webfont.eot +0 -0
  104. data/app/assets/stylesheets/thesis/font/fontawesome-webfont.svg +0 -284
  105. data/app/assets/stylesheets/thesis/font/fontawesome-webfont.ttf +0 -0
  106. data/app/assets/stylesheets/thesis/font/fontawesome-webfont.woff +0 -0
  107. data/app/assets/stylesheets/thesis/jquery-ui/images/animated-overlay.gif +0 -0
  108. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_flat_30_cccccc_40x100.png +0 -0
  109. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_flat_50_5c5c5c_40x100.png +0 -0
  110. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_glass_20_555555_1x400.png +0 -0
  111. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_glass_40_0078a3_1x400.png +0 -0
  112. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_glass_40_ffc73d_1x400.png +0 -0
  113. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_gloss-wave_25_333333_500x100.png +0 -0
  114. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_highlight-soft_80_eeeeee_1x100.png +0 -0
  115. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_inset-soft_25_000000_1x100.png +0 -0
  116. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_inset-soft_30_f58400_1x100.png +0 -0
  117. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-icons_222222_256x240.png +0 -0
  118. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-icons_4b8e0b_256x240.png +0 -0
  119. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-icons_a83300_256x240.png +0 -0
  120. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-icons_cccccc_256x240.png +0 -0
  121. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-icons_ffffff_256x240.png +0 -0
  122. data/app/assets/stylesheets/thesis/jquery-ui/jquery-ui-1.10.2.custom.css +0 -1175
  123. data/app/assets/stylesheets/thesis/thesis.css.scss +0 -65
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0289d1e4ff233b43abad3501bc115e5b5aeaef5f
4
+ data.tar.gz: 55c4b1fe9a040d4c28a84cc5a6418766cf8ce131
5
+ SHA512:
6
+ metadata.gz: 44bb0d0bb1729d409dbf66f40ca3223f667ebc340bccce20a78f2dd360c99011bb468cf07d5694dd73d00a55bf0f207e79db21505ffb2fd0ddb6431576076eaa
7
+ data.tar.gz: 7c76a9717a04dd81de8cf1d71ac5450027476e4daecdbe569912896c09bde52afd63cc8812d74a4158df8a755750f9f0a5384b5393c926e0cdf70e53efc4e21e
data/README.md CHANGED
@@ -2,20 +2,18 @@
2
2
 
3
3
  ### Thesis is a Rails CMS gem that integrates as seamlessly as possible into your current Rails website.
4
4
 
5
- Most Rails content management systems make you conform to their system from the start,
5
+ Most Rails content management systems make you conform to their system from the start,
6
6
  making it difficult to just "drop in" the gem and make it work with your CMS. Thesis
7
7
  tries to be a drop-in CMS that doesn't hijack your development workflow and stays out
8
8
  of the way.
9
9
 
10
10
  ### Requirements
11
11
 
12
- * Rails 3.2.x (or higher)
12
+ * Rails 4.0.x (or higher)
13
13
  * ActiveRecord on MySQL, PostgresQL, or SQLite3
14
- * Ruby 1.9.3 (or higher)
14
+ * Ruby 2.0.0 (or higher)
15
15
  * jQuery
16
- * jQuery UI
17
-
18
- Thesis *might* work with other versions but no guarantees.
16
+ * File hosting or Amazon S3 (for image upload)
19
17
 
20
18
  ## Getting Started
21
19
 
@@ -23,19 +21,41 @@ Thesis *might* work with other versions but no guarantees.
23
21
 
24
22
  In your Gemfile:
25
23
 
26
- gem 'thesis'
27
-
24
+ gem 'thesis', '~> 0.1'
25
+
28
26
  Then run these from your command line:
29
27
 
30
28
  bundle install
31
29
  rails g thesis:install
32
30
  rake db:migrate
33
-
31
+
34
32
  This will install thesis and add the database tables.
35
33
 
34
+ [API Reference](#API)
35
+
36
+ ## Using the CMS
37
+
38
+ ### Adding a Page
39
+
40
+ TODO
41
+
42
+ ### Editing a Page
43
+
44
+ TODO
45
+
46
+ ### Deleting a Page
47
+
48
+ TODO
49
+
50
+ ### Rearranging Pages
51
+
52
+ TODO
53
+
54
+ ## API
55
+
36
56
  ### Authentication
37
57
 
38
- **Thesis does not force you to use a particular authentication strategy.**
58
+ **Thesis does not force you to use a particular user or authentication strategy.**
39
59
 
40
60
  Instead, it adds a method into your application_controller.rb file that
41
61
  allows you to hook up your own authentication logic.
@@ -43,109 +63,124 @@ allows you to hook up your own authentication logic.
43
63
  * If you return `false` from this method, nothing will show up client-side nor will the page be editable.
44
64
  * If you return `true` from this method, the Thesis editor will appear and the page will be editable.
45
65
 
66
+ #### Thesis authentication examples
67
+
46
68
  ```ruby
47
- # Thesis authentication
48
69
  def page_is_editable?(page)
49
- # Add your own criteria here for editing privileges. Examples:
50
- # current_user.admin? # Basic admin
51
- # can? :update, page # CanCan
52
- true # EVERYONE has access right now.
70
+ logged_in? && current_user.admin? # Devise + admin boolean
71
+ end
72
+
73
+ def page_is_editable?(page)
74
+ can? :update, page # CanCanCan
75
+ end
76
+
77
+ def page_is_editable?(page)
78
+ true # Just let everyone edit everything
79
+ end
80
+
81
+ def page_is_editable?(page)
82
+ if current_user.admin?
83
+ true
84
+ elsif page.parent == Thesis::Page.find_by(name: "Blog")
85
+ true
86
+ else
87
+ false
88
+ end
53
89
  end
54
90
  ```
55
91
 
92
+ ### Models
93
+
94
+ Thesis creates two straightforward ActiveRecord tables: pages and page_contents. Since they're normal ActiveRecord models, you're free to use them in your code however you want.
95
+
96
+ #### Thesis::Page
97
+
98
+ t.integer :parent_id
99
+ t.string :name
100
+ t.string :slug
101
+ t.string :title
102
+ t.string :description
103
+ t.integer :sort_order, default: 0, null: false
104
+ t.string :template, default: "default", null: false
105
+ t.timestamps
106
+
107
+ #### Thesis::PageContent
108
+
109
+ t.integer :page_id, null: false
110
+ t.string :name, null: false
111
+ t.text :content, default: "Edit This Content Area"
112
+ t.string :content_type, default: :html
113
+ t.timestamps
114
+
56
115
  ### Page Templates
57
116
 
58
117
  Thesis's installer will drop a `page_templates` folder into your `app/views` folder.
59
118
  This is where you put different styles of pages for use in the CMS.
60
119
  Thesis will install an ERB, [HAML](http://haml.info), or [Slim](http://slim-lang.com) version, depending on your configuration.
61
120
 
62
- #### Meta information
121
+ ### Meta information
63
122
 
64
- Pages come with a few built-in fields for use in meta tags.
123
+ Pages come with a few built-in fields for use in SEO meta tags.
65
124
 
66
- ```haml
67
- %title= current_page.title
68
- %meta{ content: current_page.description, type: "description" }
125
+ ```slim
126
+ head
127
+ title = current_page.title || "Default Title"
128
+ meta content="#{current_page.description}" type="description"
69
129
  ```
70
130
 
71
- #### Thesis Editor
131
+ ### Thesis Editor
72
132
 
73
133
  Place this right after your opening `body` tag to embed the Thesis editor. It will only show
74
134
  up if your `page_is_editable?` method returns `true`.
75
135
 
76
- ```haml
77
- %body
136
+ ```slim
137
+ body
78
138
  = thesis_editor
79
139
  ```
80
140
 
81
- #### Page title
82
-
83
- ```haml
84
- %h1= current_page.title
85
- ```
86
-
87
- #### Primary Navigation
141
+ ### Primary Navigation
88
142
 
89
143
  Use `root_pages` to get a list of pages at the root level. You can use the
90
144
  page's `name` and `path` accessors in your links.
91
145
 
92
- ```haml
93
- %nav
94
- %ul
95
- %li= link_to "Home", root_path # You can mix and match dynamic and static pages
146
+ ```slim
147
+ nav
148
+ ul
149
+ li = link_to "Home", root_path # You can mix and match dynamic and static pages
96
150
  - root_pages.each do |p|
97
- %li= link_to p.name, p.path
98
- %li= link_to "Static Page", static_page_path
151
+ li = link_to p.name, p.path
152
+ li = link_to "Static Page", static_page_path
99
153
  ```
100
154
 
101
- #### Page content
155
+ ### Page content
102
156
 
103
157
  Content areas are accessible from any page using the `content` method. This method
104
158
  takes two arguments: name and type. Type defaults to `:html`. The only other type
105
159
  is `:text` (for now) which is plain text, no HTML accepted. `:image` will be added soon.
106
160
 
107
- Both content types will wrap their content in a `<div>` or `<span>`.
108
-
109
- Referencing a content area in a page template will create one if it doesn't exist already.
161
+ Referencing a content area in a page template will create one if it doesn't exist already, using the `default:` value.
110
162
 
111
- ```haml
112
- %article
163
+ ```slim
164
+ article
113
165
  = current_page.content("Main Content", :html, default: "<p>This is my default HTML content.<p>")
114
- %aside
115
- = current_page.content("Sidebar Content", :html)
116
- %footer
117
- %p= current_page.content("Footer Content", :text, default: "Copyright Me")
166
+ = current_page.content("Splash Image", :image, default: "/assets/default-image.jpg") # coming soon
167
+ aside
168
+ = current_page.content("Sidebar Content", :html)
169
+ footer
170
+ p = current_page.content("Footer Content", :text, default: "Copyright Me")
118
171
  ```
119
172
 
120
173
  ### Routing
121
-
174
+
122
175
  Thesis will automatically handle routes for pages you create with Thesis. Your
123
176
  routes will take precedence over Thesis-created pages, so if you create a page
124
- with Thesis called "About" and you already have a route for
177
+ with Thesis called "About" and you already have a route for
125
178
  `get "about" => "something#else"` Thesis won't show the page.
126
-
127
- ## Using the CMS
128
-
129
- ### Adding a Page
130
-
131
- TODO
132
-
133
- ### Editing a Page
134
-
135
- TODO
136
-
137
- ### Deleting a Page
138
-
139
- TODO
140
-
141
- ### Rearranging Pages
142
-
143
- TODO
144
179
 
145
180
  ## What Thesis Isn't
146
181
 
147
- You can't have it all. Thesis isn't the same as other -bloated- full-functioned
148
- content management systems out there. This is a list of what it's not now and
182
+ You can't have it all. Thesis isn't the same as other -bloated- full-functioned
183
+ content management systems out there. This is a list of what it's not now and
149
184
  not likely to be in the future.
150
185
 
151
186
  *We reserve the right to change our mind, however, especially with well planned and written
@@ -1,3 +1,4 @@
1
+ //= require ./thesis/utilities
1
2
  //= require ./thesis/rangy-core
2
3
  //= require ./thesis/hallo
3
4
  //= require ./thesis/thesis
@@ -0,0 +1,250 @@
1
+ Thesis =
2
+ setup: ->
3
+ @edit_mode = false
4
+ if this.requirements() && this.page_is_editable()
5
+ this.draw_editor()
6
+ this.set_up_bindings()
7
+
8
+ requirements: ->
9
+ if jQuery.ui
10
+ true
11
+ else
12
+ alert "jQuery UI not included. Thesis will not work properly without it."
13
+ false
14
+
15
+ edit_mode: ->
16
+ @edit_mode
17
+
18
+ thesis: ->
19
+ @thesis = $("#thesis-editor")
20
+
21
+ # ATTRIBUTES
22
+ page_is_editable: ->
23
+ this.thesis().length > 0
24
+
25
+ page_in_edit_mode: ->
26
+ $("body").hasClass("thesis-editing")
27
+
28
+ page_has_unsaved_content: ->
29
+ $("body .thesis-content.isModified").length
30
+
31
+ modal: (blur=false, type="settings")->
32
+ this.close_modal()
33
+ $("body").addClass "thesis-blur" if blur
34
+ $("body").append this["#{type}_modal_markup"]()
35
+ $("#thesis-modal").fadeIn 300
36
+
37
+ $("#thesis-modal").on "click", ".modal-field.cancel", (e)->
38
+ e.preventDefault()
39
+ Thesis.close_modal()
40
+
41
+ $("#thesis-modal").on "submit", "form", (e) ->
42
+ alert "To Do: submit form"
43
+ e.preventDefault() #temp
44
+ return false #temp
45
+
46
+ close_modal: ->
47
+ if $("#thesis-modal").length
48
+ $("body").removeClass "thesis-blur"
49
+ $("#thesis-modal").remove()
50
+
51
+ settings_modal_markup: ->
52
+ is_win = navigator.appVersion.indexOf("Win")!=-1
53
+ """
54
+ <div id="thesis-modal" class="settings #{if is_win then 'windows' else ''}">
55
+ <div class="modal-icon"><i class="fa fa-wrench fa-2x"></i></div>
56
+ <div class="modal-title">Page Settings</div>
57
+ <form action="" method="">
58
+ <label class="modal-field"><span>Page Name</span><input class="page-settings_page-title" name="page-settings_page-title" type="text" /></label>
59
+ <label class="modal-field"><span>Page Slug</span><input class="page-settings_page-slug" name="page-settings_page-slug" type="text" /></label>
60
+ <label class="modal-field"><span>Meta Title</span><input class="page-settings_meta-title" name="page-settings_meta-title" type="text" /></label>
61
+ <label class="modal-field"><span>Meta Description</span><textarea class="page-settings_meta-description" name="page-settings_meta-description"></textarea></label>
62
+ <label class="modal-field cancel"><button class="page-settings_submit" name="page-settings_submit"><i class="fa fa-remove fa-2x"></i> <span>Cancel</span></button></label>
63
+ <label class="modal-field submit"><button class="page-settings_submit" name="page-settings_submit" type="Submit" value=""><i class="fa fa-save fa-2x"></i> <span>Save</span></button></label>
64
+ </form>
65
+ </div>
66
+ """
67
+
68
+ # ACTIONS
69
+ set_up_bindings: ->
70
+ t = this
71
+
72
+ t.thesis.on "mouseenter", ->
73
+ clearTimeout @hide_editor_delay
74
+ $(this).addClass "active"
75
+ .on "mouseleave", ->
76
+ @hide_editor_delay = Utilities.delay 2000, ()=>
77
+ $(this).removeClass "active"
78
+
79
+ @edit_page_button.on "mouseenter", ->
80
+ t.change_edit_tooltip_status()
81
+
82
+ @edit_page_button.on "click", (e) ->
83
+ e.preventDefault()
84
+ t.edit_button_click_actions()
85
+
86
+ edit_button_click_actions: ->
87
+ if this.page_in_edit_mode()
88
+ if this.page_has_unsaved_content()
89
+ this.change_edit_tooltip_status("Save Page before Exiting", "error")
90
+ else
91
+ this.end_editing()
92
+ else
93
+ this.start_editing()
94
+
95
+ change_edit_tooltip_status: (edit_text=null, classes=null) ->
96
+ $tooltip = @edit_page_button.find(".tooltip")
97
+ $tooltip.removeClass().addClass("tooltip")
98
+ $tooltip.addClass "#{classes}" if classes
99
+ unless edit_text
100
+ if this.page_in_edit_mode()
101
+ if this.page_has_unsaved_content()
102
+ edit_text = "Editing Page"
103
+ else
104
+ edit_text = "Exit Edit Mode"
105
+ else
106
+ edit_text = "Edit Page"
107
+ $tooltip.text edit_text
108
+
109
+ start_editing: ->
110
+ $("body").append($("<div></div>").addClass("thesis-fader"))
111
+ $("body").addClass("thesis-editing")
112
+ $(".thesis-content-html").hallo this.hallo_html_options()
113
+ $(".thesis-content-text").hallo this.hallo_text_options()
114
+ this.change_edit_tooltip_status()
115
+
116
+ end_editing: ->
117
+ $(".thesis-fader").remove()
118
+ $("body").removeClass("thesis-editing")
119
+ $(".thesis-content-html").hallo editable: false
120
+ $(".thesis-content-text").hallo editable: false
121
+ this.change_edit_tooltip_status()
122
+
123
+ save_content: ->
124
+ # Gather the content for posting
125
+ payload = {}
126
+ $(".thesis-content-html, .thesis-content-text").each ()->
127
+ content_area = $(this)
128
+ content_id = content_area.data("thesis-content-id")
129
+ payload[content_id] = content_area.html()
130
+
131
+ $.ajax
132
+ url: "/thesis/update_page_content"
133
+ data: payload
134
+ type: "put"
135
+ dataType: "json"
136
+ success: ->
137
+ alert "Page saved."
138
+ error: ->
139
+ alert "Sorry, couldn't save this page."
140
+
141
+ add_page: ->
142
+ page_name = prompt "What is the name of the new page?"
143
+ if page_name
144
+ parent_slug = null
145
+ if confirm("Make this a subpage of the current page?")
146
+ parent_slug = window.location.pathname
147
+ $.ajax
148
+ url: "/thesis/create_page"
149
+ data:
150
+ name: page_name
151
+ parent_slug: parent_slug
152
+ type: "post"
153
+ dataType: "json"
154
+ success: (resp, status, xhr)->
155
+ if resp && resp.page
156
+ window.location = resp.page.slug
157
+ else
158
+ alert "Unknown error"
159
+ error: ->
160
+ alert "Sorry, couldn't save this page."
161
+
162
+ delete_page: ->
163
+ really_sure = confirm "Are you sure you want to delete this page? There is no undo!"
164
+ if really_sure
165
+ $.ajax
166
+ url: "/thesis/delete_page"
167
+ data:
168
+ slug: window.location.pathname
169
+ type: "delete"
170
+ # dataType: "json"
171
+ success: ->
172
+ alert "Page was deleted."
173
+ error: ->
174
+ alert "Sorry, couldn't delete this page."
175
+
176
+
177
+ # OPTIONS
178
+ hallo_text_options: ->
179
+ options =
180
+ editable: true
181
+
182
+ hallo_html_options: ->
183
+ options =
184
+ editable: true
185
+ plugins:
186
+ 'halloformat': {}
187
+ 'halloheadings': {}
188
+ 'hallojustify': {}
189
+ 'hallolists': {}
190
+ 'halloreundo': {}
191
+ 'hallolink': {}
192
+ # 'halloimage': {} # Someday?
193
+
194
+
195
+ # EDITOR
196
+ draw_editor: ->
197
+ @thesis.append(this.draw_add_icon())
198
+ @thesis.append(this.draw_delete_icon())
199
+ @thesis.append(this.draw_settings_icon())
200
+ @thesis.append(this.draw_cancel_icon())
201
+ @thesis.append(this.draw_save_icon())
202
+ @thesis.append(this.draw_edit_icon())
203
+ @edit_page_button = @thesis.find(".thesis-button.edit")
204
+
205
+ draw_edit_icon: ->
206
+ $icon = $("<i></i>").addClass "fa fa-edit fa-2x"
207
+ $tooltip = $("<div></div>").addClass("tooltip").text "Edit Page"
208
+ $("<div></div>").addClass("thesis-button edit").append $tooltip, $icon
209
+
210
+ draw_save_icon: ->
211
+ $icon = $("<i></i>").addClass "fa fa-save fa-2x"
212
+ $tooltip = $("<div></div>").addClass("tooltip").text "Save Changes"
213
+ $button = $("<div></div>").addClass("thesis-button save").append $tooltip, $icon
214
+ $button.on "click", ->
215
+ Thesis.save_content()
216
+ Thesis.end_editing()
217
+
218
+ draw_add_icon: ->
219
+ $icon = $("<i></i>").addClass "fa fa-plus fa-2x"
220
+ $tooltip = $("<div></div>").addClass("tooltip").text "Add New Page"
221
+ $button = $("<div></div>").addClass("thesis-button add").append $tooltip, $icon
222
+ $button.on "click", ->
223
+ Thesis.add_page()
224
+
225
+ draw_settings_icon: ->
226
+ $icon = $("<i></i>").addClass "fa fa-wrench fa-2x"
227
+ $tooltip = $("<div></div>").addClass("tooltip").text "Page Settings"
228
+ $button = $("<div></div>").addClass("thesis-button settings").append $tooltip, $icon
229
+ $button.on "click", ->
230
+ Thesis.modal(true, "settings")
231
+
232
+ draw_delete_icon: ->
233
+ $icon = $("<i></i>").addClass "fa fa-trash fa-2x"
234
+ $tooltip = $("<div></div>").addClass("tooltip").text "Delete Page"
235
+ $button = $("<div></div>").addClass("thesis-button delete").append $tooltip, $icon
236
+ $button.on "click", ->
237
+ Thesis.delete_page()
238
+
239
+ draw_cancel_icon: ->
240
+ $icon = $("<i></i>").addClass "fa fa-remove fa-2x"
241
+ $tooltip = $("<div></div>").addClass("tooltip").text "Discard Changes"
242
+ $button = $("<div></div>").addClass("thesis-button cancel").append $tooltip, $icon
243
+ $button.on "click", ->
244
+ Thesis.end_editing()
245
+ location.reload()
246
+
247
+ jQuery ($)->
248
+ Thesis.setup()
249
+
250
+ # window.Thesis = Thesis # Enable if necessary