cmsimple 0.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.
Files changed (221) hide show
  1. data/.gitignore +31 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +16 -0
  4. data/Gemfile +20 -0
  5. data/Gemfile.ci +5 -0
  6. data/LICENSE +19 -0
  7. data/README.md +118 -0
  8. data/Rakefile +47 -0
  9. data/app/assets/javascripts/cmsimple.js +61 -0
  10. data/app/assets/javascripts/cmsimple/controllers/editor.coffee +102 -0
  11. data/app/assets/javascripts/cmsimple/lib/namespaces.coffee +3 -0
  12. data/app/assets/javascripts/cmsimple/lib/support.coffee +4 -0
  13. data/app/assets/javascripts/cmsimple/mercury/config.js +462 -0
  14. data/app/assets/javascripts/cmsimple/mercury/handlers.coffee +9 -0
  15. data/app/assets/javascripts/cmsimple/models/image.coffee +49 -0
  16. data/app/assets/javascripts/cmsimple/models/page.coffee +106 -0
  17. data/app/assets/javascripts/cmsimple/models/path.coffee +31 -0
  18. data/app/assets/javascripts/cmsimple/models/version.coffee +29 -0
  19. data/app/assets/javascripts/cmsimple/panels/images/index.coffee +2 -0
  20. data/app/assets/javascripts/cmsimple/panels/images/list.coffee +48 -0
  21. data/app/assets/javascripts/cmsimple/panels/images/panel.coffee +69 -0
  22. data/app/assets/javascripts/cmsimple/panels/images/selection.coffee +52 -0
  23. data/app/assets/javascripts/cmsimple/panels/page_metadata.coffee +42 -0
  24. data/app/assets/javascripts/cmsimple/panels/publish.coffee +32 -0
  25. data/app/assets/javascripts/cmsimple/panels/redirects/form.coffee +51 -0
  26. data/app/assets/javascripts/cmsimple/panels/redirects/index.coffee +2 -0
  27. data/app/assets/javascripts/cmsimple/panels/redirects/list.coffee +34 -0
  28. data/app/assets/javascripts/cmsimple/panels/redirects/panel.coffee +39 -0
  29. data/app/assets/javascripts/cmsimple/panels/sitemap/index.coffee +2 -0
  30. data/app/assets/javascripts/cmsimple/panels/sitemap/panel.coffee +40 -0
  31. data/app/assets/javascripts/cmsimple/panels/sitemap/sortable.coffee +55 -0
  32. data/app/assets/javascripts/cmsimple/panels/sitemap/tree.coffee +61 -0
  33. data/app/assets/javascripts/cmsimple/panels/versions/index.coffee +2 -0
  34. data/app/assets/javascripts/cmsimple/panels/versions/list.coffee +51 -0
  35. data/app/assets/javascripts/cmsimple/panels/versions/panel.coffee +53 -0
  36. data/app/assets/javascripts/cmsimple/views/image_library/_item.jst.hamlc +24 -0
  37. data/app/assets/javascripts/cmsimple/views/image_library/list.jst.hamlc +8 -0
  38. data/app/assets/javascripts/cmsimple/views/redirects/_path.jst.hamlc +6 -0
  39. data/app/assets/javascripts/cmsimple/views/redirects/list.jst.hamlc +19 -0
  40. data/app/assets/javascripts/cmsimple/views/sitemap/_page.jst.hamlc +9 -0
  41. data/app/assets/javascripts/cmsimple/views/sitemap/tree.jst.hamlc +5 -0
  42. data/app/assets/javascripts/cmsimple/views/versions/_item.jst.hamlc +6 -0
  43. data/app/assets/javascripts/cmsimple/views/versions/list.jst.hamlc +4 -0
  44. data/app/assets/stylesheets/cmsimple.css +15 -0
  45. data/app/assets/stylesheets/cmsimple/forms.css +10 -0
  46. data/app/assets/stylesheets/cmsimple/panels.css +399 -0
  47. data/app/assets/stylesheets/cmsimple/toolbar-images.css +27 -0
  48. data/app/assets/stylesheets/mercury_overrides.css +2 -0
  49. data/app/controllers/cmsimple/front_controller.rb +38 -0
  50. data/app/controllers/cmsimple/images_controller.rb +28 -0
  51. data/app/controllers/cmsimple/mercury_controller.rb +7 -0
  52. data/app/controllers/cmsimple/pages_controller.rb +89 -0
  53. data/app/controllers/cmsimple/paths_controller.rb +23 -0
  54. data/app/controllers/cmsimple/snippets_controller.rb +23 -0
  55. data/app/controllers/cmsimple/versions_controller.rb +17 -0
  56. data/app/helpers/cmsimple/regions_helper.rb +38 -0
  57. data/app/models/cmsimple/image.rb +19 -0
  58. data/app/models/cmsimple/page.rb +203 -0
  59. data/app/models/cmsimple/path.rb +63 -0
  60. data/app/models/cmsimple/region.rb +43 -0
  61. data/app/models/cmsimple/snippet.rb +64 -0
  62. data/app/models/cmsimple/version.rb +18 -0
  63. data/app/uploaders/image_attachment_uploader.rb +53 -0
  64. data/app/views/cmsimple/images/_form.html.haml +13 -0
  65. data/app/views/cmsimple/images/new.html.haml +5 -0
  66. data/app/views/cmsimple/pages/_form.html.haml +49 -0
  67. data/app/views/cmsimple/pages/_form_extras.html.haml +2 -0
  68. data/app/views/cmsimple/pages/edit.html.haml +3 -0
  69. data/app/views/cmsimple/pages/new.html.haml +3 -0
  70. data/app/views/cmsimple/pages/publish.html.haml +12 -0
  71. data/app/views/cmsimple/snippets/index.html.haml +5 -0
  72. data/app/views/cmsimple/templates/default.html.haml +4 -0
  73. data/app/views/layouts/editor.html.haml +12 -0
  74. data/app/views/layouts/panel.html.haml +9 -0
  75. data/cmsimple.gemspec +44 -0
  76. data/config.ru +4 -0
  77. data/config/application.rb +1 -0
  78. data/config/cucumber.yml +8 -0
  79. data/config/environment.rb +2 -0
  80. data/config/routes.rb +34 -0
  81. data/db/migrate/20120201221410_create_cmsimple_pages.rb +10 -0
  82. data/db/migrate/20120222185901_add_title_parent_id_and_position_to_pages.rb +10 -0
  83. data/db/migrate/20120229185214_add_slug_to_pages.rb +7 -0
  84. data/db/migrate/20120323200439_add_is_root_to_page.rb +5 -0
  85. data/db/migrate/20120328174339_add_meta_info_to_cmsimple_pages.rb +9 -0
  86. data/db/migrate/20120329172857_create_cmsimple_path.rb +11 -0
  87. data/db/migrate/20120407024752_create_cmsimple_images.rb +13 -0
  88. data/db/migrate/20120410041105_add_timestamps_to_cmsimple_pages.rb +7 -0
  89. data/db/migrate/20120425211937_add_published_at_to_cmsimple_pages.rb +6 -0
  90. data/db/migrate/20120430175047_create_cmsimple_versions.rb +13 -0
  91. data/db/migrate/20120831233927_rename_path_to_current_uri_on_paths.rb +5 -0
  92. data/features/create.feature +18 -0
  93. data/features/delete.feature +12 -0
  94. data/features/edit.feature +54 -0
  95. data/features/publishing.feature +31 -0
  96. data/features/redirects.feature +27 -0
  97. data/features/step_definitions/mercury_steps.rb +440 -0
  98. data/features/step_definitions/page_steps.rb +269 -0
  99. data/features/step_definitions/web_steps.rb +254 -0
  100. data/features/support/env.rb +77 -0
  101. data/features/support/mercury_content.rb +25 -0
  102. data/features/support/mercury_selectors.rb +148 -0
  103. data/features/support/paths.rb +16 -0
  104. data/features/support/selectors.rb +26 -0
  105. data/features/support/utils.rb +18 -0
  106. data/features/versioning.feature +27 -0
  107. data/features/visit.feature +7 -0
  108. data/lib/cmsimple.rb +22 -0
  109. data/lib/cmsimple/configuration.rb +65 -0
  110. data/lib/cmsimple/exts/to_bool.rb +25 -0
  111. data/lib/cmsimple/page_responder.rb +46 -0
  112. data/lib/cmsimple/rails.rb +5 -0
  113. data/lib/cmsimple/regions_proxy.rb +32 -0
  114. data/lib/cmsimple/template_resolver.rb +14 -0
  115. data/lib/cmsimple/template_responder.rb +12 -0
  116. data/lib/cmsimple/version.rb +3 -0
  117. data/lib/generators/cmsimple/install/install_generator.rb +46 -0
  118. data/lib/generators/cmsimple/install/templates/default.html.erb +10 -0
  119. data/lib/generators/cmsimple/install/templates/default.html.haml +6 -0
  120. data/lib/generators/cmsimple/install/templates/initializer.rb +22 -0
  121. data/lib/generators/cmsimple/snippet/snippet_generator.rb +56 -0
  122. data/lib/generators/cmsimple/snippet/templates/cell.rb +18 -0
  123. data/lib/generators/cmsimple/snippet/templates/display.html.erb +14 -0
  124. data/lib/generators/cmsimple/snippet/templates/display.html.haml +11 -0
  125. data/lib/generators/cmsimple/snippet/templates/options.html.erb +18 -0
  126. data/lib/generators/cmsimple/snippet/templates/options.html.haml +12 -0
  127. data/script/app +2 -0
  128. data/script/migrate +2 -0
  129. data/script/rails +8 -0
  130. data/spec/fixtures/rails.png +0 -0
  131. data/spec/helpers/regions_helper_spec.rb +62 -0
  132. data/spec/javascripts/controllers/editor_spec.coffee +57 -0
  133. data/spec/javascripts/models/image_geometry_spec.coffee +64 -0
  134. data/spec/javascripts/models/image_spec.coffee +4 -0
  135. data/spec/javascripts/models/page_spec.coffee +121 -0
  136. data/spec/javascripts/models/path_spec.coffee +39 -0
  137. data/spec/javascripts/models/version_spec.coffee +31 -0
  138. data/spec/javascripts/panels/images/selection_spec.coffee +104 -0
  139. data/spec/javascripts/panels/sitemap/panel_spec.coffee +10 -0
  140. data/spec/javascripts/panels/sitemap/sortable_spec.coffee +63 -0
  141. data/spec/javascripts/panels/sitemap/tree_spec.coffee +62 -0
  142. data/spec/javascripts/spec_helper.coffee +25 -0
  143. data/spec/javascripts/support/stubs.coffee +16 -0
  144. data/spec/lib/page_responder_spec.rb +58 -0
  145. data/spec/lib/regions_proxy_spec.rb +47 -0
  146. data/spec/models/image_spec.rb +46 -0
  147. data/spec/models/page_spec.rb +237 -0
  148. data/spec/models/path_spec.rb +71 -0
  149. data/spec/models/region_spec.rb +14 -0
  150. data/spec/models/snippet_spec.rb +57 -0
  151. data/spec/models/version_spec.rb +7 -0
  152. data/spec/rails_app/.gitignore +33 -0
  153. data/spec/rails_app/Rakefile +7 -0
  154. data/spec/rails_app/app/assets/images/rails.png +0 -0
  155. data/spec/rails_app/app/assets/javascripts/application.js +9 -0
  156. data/spec/rails_app/app/assets/stylesheets/application.css +7 -0
  157. data/spec/rails_app/app/cells/example/display.html.haml +2 -0
  158. data/spec/rails_app/app/cells/example/options.html.haml +15 -0
  159. data/spec/rails_app/app/cells/example_cell.rb +19 -0
  160. data/spec/rails_app/app/cells/image_example/display.html.haml +4 -0
  161. data/spec/rails_app/app/cells/image_example/options.html.haml +15 -0
  162. data/spec/rails_app/app/cells/image_example_cell.rb +18 -0
  163. data/spec/rails_app/app/controllers/application_controller.rb +3 -0
  164. data/spec/rails_app/app/helpers/application_helper.rb +2 -0
  165. data/spec/rails_app/app/mailers/.gitkeep +0 -0
  166. data/spec/rails_app/app/models/.gitkeep +0 -0
  167. data/spec/rails_app/app/views/cmsimple/_snippet_list.html.haml +8 -0
  168. data/spec/rails_app/app/views/cmsimple/templates/default.html.haml +19 -0
  169. data/spec/rails_app/app/views/cmsimple/templates/test.html.haml +2 -0
  170. data/spec/rails_app/app/views/layouts/application.html.haml +13 -0
  171. data/spec/rails_app/config.ru +4 -0
  172. data/spec/rails_app/config/application.rb +65 -0
  173. data/spec/rails_app/config/boot.rb +9 -0
  174. data/spec/rails_app/config/database.example.yml +22 -0
  175. data/spec/rails_app/config/database.travis.yml +8 -0
  176. data/spec/rails_app/config/environment.rb +5 -0
  177. data/spec/rails_app/config/environments/development.rb +30 -0
  178. data/spec/rails_app/config/environments/test.rb +39 -0
  179. data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  180. data/spec/rails_app/config/initializers/cells.rb +1 -0
  181. data/spec/rails_app/config/initializers/cmsimple.rb +3 -0
  182. data/spec/rails_app/config/initializers/inflections.rb +10 -0
  183. data/spec/rails_app/config/initializers/mime_types.rb +5 -0
  184. data/spec/rails_app/config/initializers/secret_token.rb +7 -0
  185. data/spec/rails_app/config/initializers/session_store.rb +8 -0
  186. data/spec/rails_app/config/initializers/teabag.rb +58 -0
  187. data/spec/rails_app/config/initializers/wrap_parameters.rb +14 -0
  188. data/spec/rails_app/config/locales/en.yml +5 -0
  189. data/spec/rails_app/config/routes.rb +61 -0
  190. data/spec/rails_app/db/seeds.rb +11 -0
  191. data/spec/rails_app/lib/assets/.gitkeep +0 -0
  192. data/spec/rails_app/lib/tasks/.gitkeep +0 -0
  193. data/spec/rails_app/public/404.html +26 -0
  194. data/spec/rails_app/public/422.html +26 -0
  195. data/spec/rails_app/public/500.html +26 -0
  196. data/spec/rails_app/public/robots.txt +5 -0
  197. data/spec/rails_app/script/rails +6 -0
  198. data/spec/rails_app/vendor/assets/stylesheets/.gitkeep +0 -0
  199. data/spec/rails_app/vendor/plugins/.gitkeep +0 -0
  200. data/spec/spec_helper.rb +31 -0
  201. data/spec/support/active_model_lint_example.rb +14 -0
  202. data/spec/teabag_env.rb +28 -0
  203. data/vendor/assets/images/sitemap/has-changes.png +0 -0
  204. data/vendor/assets/images/sitemap/published.png +0 -0
  205. data/vendor/assets/images/sitemap/unpublished.png +0 -0
  206. data/vendor/assets/images/toolbar/metadata.png +0 -0
  207. data/vendor/assets/images/toolbar/publish.png +0 -0
  208. data/vendor/assets/images/toolbar/redirect.png +0 -0
  209. data/vendor/assets/images/toolbar/sitemap.png +0 -0
  210. data/vendor/assets/images/toolbar/snippets.png +0 -0
  211. data/vendor/assets/images/toolbar/unpublished.png +0 -0
  212. data/vendor/assets/images/tree-line-horizontal-last.png +0 -0
  213. data/vendor/assets/images/tree-line-horizontal.png +0 -0
  214. data/vendor/assets/images/tree-line-vertical.png +0 -0
  215. data/vendor/assets/javascripts/jquery-serializeObject.js +107 -0
  216. data/vendor/assets/javascripts/jquery.to-json.js +74 -0
  217. data/vendor/assets/javascripts/jquery.ui.nestedSortable-1.3.4.js +391 -0
  218. data/vendor/assets/javascripts/moment-1.6.2.js +918 -0
  219. data/vendor/assets/javascripts/underscore-1.3.1.js +31 -0
  220. data/vendor/assets/stylesheets/jasmine-modified.css +216 -0
  221. metadata +686 -0
