alchemy_cms 2.5.0.rc3 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/.travis.yml +1 -1
  2. data/README.md +22 -29
  3. data/alchemy_cms.gemspec +3 -2
  4. data/app/assets/javascripts/alchemy/alchemy.base.js +7 -0
  5. data/app/assets/javascripts/alchemy/alchemy.datepicker.js +3 -2
  6. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +5 -2
  7. data/app/assets/javascripts/alchemy/alchemy.js +8 -1
  8. data/app/assets/javascripts/alchemy/alchemy.menubar.js +4 -1
  9. data/app/assets/stylesheets/alchemy/archive.scss +1 -6
  10. data/app/assets/stylesheets/alchemy/base.scss +37 -17
  11. data/app/assets/stylesheets/alchemy/dashboard.scss +41 -24
  12. data/app/assets/stylesheets/alchemy/form_elements.scss +1 -1
  13. data/app/assets/stylesheets/alchemy/jquery-ui.scss +3 -2
  14. data/app/assets/stylesheets/alchemy/login.scss +1 -1
  15. data/app/assets/stylesheets/alchemy/menubar.css.scss +3 -1
  16. data/app/assets/stylesheets/alchemy/mixins.scss +9 -0
  17. data/app/assets/stylesheets/alchemy/notices.scss +1 -1
  18. data/app/assets/stylesheets/alchemy/sitemap.scss +1 -1
  19. data/app/controllers/alchemy/admin/dashboard_controller.rb +46 -3
  20. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +3 -0
  21. data/app/controllers/alchemy/admin/pages_controller.rb +7 -7
  22. data/app/controllers/alchemy/attachments_controller.rb +1 -1
  23. data/app/controllers/alchemy/base_controller.rb +5 -1
  24. data/app/helpers/alchemy/admin/essences_helper.rb +21 -0
  25. data/app/models/alchemy/attachment.rb +3 -1
  26. data/app/models/alchemy/page.rb +11 -8
  27. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +38 -0
  28. data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +22 -0
  29. data/app/views/alchemy/admin/dashboard/_sites.html.erb +13 -0
  30. data/app/views/alchemy/admin/dashboard/_users.html.erb +19 -0
  31. data/app/views/alchemy/admin/dashboard/index.html.erb +35 -101
  32. data/app/views/alchemy/admin/dashboard/info.html.erb +57 -0
  33. data/app/views/alchemy/admin/elements/create.js.erb +4 -1
  34. data/app/views/alchemy/admin/elements/update.js.erb +1 -0
  35. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +38 -41
  36. data/app/views/alchemy/admin/essence_pictures/update.js.erb +2 -4
  37. data/app/views/alchemy/essences/_essence_file_view.html.erb +1 -2
  38. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +1 -18
  39. data/app/views/alchemy/essences/_essence_picture_tools.html.erb +1 -1
  40. data/app/views/layouts/alchemy/admin.html.erb +1 -0
  41. data/config/authorization_rules.rb +1 -0
  42. data/config/locales/alchemy.de.yml +5 -1
  43. data/config/locales/alchemy.en.yml +1 -0
  44. data/config/routes.rb +5 -1
  45. data/lib/alchemy/errors.rb +7 -0
  46. data/lib/alchemy/version.rb +1 -1
  47. data/lib/alchemy_cms.rb +1 -0
  48. data/lib/tasks/ferret.rake +0 -3
  49. data/spec/models/attachment_spec.rb +27 -0
  50. data/spec/models/page_spec.rb +7 -0
  51. metadata +33 -7
@@ -3,7 +3,7 @@ div#alchemy_greeting {
3
3
  margin-right: auto;
4
4
  margin-left: auto;
5
5
  padding: 2*$default-padding;
6
- margin-top: 1em;
6
+ margin-top: -4em;
7
7
  text-align: center;
8
8
 
9
9
  p {
@@ -94,11 +94,13 @@
94
94
  @include inline-block;
95
95
  list-style-type: none;
96
96
 
97
- a {
97
+ a, button {
98
98
  line-height: 14px;
99
99
  @include default-button-style;
100
100
  font-weight: normal;
101
101
  text-decoration: none !important;
102
+ color: $text-color !important;
103
+ font-family: $default-font-face;
102
104
  }
103
105
  }
104
106
  }
@@ -124,3 +124,12 @@
124
124
  border-color: transparent transparent $light_yellow transparent;