@@ -0,0 +1,9 @@
1
+ jQuery(window).bind 'mercury:ready', ->
2
+ Mercury.modalHandlers.editMetadata = ->
3
+ new CMSimple.Panels.PageMetadata(@element, @, 'edit')
4
+
5
+ Mercury.modalHandlers.newPage = ->
6
+ new CMSimple.Panels.PageMetadata(@element, @, 'new')
7
+
8
+ Mercury.modalHandlers.publish = ->
9
+ new CMSimple.Panels.Publish(@element, @)
@@ -0,0 +1,49 @@
1
+ class CMSimple.Image extends Spine.Model
2
+ @configure 'Image', 'attachment', 'width', 'height', 'content_type', 'file_size', 'created_at'
3
+ @extend Spine.Model.Ajax
4
+
5
+ @url: '/cmsimple/images'
6
+
7
+
8
+ @allWithinGeometry: (query)->
9
+ geometry = new CMSimple.Image.Geometry(query)
10
+ @select (item)->
11
+ geometry.inRange item.width, item.height
12
+
13
+
14
+ # 500x200
15
+ # <800x<800
16
+ # >100x>300
17
+
18
+ class CMSimple.Image.Geometry
19
+ constructor: (@query)->
20
+ @parse()
21
+
22
+ parse: ->
23
+ return unless @query
24
+ [width, height] = @query?.split('x')
25
+ @widthQualifier = width?.match(/[\<|\>]/)?[0]
26
+ @heightQualifier = height?.match(/[\<|\>]/)?[0]
27
+ @width = parseInt(width?.replace(/\D/, ''), 10)
28
+ @height = parseInt(height?.replace(/\D/, ''), 10)
29
+
30
+ inRange: (width, height)->
31
+ @widthQualifies(width) and @heightQualifies(height)
32
+
33
+ widthQualifies: (width)->
34
+ @qualifiedDimension width, @width, @widthQualifier
35
+
36
+ heightQualifies: (height)->
37
+ @qualifiedDimension height, @height, @heightQualifier
38
+
39
+ qualifiedDimension: (input, dimension, qualifier)->
40
+ return true unless dimension
41
+ input = parseInt(input, 10)
42
+ switch qualifier
43
+ when '<'
44
+ input <= dimension
45
+ when '>'
46
+ input >= dimension
47
+ else
48
+ input is dimension
49
+
@@ -0,0 +1,106 @@
1
+ class CMSimple.Page extends Spine.Model
2
+ @configure 'Page', 'template', 'title', 'parent_id', 'position', 'slug', 'is_root', 'browser_title', 'keywords', 'description', 'published', 'unpublished_changes', 'uri'
3
+ @extend Spine.Model.Ajax
4
+
5
+ @belongsTo 'parent', 'CMSimple.Page', 'parent_id'
6
+ @hasMany 'children', 'CMSimple.Page', 'parent_id'
7
+
8
+ @roots: ->
9
+ pages = @select (page)-> not page.parent_id
10
+ _(pages).sortBy (record)-> record.position
11
+
12
+ @forPath: (path)->
13
+ _(@select (page)-> page.path() is path).first()
14
+
15
+ @updatePositions: (ids, options={})->
16
+ for id in ids
17
+ position = ids.indexOf(id)
18
+ page = CMSimple.Page.find(id)
19
+ if page.position isnt position
20
+ page.updateAttributes(position: position)
21
+
22
+ snippets: ->
23
+ _(@content).reduce ((memo, region)-> _.extend(memo, region.snippets)), {}
24
+
25
+ sortedChildren: ->
26
+ _(@children().all()).sortBy (record)-> record.position
27
+
28
+ hasChildren: ->
29
+ @children().all().length > 0
30
+
31
+ publishedState: ->
32
+ if @published
33
+ if @unpublished_changes
34
+ 'has-changes'
35
+ else
36
+ 'published'
37
+ else
38
+ 'unpublished'
39
+
40
+ versions: ->
41
+ CMSimple.Version.allForPage(@)
42
+
43
+ fromForm: (form)->
44
+ values = form.toJSON()
45
+ values = values.page if values.page
46
+ #fix for views depending on realtime change events of children
47
+ values.parent_id = parseInt(values.parent_id, 0) if values.parent_id
48
+ @load(values)
49
+
50
+ reinflate: @::reload
51
+
52
+ reload: ->
53
+ @constructor.fetch
54
+ id: @id
55
+ success: => @trigger 'reload'
56
+
57
+ editPath: ->
58
+ "/editor#{@path()}"
59
+
60
+ isRoot: ->
61
+ # handle the form values pre refresh from server
62
+ @is_root is true or @is_root is '1'
63
+
64
+ load: (values)->
65
+ values = @normalizeSlug(values)
66
+ super(values)
67
+
68
+ path: (options={})->
69
+ return '/' if (not options.ignoreRoot) && @isRoot()
70
+
71
+ # if we have a client side parent compute the path
72
+ if @parent()
73
+ parent_path = @parent().path(ignoreRoot: true)
74
+ path = [parent_path, @slug].join('/')
75
+
76
+ # if the parent isn't loaded fall back to the uri
77
+ else if @parent_id
78
+ path = @uri
79
+
80
+ # otherwise just use the slug
81
+ else
82
+ path = "/#{@slug}"
83
+
84
+ path = path.replace(/\/+/, '/')
85
+ path = path.replace(/\/$/, '')
86
+ path
87
+
88
+ normalizeSlug: (values)->
89
+ return values unless values.title
90
+
91
+ if Spine.isBlank(values.slug) && Spine.isBlank(@slug)
92
+ values.slug = values.title
93
+
94
+ unless Spine.isBlank(values.slug)
95
+ values.slug = @escape(values.slug)
96
+
97
+ return values
98
+
99
+ escape: (string)->
100
+ return '' unless string
101
+ string = string.replace(/[^\x00-\x7F]+/g, '') # Remove anything non-ASCII entirely (e.g. diacritics).
102
+ string = string.replace(/[^\w_ \-]+/ig, '') # Remove unwanted chars.
103
+ string = string.replace(/[ \-]+/ig, '-') # No more than one of the separator in a row.
104
+ string = string.replace(/^\-|\-$/ig, '') # Remove leading/trailing separator.
105
+ string.toLowerCase()
106
+
@@ -0,0 +1,31 @@
1
+ class CMSimple.Path extends Spine.Model
2
+ @configure 'Path', 'uri', 'redirect_uri', 'page_id', 'updated_at', 'created_at'
3
+ @extend Spine.Model.Ajax
4
+
5
+ @belongsTo 'page', 'CMSimple.Page', 'page_id'
6
+
7
+ @allRedirects: ->
8
+ results = @select (item)->
9
+ not (item.page() && item.page().isRoot()) && item.uri isnt item.destinationPath()
10
+ _(results).sortBy (item)-> item.uri
11
+
12
+ uriIsUnique: ->
13
+ not _(@constructor.all()).any (path)=>
14
+ path.uri is @uri and not @eql(path)
15
+
16
+ validate: ->
17
+ unless @uri
18
+ return "Source URL is required"
19
+
20
+ unless @uriIsUnique()
21
+ return "Source URL must be unique"
22
+
23
+ unless @redirect_uri || @page_id
24
+ return "Destination redirect URL is required"
25
+
26
+ return null
27
+
28
+ destinationPath: ->
29
+ if @page() then @page().path() else @redirect_uri
30
+
31
+
@@ -0,0 +1,29 @@
1
+ class CMSimple.Version extends Spine.Model
2
+ @configure 'Version', 'template', 'content', 'published_at', 'updated_at', 'created_at'
3
+ @extend Spine.Model.Ajax
4
+
5
+ @belongsTo 'page', 'CMSimple.Page', 'page_id'
6
+
7
+ @fetch: (page, params={})->
8
+ throw 'CMSimple.Page instance required to fetch versions' unless page
9
+ url = page.url('versions')
10
+ super _.extend {url: url}, params
11
+
12
+ @allForPage: (page)->
13
+ results = @select (item)-> item.page().id is page.id
14
+ (_(results).sortBy (item)-> moment(item.published_at)).reverse()
15
+
16
+ url: (args...) ->
17
+ args.unshift @page().url('versions', @id)
18
+ args.join('/')
19
+
20
+ revertTo: ->
21
+ $.ajax
22
+ type: 'PUT'
23
+ url: @url('revert_to'),
24
+ success: =>
25
+ @page().reload()
26
+ error: ->
27
+ console?.log 'error', arguments
28
+ alert('There was an error reverting to the requested version')
29
+
@@ -0,0 +1,2 @@
1
+ #= require cmsimple/lib/namespaces
2
+ #= require ./panel
@@ -0,0 +1,48 @@
1
+ #= require cmsimple/models/image
2
+
3
+ #= require cmsimple/views/image_library/_item
4
+
5
+ class CMSimple.Panels.ImageLibrary.List extends Spine.Controller
6
+ events:
7
+ 'click .media-actions > .info' : 'toggleInfo'
8
+ 'click .media-info > .close' : 'toggleInfo'
9
+ 'click [data-full-url]' : 'triggerImage'
10
+ 'click .delete' : 'deleteImage'
11
+
12
+ constructor: (el)->
13
+ super el: $(el)
14
+
15
+ CMSimple.Image.bind 'refresh change', => @render()
16
+
17
+ render: ->
18
+ @html('')
19
+ @addImage image for image in CMSimple.Image.all()
20
+
21
+ filterByGeometry: (geometry)->
22
+ @html('')
23
+ @addImage image for image in CMSimple.Image.allWithinGeometry(geometry)
24
+
25
+ addImage: (image)->
26
+ @append JST['cmsimple/views/image_library/_item'](image)
27
+
28
+ toggleInfo: (e) ->
29
+ e.preventDefault()
30
+ info = $(e.target).parents('li').first().find('.media-info')[0]
31
+ $(info).toggleClass('active')
32
+
33
+ triggerImage: (e)->
34
+ img = $(e.target)
35
+ image = CMSimple.Image.find(img.data('id'))
36
+ @trigger 'image:selected',
37
+ src: img.data('full-url'),
38
+ alt: image.title,
39
+ 'image-id': image.id
40
+
41
+ deleteImage: (e)->
42
+ e.preventDefault()
43
+ link = $(e.target)
44
+ if confirm 'Are you sure you would like to delete this image?'
45
+ id = link.parents('[data-id]').data('id')
46
+ image = CMSimple.Image.find(id)
47
+ image.destroy()
48
+
@@ -0,0 +1,69 @@
1
+ #= require_self
2
+ #= require cmsimple/models/image
3
+ #= require cmsimple/panels/images/list
4
+ #= require cmsimple/panels/images/selection
5
+
6
+ #= require cmsimple/views/image_library/list
7
+ #= require cmsimple/views/image_library/_item
8
+
9
+ class CMSimple.Panels.ImageLibrary extends Mercury.Panel
10
+
11
+ constructor: ()->
12
+ super(null, 'insertMedia', title: 'Image Library', appendTo: '.mercury-toolbar-container', closeButton: true)
13
+ @button = $('.mercury-insertMedia-button')
14
+ @loadContent JST['cmsimple/views/image_library/list']()
15
+
16
+ @list = new CMSimple.Panels.ImageLibrary.List($('ul.media-grid'))
17
+ @selection = new CMSimple.Panels.ImageLibrary.Selection()
18
+
19
+ @bindPanelEvents()
20
+
21
+
22
+ toggle: ->
23
+ super
24
+ if @visible
25
+ CMSimple.Image.fetch()
26
+ @resize()
27
+
28
+
29
+ bindPanelEvents: ->
30
+ $('#add_image', @element).on('click', @toggleUploader)
31
+ $('.image-filter', @element).on('submit', @filterImages)
32
+ $(window).bind 'cmsimple:images:uploaded', => @imageUploaded()
33
+
34
+ @list.bind 'image:selected', (img)=>
35
+ @selection.set(img)
36
+
37
+ @selection.bind 'filter', (geometry)=>
38
+ @list.filterByGeometry(geometry)
39
+ $('.filter', @element).val(geometry)
40
+
41
+
42
+ toggleUploader: (e) ->
43
+ target = $(e.target)
44
+ form = $('.add-image-action', @element)
45
+ form.toggleClass('active')
46
+ if form.hasClass('active')
47
+ target.text('Cancel')
48
+ else
49
+ target.text('Add Image')
50
+
51
+
52
+ imageUploaded: ->
53
+ CMSimple.Image.fetch()
54
+ @closeUploader()
55
+
56
+
57
+ closeUploader: ->
58
+ $('#add_image', @element).text('Add Image')
59
+ $('.add-image-action', @element).removeClass('active')
60
+
61
+
62
+ filterImages: (e)=>
63
+ e.preventDefault()
64
+ query = $(e.target).find('input.filter').val()
65
+ if Spine.isBlank(query)
66
+ @list.render()
67
+ else
68
+ @list.filterByGeometry(query)
69
+
@@ -0,0 +1,52 @@
1
+ class CMSimple.Panels.ImageLibrary.Selection extends Spine.Controller
2
+ constructor: ->
3
+ super
4
+ @bindEvents()
5
+
6
+
7
+ set: (img)->
8
+ if @selectedImage
9
+ @selectedImage.attr('src', img.src)
10
+ @selectedImage.attr('alt', img.alt)
11
+ snippet = Mercury.Snippet.find @selectedImage.parents('[data-snippet]').data('snippet')
12
+ snippet.options.snippet[@selectedImage.data('snippet-image')] = img.src
13
+
14
+ else if @region.type() is 'full'
15
+ options = {value: img}
16
+ @region.execCommand 'insertImage', options
17
+
18
+
19
+ clearSelection: ->
20
+ if @selectedImage
21
+ @selectedImage.removeClass('selected-image')
22
+ @selectedImage = null
23
+ @trigger 'filter', null
24
+
25
+
26
+ setSelection: (el)->
27
+ @selectedImage?.removeClass('selected-image')
28
+ @selectedImage = el
29
+ @selectedImage.addClass('selected-image')
30
+ if geometry = @selectedImage.data('image-geometry')
31
+ @trigger 'filter', geometry
32
+
33
+
34
+ bindEvents: ->
35
+ Mercury.on 'region:focused', (event, options) =>
36
+ @bindRegion(options.region)
37
+
38
+
39
+ bindRegion: (region)->
40
+ _clearSelection = => @clearSelection()
41
+ if @region
42
+ # unbind current region if user selected a new region
43
+ @region.element.off 'click', _clearSelection
44
+ @region.element.find('[data-snippet-image]').off('click')
45
+
46
+ if @region = region
47
+ @region.element.on 'click', _clearSelection
48
+ @region.element.find('[data-snippet-image]').on 'click', (e)=>
49
+ e.stopPropagation()
50
+ @setSelection($(e.target))
51
+
52
+
@@ -0,0 +1,42 @@
1
+ #= require cmsimple/models/page
2
+
3
+ class CMSimple.Panels.PageMetadata extends Spine.Controller
4
+
5
+ elements:
6
+ 'form' : 'form'
7
+ '.mercury-modal-content' : 'content'
8
+
9
+ events:
10
+ 'submit form' : 'submit'
11
+
12
+ constructor: (container, @modal, @action)->
13
+ super el: container
14
+ @el.off 'ajax:beforeSend'
15
+
16
+ submit: (e)->
17
+ e.preventDefault()
18
+ @page = @pageForAction().fromForm(@form)
19
+ @page.save
20
+ ajax:
21
+ error: @proxy @error
22
+ success: @proxy @success
23
+
24
+ pageForAction: ->
25
+ if @action is 'edit'
26
+ CMSimple.Editor.current_page
27
+ else
28
+ CMSimple.Page
29
+
30
+ success: ->
31
+ @modal.hide()
32
+ Mercury.silent = true
33
+
34
+ if @action is 'edit'
35
+ @page.reload()
36
+ else
37
+ @navigate @page.editPath()
38
+
39
+ error: (event, data)->
40
+ @content.html event.responseText
41
+ alert('Please fill in the required fields.')
42
+