125
125
  }
126
126
  }
127
+
128
+ @mixin thumbnail-background {
129
+ display: table-cell;
130
+ background-color: $dark-gray;
131
+ text-align: center;
132
+ vertical-align: middle;
133
+ padding: 0;
134
+ line-height: 0;
135
+ }
@@ -45,7 +45,7 @@ div.error {
45
45
  color: #931f23;
46
46
  }
47
47
 
48
- div.warning {
48
+ div.warning, div.warn {
49
49
  @include message;
50
50
  background-color: #f7efb8;
51
51
  color: #756f47;
@@ -4,7 +4,7 @@ div#sort_panel {
4
4
  position: fixed;
5
5
  top: 27px;
6
6
  left: 0;
7
- z-index: 10;
7
+ z-index: 1;
8
8
  width: 100%;
9
9
  border-bottom: $default-border;
10
10
 
@@ -1,14 +1,57 @@
1
+ require 'net/http'
2
+
1
3
  module Alchemy
2
4
  module Admin
3
5
  class DashboardController < Alchemy::Admin::BaseController
4
6
 
5
7
  def index
6
- @alchemy_version = Alchemy::VERSION
7
- @clipboard_items = session[:clipboard]
8
8
  @last_edited_pages = Page.all_last_edited_from(current_user)
9
- @locked_pages = Page.all_locked
9
+ @locked_pages = Page.from_current_site.all_locked
10
10
  @online_users = User.logged_in.to_a - [current_user]
11
11
  @first_time = current_user.sign_in_count == 1 && current_user.last_sign_in_at.nil?
12
+ @sites = Site.scoped
13
+ end
14
+
15
+ def info
16
+ @alchemy_version = Alchemy.version
17
+ render :layout => false
18
+ end
19
+
20
+ def update_check
21
+ @alchemy_version = Alchemy.version
22
+ if @alchemy_version < latest_alchemy_version
23
+ render :text => 'true'
24
+ else
25
+ render :text => 'false'
26
+ end
27
+ rescue UpdateServiceUnavailable => e
28
+ render :text => e, :status => 503
29
+ end
30
+
31
+ private
32
+
33
+ def alchemy_tags
34
+ url = URI.parse('https://api.github.com/repos/magiclabs/alchemy_cms/tags')
35
+ request = Net::HTTP::Get.new(url.path)
36
+ connection = Net::HTTP.new(url.host, url.port)
37
+ connection.use_ssl = true
38
+ connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
39
+ response = connection.request(request)
40
+ if response.code == "200"
41
+ JSON.parse(response.body)
42
+ else
43
+ raise UpdateServiceUnavailable
44
+ end
45
+ end
46
+
47
+ def alchemy_versions
48
+ return [] if alchemy_tags.blank?
49
+ alchemy_tags.collect { |h| h['name'] }.sort
50
+ end
51
+
52
+ def latest_alchemy_version
53
+ return '' if alchemy_versions.blank?
54
+ alchemy_versions.last.gsub(/^v/, '')
12
55
  end
13
56
 
14
57
  end
@@ -3,6 +3,8 @@ module Alchemy
3
3
  class EssencePicturesController < Alchemy::Admin::BaseController
4
4
 
5
5
  helper "alchemy/admin/contents"
6
+ helper "alchemy/admin/essences"
7
+ helper "alchemy/url"
6
8
 
7
9
  def edit
8
10
  @essence_picture = EssencePicture.find(params[:id])
@@ -49,6 +51,7 @@ module Alchemy
49
51
  @essence_picture = EssencePicture.find(params[:id])
50
52
  @essence_picture.update_attributes(params[:essence_picture])
51
53
  @content = Content.find(params[:content_id])
54
+ @options = params[:options] || {}
52
55
  end
53
56
 
54
57
  def assign
@@ -15,7 +15,7 @@ module Alchemy
15
15
 
16
16
  def index
17
17
  @page_root = Page.language_root_for(session[:language_id])
18
- @locked_pages = Page.all_locked_by(current_user)
18
+ @locked_pages = Page.from_current_site.all_locked_by(current_user)
19
19
  @languages = Language.all
20
20
  if !@page_root
21
21
  if @languages.length == 1
@@ -56,7 +56,9 @@ module Alchemy
56
56
  source_page = Page.find(params[:paste_from_clipboard])
57
57
  @page = Page.copy(source_page, {
58
58
  :parent_id => params[:page][:parent_id],
59
- :language => parent.language
59
+ :language => parent.language,
60
+ :name => params[:page][:name],
61
+ :title => params[:page][:name]
60
62
  })
61
63
  if source_page.children.any?
62
64
  source_page.copy_children_to(@page)
@@ -81,7 +83,7 @@ module Alchemy
81
83
  redirect_to admin_pages_path
82
84
  else
83
85
  @page.lock(current_user)
84
- @locked_pages = Page.all_locked_by(current_user)
86
+ @locked_pages = Page.from_current_site.from_current_site.all_locked_by(current_user)
85
87
  end
86
88
  @layoutpage = @page.layoutpage?
87
89
  end
@@ -135,10 +137,8 @@ module Alchemy
135
137
  end
136
138
  @area_name = params[:area_name]
137
139
  @content_id = params[:content_id]
138
- @attachments = Attachment.all.collect { |f| [f.name, download_attachment_path(:id => f.id, :name => f.name)] }
140
+ @attachments = Attachment.all.collect { |f| [f.name, download_attachment_path(:id => f.id, :name => f.urlname)] }
139
141
  if params[:link_urls_for] == "newsletter"
140
- # TODO: links in newsletters has to go through statistic controller. therfore we have to put a string inside the content_rtfs and replace this string with recipient.id before sending the newsletter.
141
- #@url_prefix = "#{current_server}/recipients/reacts"
142
142
  @url_prefix = current_server
143
143
  end
144
144
  if multi_language?
@@ -161,7 +161,7 @@ module Alchemy
161
161
  # fetching page via before filter
162
162
  @page.unlock
163
163
  flash[:notice] = _t("unlocked_page", :name => @page.name)
164
- @pages_locked_by_user = Page.all_locked_by(current_user)
164
+ @pages_locked_by_user = Page.from_current_site.all_locked_by(current_user)
165
165
  respond_to do |format|
166
166
  format.js
167
167
  format.html {
@@ -29,7 +29,7 @@ module Alchemy
29
29
  private
30
30
 
31
31
  def load_attachment
32
- @attachment = Attachment.find(params[:id])
32
+ @attachment = Attachment.where(:id => params[:id]).first
33
33
  end
34
34
 
35
35
  end
@@ -11,7 +11,7 @@ module Alchemy
11
11
  before_filter :mailer_set_url_options
12
12
  before_filter :store_user_request_time
13
13
 
14
- helper_method :current_server, :current_site
14
+ helper_method :current_server, :current_site, :multi_site?
15
15
 
16
16
  # Returns a host string with the domain the app is running on.
17
17
  def current_server
@@ -36,6 +36,10 @@ module Alchemy
36
36
  Language.published.count > 1
37
37
  end
38
38
 
39
+ def multi_site?
40
+ Site.count > 1
41
+ end
42
+
39
43
  def raise_not_found_error
40
44
  raise ActionController::RoutingError.new('Not Found')
41
45
  end
@@ -125,6 +125,27 @@ module Alchemy
125
125
  render :partial => 'alchemy/admin/contents/missing', :locals => {:element => element, :name => name, :options => options}
126
126
  end
127
127
 
128
+ def essence_picture_thumbnail(content, options)
129
+ image_options = {
130
+ :size => content.ingredient.cropped_thumbnail_size(content.essence.render_size.blank? ? options[:image_size] : content.essence.render_size),
131
+ :crop_from => content.essence.crop_from.blank? ? nil : content.essence.crop_from,
132
+ :crop_size => content.essence.crop_size.blank? ? nil : content.essence.crop_size,
133
+ :crop => content.essence.crop_size.blank? && content.essence.crop_from.blank? ? 'crop' : nil
134
+ }
135
+ image_tag(
136
+ alchemy.thumbnail_path({
137
+ :id => content.ingredient.id,
138
+ :name => content.ingredient.urlname,
139
+ :sh => content.ingredient.security_token(image_options)
140
+ }.merge(image_options)),
141
+ :alt => content.ingredient.name,
142
+ :class => 'img_paddingtop',
143
+ :title => _t("image_name") + ": #{content.ingredient.name}",
144
+ :onload => "Alchemy.fadeImage(this, '##{content_dom_id(content)} .picture_content_spinner');",
145
+ :style => "display: none;"
146
+ )
147
+ end
148
+
128
149
  end
129
150
  end
130
151
  end
@@ -25,7 +25,9 @@ module Alchemy
25
25
  end
26
26
 
27
27
  def urlname
28
- ::CGI.escape(read_attribute(:filename).split('.').first)
28
+ parts = filename.split('.')
29
+ sfx = parts.pop
30
+ "#{parts.join('-')}.#{sfx}"
29
31
  end
30
32
 
31
33
  # Checks if the attachment is restricted, because it is attached on restricted pages only
@@ -131,7 +131,8 @@ module Alchemy
131
131
  differences.stringify_keys!
132
132
  attributes = source.attributes.merge(differences)
133
133
  attributes.merge!(DEFAULT_ATTRIBUTES_FOR_COPY)
134
- attributes.merge!('name' => "#{source.name} (#{I18n.t('Copy')})")
134
+ new_name = differences['name'].present? ? differences['name'] : "#{source.name} (#{I18n.t('Copy')})"
135
+ attributes.merge!('name' => new_name)
135
136
  page = self.new(attributes.except(*SKIPPED_ATTRIBUTES_ON_COPY))
136
137
  page.tag_list = source.tag_list
137
138
  if page.save!
@@ -232,17 +233,17 @@ module Alchemy
232
233
 
233
234
  # Finds selected elements from page.
234
235
  #
235
- # Options are:
236
+ # Returns only public elements by default.
237
+ # Pass true as second argument to get all elements.
238
+ #
239
+ # === Options are:
236
240
  #
237
241
  # :only => Array of element names # Returns only elements with given names
238
242
  # :except => Array of element names # Returns all elements except the ones with given names
239
243
  # :count => Integer # Limit the count of returned elements
240
244
  # :offset => Integer # Starts with an offset while returning elements
241
- # :random => Boolean # Returning elements randomly shuffled
242
- # :from_cell => Cell or String # Returning elements from given cell
243
- #
244
- # Returns only public elements by default.
245
- # Pass true as second argument to get all elements.
245
+ # :random => Boolean # Return elements randomly shuffled
246
+ # :from_cell => Cell or String # Return elements from given cell
246
247
  #
247
248
  def find_selected_elements(options = {}, show_non_public = false)
248
249
  if options[:from_cell].class.name == 'Alchemy::Cell'
@@ -252,7 +253,9 @@ module Alchemy
252
253
  if cell
253
254
  elements = cell.elements
254
255
  else
255
- raise(ActiveRecord::RecordNotFound, "Cell with name `#{options[:from_cell]}` could not be found!")
256
+ warn("Cell with name `#{options[:from_cell]}` could not be found!")
257
+ # Returns an empty relation. Can be removed with the release of Rails 4
258
+ elements = self.elements.where('1 = 0')
256
259
  end
257
260
  else
258
261
  elements = self.elements.not_in_cell
@@ -0,0 +1,38 @@
1
+ <div class="widget">
2
+ <h2><%= _t('Currently locked pages') %>:</h2>
3
+ <table>
4
+ <% if @locked_pages.blank? %>
5
+ <tr class="even">
6
+ <td><%= _t('no pages') %></td>
7
+ </tr>
8
+ <% else %>
9
+ <% @locked_pages.each do |page| %>
10
+ <tr class="<%= cycle('even', 'odd', :name => 'locked_pages') %>">
11
+ <% if current_user.id == page.locked_by %>
12
+ <td>
13
+ <%= link_to(page.name, alchemy.edit_admin_page_path(page)) %>
14
+ </td>
15
+ <td>
16
+ <small><%= _t(:me) %></small>
17
+ </td>
18
+ <td>
19
+ <%= form_tag(alchemy.unlock_admin_page_path(page, :redirect_to => alchemy.admin_dashboard_url)) do %>
20
+ <button class="icon_button small" title="<%= _t('explain_unlocking') %>">
21
+ <%= render_icon('close small') %>
22
+ </button>
23
+ <% end %>
24
+ </td>
25
+ <% else %>
26
+ <td>
27
+ <%= page.name %>
28
+ </td>
29
+ <td colspan="2">
30
+ <small><%= page.locker_name %></small>
31
+ </td>
32
+ <% end %>
33
+ </tr>
34
+ <% end %>
35
+ <% end %>
36
+ </table>
37
+ </div>
38
+ <% reset_cycle('locked_pages') %>
@@ -0,0 +1,22 @@
1
+ <div class="widget">
2
+ <h2><%= _t('Your last updated pages') %>:</h2>
3
+ <table>
4
+ <% if @last_edited_pages.blank? %>
5
+ <tr class="even">
6
+ <td><%= _t('no pages') %></td>
7
+ </tr>
8
+ <% else %>
9
+ <% @last_edited_pages.each do |page| %>
10
+ <tr class="<%= cycle('even', 'odd', :name => 'edited_pages') %>">
11
+ <td>
12
+ <%= link_to_if((page.locked_by.blank? || page.locked_by == current_user.id), page.name, edit_admin_page_path(page)) %>
13
+ </td>
14
+ <td>
15
+ <small><%= l(page.updated_at) %></small>
16
+ </td>
17
+ </tr>
18
+ <% end %>
19
+ <% end %>
20
+ </table>
21
+ </div>
22
+ <% reset_cycle('edited_pages') %>
@@ -0,0 +1,13 @@
1
+ <div class="widget">
2
+ <h2><%= Alchemy::Site.model_name.human(:count => 2) %>:</h2>
3
+ <table>
4
+ <% @sites.each do |site| %>
5
+ <tr class="<%= cycle('even', 'odd', :name => 'sites') %>">
6
+ <td>
7
+ <%= link_to_unless(site == Alchemy::Site.current, site.name, login_url(:protocol => 'http://', :host => site.host, :user => {:login => current_user.login}), :target => '_blank') %>
8
+ </td>
9
+ <td><small><%= site.host %></small></td>
10
+ </tr>
11
+ <% end %>
12
+ </table>
13
+ </div>
@@ -0,0 +1,19 @@
1
+ <div class="widget">
2
+ <h2><%= _t('Who else is online') %>:</h2>
3
+ <table>
4
+ <% if @online_users.blank? %>
5
+ <tr class="even">
6
+ <td><%= _t('no users') %></td>
7
+ </tr>
8
+ <% else %>
9
+ <% @online_users.each do |user| %>
10
+ <tr class="<%= cycle('even', 'odd') %>">
11
+ <td><%= user.name %></td>
12
+ <td>
13
+ <small><%= user.human_role_name %></small>
14
+ </td>
15
+ </tr>
16
+ <% end %>
17
+ <% end %>
18
+ </table>
19
+ </div>
@@ -1,105 +1,39 @@
1
+ <%= toolbar(
2
+ :buttons => [
3
+ {
4
+ :icon => 'info',
5
+ :label => _t('info'),
6
+ :url => alchemy.dashboard_info_path,
7
+ :title => _t('info'),
8
+ :overlay_options => {
9
+ :title => _t('info'),
10
+ :size => "420x360"
11
+ },
12
+ :if_permitted_to => [:info, :alchemy_admin_dashboard]
13
+ }
14
+ ],
15
+ :search => false
16
+ ) %>
17
+
1
18
  <div id="dashboard">
2
- <div class="with_padding">
3
- <h1>
4
- <% if @first_time -%>
5
- <%= _t('Welcome, %{name}', :name => current_user.firstname.blank? ? current_user.login : current_user.firstname) %>
6
- <% else -%>
7
- <%= _t('Welcome back, %{name}', :name => current_user.firstname.blank? ? current_user.login : current_user.firstname) %>
8
- <% end -%>
9
- </h1>
10
- <p>
11
- <small><%= _t('Your last login was on %{time}', :time => l(current_user.last_sign_in_at)) unless current_user.last_sign_in_at.blank? %></small>
12
- </p>
13
- </div>
14
- <div class="widget">
15
- <h2><%= _t('Your last updated pages') %>:</h2>
16
- <%- if @last_edited_pages.blank? -%>
17
- <ul><li class="even"><%= _t('no pages') %></li></ul>
18
- <%- else -%>
19
- <ul>
20
- <%- @last_edited_pages.each do |page| -%>
21
- <li class="<%= cycle('even', 'odd', :name => 'edited_pages') %>"><%= link_to_if((page.locked_by.blank? || page.locked_by == current_user.id), page.name, edit_admin_page_path(page)) %> <small>(<%= l(page.updated_at) %>)</small></li>
22
- <%- end -%>
23
- </ul>
24
- <%- end -%>
25
- </div>
26
- <%- reset_cycle('edited_pages') -%>
27
- <div class="widget">
28
- <h2><%= _t('Currently locked pages') %>:</h2>
29
- <%- if @locked_pages.blank? -%>
30
- <ul><li class="even"><%= _t('no pages') %></li></ul>
31
- <%- else -%>
32
- <ul>
33
- <%- @locked_pages.each do |page| -%>
34
- <li class="<%= cycle('even', 'odd', :name => 'locked_pages') %>">
35
- <%- if current_user.id == page.locked_by -%>
36
- <%= link_to(page.name, alchemy.edit_admin_page_path(page)) %> <small>(<%= page.locker.name %>)</small>
37
- <%= form_tag(alchemy.unlock_admin_page_path(page, :redirect_to => alchemy.admin_dashboard_url)) do %>
38
- <button class="icon_button small" title="<%= _t('explain_unlocking') %>">
39
- <%= render_icon('close small') %>
40
- </button>
41
- <% end %>
42
- <%- else -%>
43
- <%= page.name %> <small>(<%= page.locker_name %>)</small>
44
- <%- end -%>
45
- </li>
46
- <%- end -%>
47
- </ul>
48
- <%- end -%>
49
- </div>
50
- <%- reset_cycle('locked_pages') -%>
51
- <div class="widget">
52
- <h2><%= _t('Who else is online') %>:</h2>
53
- <%- if @online_users.blank? -%>
54
- <ul><li class="even"><%= _t('no users') %></li></ul>
55
- <%- else -%>
56
- <ul>
57
- <%- @online_users.each do |user| -%>
58
- <li class="<%= cycle('even', 'odd') %>"><%= user.name %> <small>(<%= user.human_role_name %>)</small></li>
59
- <%- end -%>
60
- </ul>
61
- <%- end -%>
19
+ <h1>
20
+ <% if @first_time -%>
21
+ <%= _t('Welcome, %{name}', :name => current_user.firstname.blank? ? current_user.login : current_user.firstname) %>
22
+ <% else -%>
23
+ <%= _t('Welcome back, %{name}', :name => current_user.firstname.blank? ? current_user.login : current_user.firstname) %>
24
+ <% end -%>
25
+ </h1>
26
+ <p>
27
+ <small><%= _t('Your last login was on %{time}', :time => l(current_user.last_sign_in_at)) unless current_user.last_sign_in_at.blank? %></small>
28
+ </p>
29
+ <div class="column left">
30
+ <%= render 'locked_pages' %>
31
+ <%= render 'recent_pages' %>
62
32
  </div>
63
- </div>
64
- <div id="sideboard">
65
- <%= image_tag("alchemy/alchemy-logo.png", :style => "width: 240px; height: 70px") %>
66
- <p><%= _t("Version") %>: <%= @alchemy_version %></p>
67
- <div class="sideboard_body" style="display: none">
68
- <p><%= _t('Alchemy is open software and itself uses open software and free resources:') %></p>
69
- <ul>
70
- <li>
71
- <a href="http://rubyonrails.org" target="_blank">RubyOnRails</a>
72
- </li>
73
- <li>
74
- <a href="http://jquery.com" target="_blank">jQuery Javascript Library</a>
75
- </li>
76
- <li>
77
- <a href="http://jqueryui.com" target="_blank">jQuery UI Javascript GUI Library</a>
78
- </li>
79
- <li>
80
- <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE - Javascript WYSIWYG Editor</a>
81
- </li>
82
- <li>
83
- <a href="http://swfupload.org" target="_blank">SWFUpload</a>
84
- </li>
85
- <li>
86
- <a href="http://p.yusukekamiyamane.com" target="_blank">Fugue Icons by Yusuke Kamiyamane</a>
87
- </li>
88
- </ul>
33
+ <div class="column right">
34
+ <%= render 'users' %>
35
+ <% if multi_site? %>
36
+ <%= render 'sites' %>
37
+ <% end %>
89
38
  </div>
90
39
  </div>
91
-
92
- <%= content_for :javascripts do %>
93
- <script type="text/javascript" charset="utf-8">
94
- (function($) {
95
-
96
- $('#sideboard img:first-child').click(function(e) {
97
- e.preventDefault();
98
- $('#sideboard .sideboard_body').toggle();
99
- }).bind('mouseover', function() {
100
- $(this).css({cursor: 'pointer'});
101
- });
102
-
103
- })(jQuery);
104
- </script>
105
- <% end %>